From: Martin Str|mberg Message-Id: <200110202112.XAA19265@father.ludd.luth.se> Subject: Re: Resend: DJGPP and files > 2GB In-Reply-To: <3BC74CBE.EC9CBF9F@phekda.freeserve.co.uk> from Richard Dawe at "Oct 12, 2001 09:04:14 pm" To: djgpp-workers AT delorie DOT com Date: Sat, 20 Oct 2001 23:12:36 +0200 (MET DST) X-Mailer: ELM [version 2.4ME+ PL54 (25)] MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Reply-To: djgpp-workers AT delorie DOT com Errors-To: nobody AT delorie DOT com X-Mailing-List: djgpp-workers AT delorie DOT com X-Unsubscribes-To: listserv AT delorie DOT com Precedence: bulk According to Richard Dawe: > ---START bigseek.c--- > /* > * bigseek.c > * Try big relative seeks with DJGPP CVS (aka 2.04?) > * Written by Richard Dawe > */ > > #include > #include > #include > #include > #include > #include > > int > main (int argc, char *argv[]) > { > char *filename; > struct stat sbuf; > unsigned long sz; > ssize_t n; > char buf[4]; > off_t o; > int fd; > > /* 2GB + 100MB */ > const unsigned long big_offset = (1024UL * 1024UL * 1024UL * 2UL) > + (1024UL * 1024UL * 100UL); > > /* 2GB + 10MB */ > unsigned long big_offset2 = (1024UL * 1024UL * 1024UL * 2UL) > + (1024UL * 1024UL * 10UL); > > assert(big_offset2 < big_offset); > > if (argc < 2) { > fprintf(stderr, "Oi! Where's me file?\n"); > return(EXIT_FAILURE); > } > > /* Does the file exist? How big is it? */ > filename = argv[1]; > > if (stat(filename, &sbuf) < 0) { > perror(argv[0]); > return(EXIT_FAILURE); > } > > if (!S_ISREG(sbuf.st_mode)) { > fprintf(stderr, "%s is not a regular file!\n", filename); > return(EXIT_FAILURE); > } > > /* Check the file's bigger than 2GB. */ > sz = (unsigned long) sbuf.st_size; > > if (sz <= big_offset) { > fprintf(stderr, "%s is not bigger than %lu (%luMB)!\n", > filename, big_offset, big_offset / (1024UL * 1024UL)); > return(EXIT_FAILURE); > } > > /* Now open the file and try out some big relative seeks (> 2GB > movement). */ > fd = open(argv[1], O_RDONLY|O_BINARY); > > o = lseek(fd, big_offset, SEEK_SET); > printf("Offset %lu (desired = %lu)\n", (unsigned long) o, big_offset); > o = lseek(fd, big_offset2, SEEK_CUR); > printf("Offset %lu (desired = %lu)\n", (unsigned long) o, > big_offset + big_offset2); > > printf("big_offset - big_offset2 = %lu\n", big_offset - big_offset2); > printf("big_offset + big_offset2 = %lu\n", big_offset + big_offset2); > printf("(off_t) big_offset2 = %d\n", (off_t) big_offset2); > > /* Return to the start, seek to beyond 2GB, try a read. Then try > * a large (2GB - 1) backwards seek. */ > o = lseek(fd, 0, SEEK_SET); > printf("Offset %d\n", o); > o = lseek(fd, big_offset, SEEK_CUR); > printf("Offset %d\n", o); > > n = read(fd, buf, sizeof(buf)); > if (n < sizeof(buf)) { > fprintf(stderr, "Read at offset %d (aka %lu?) failed\n", > o, (unsigned long) o); > close(fd); > return(EXIT_FAILURE); > } else { > printf("Read at offset %d (aka %lu?) OK\n", o, (unsigned long) o); > } > o = lseek(fd, -sizeof(buf), SEEK_CUR); /* Return to pre-read position */ > > o = lseek(fd, -(off_t)((1024UL * 1024UL * 1024UL * 2UL) - 1UL), > SEEK_CUR); > printf("Offset %d\n", o); > > printf("big_offset - 2GB - 1 = %lu\n", > big_offset - ((1024UL * 1024UL * 1024UL * 2UL) - 1UL)); > > /* Done with file */ > close(fd); > > return(EXIT_SUCCESS); > } > ---END bigseek.c--- Here's the results: Offset 2252341248 (desired = 2252341248) Offset 115343360 (desired = 115343360) big_offset - big_offset2 = 94371840 big_offset + big_offset2 = 115343360 (off_t) big_offset2 = -2136997888 Offset 0 Offset -2042626048 Read at offset -2042626048 (aka 2252341248?) OK Offset 104857601 big_offset - 2GB - 1 = 104857601 Right, MartinS