From 08a430bdff026b26b096c4e882e09b41adcf00f0 Mon Sep 17 00:00:00 2001 From: Dong Xie Date: Thu, 25 Oct 2012 15:07:04 +0100 Subject: [PATCH] Fix bgzip.exe and bcftools.exe handling large files and stdin/stdout --- bcftools/index.c | 6 +++--- bcftools/main.c | 4 ++-- bgzip.c | 13 ++++++++----- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/bcftools/index.c b/bcftools/index.c index 1b4907a..eede0bb 100644 --- a/bcftools/index.c +++ b/bcftools/index.c @@ -206,7 +206,7 @@ static void download_from_remote(const char *url) static char *get_local_version(const char *fn) { - struct stat sbuf; + struct __stat64 sbuf; char *fnidx = (char*)calloc(strlen(fn) + 5, 1); strcat(strcpy(fnidx, fn), ".bci"); if ((strstr(fnidx, "ftp://") == fnidx || strstr(fnidx, "http://") == fnidx)) { @@ -215,7 +215,7 @@ static char *get_local_version(const char *fn) for (p = fnidx + l - 1; p >= fnidx; --p) if (*p == '/') break; url = fnidx; fnidx = strdup(p + 1); - if (stat(fnidx, &sbuf) == 0) { + if (_stat64(fnidx, &sbuf) == 0) { free(url); return fnidx; } @@ -223,7 +223,7 @@ static char *get_local_version(const char *fn) download_from_remote(url); free(url); } - if (stat(fnidx, &sbuf) == 0) return fnidx; + if (_stat64(fnidx, &sbuf) == 0) return fnidx; free(fnidx); return 0; } diff --git a/bcftools/main.c b/bcftools/main.c index f9496c4..849acfa 100644 --- a/bcftools/main.c +++ b/bcftools/main.c @@ -24,13 +24,13 @@ int bcf_cat(int n, char * const *fn) bcf_t *in; bcf_hdr_t *h; off_t end; - struct stat s; + struct __stat64 s; in = bcf_open(fn[i], "r"); h = bcf_hdr_read(in); if (i == 0) bcf_hdr_write(out, h); bcf_hdr_destroy(h); #ifdef _USE_KNETFILE - fstat(knet_fileno(in->fp->x.fpr), &s); + _fstat64(knet_fileno(in->fp->x.fpr), &s); end = s.st_size - 28; while (knet_tell(in->fp->x.fpr) < end) { int size = knet_tell(in->fp->x.fpr) + BUF_SIZE < end? BUF_SIZE : end - knet_tell(in->fp->x.fpr); diff --git a/bgzip.c b/bgzip.c index 1df8d07..6d21b18 100644 --- a/bgzip.c +++ b/bgzip.c @@ -87,6 +87,9 @@ int main(int argc, char **argv) long start, end, size; _set_fmode(O_BINARY); //dong code, verify + _setmode(_fileno(stdout), O_BINARY); + _setmode(_fileno(stdin), O_BINARY); + compress = 1; pstdout = 0; start = 0; size = -1; end = -1; is_forced = 0; while((c = getopt(argc, argv, "cdhfb:s:")) >= 0){ switch(c){ @@ -104,13 +107,13 @@ int main(int argc, char **argv) return 1; } if (compress == 1) { - struct stat sbuf; + struct __stat64 sbuf; int f_src = _fileno(stdin); int f_dst = _fileno(stdout); if ( argc>optind ) { - if ( stat(argv[optind],&sbuf)<0 ) + if ( _stat64(argv[optind],&sbuf)<0 ) { fprintf(stderr, "[bgzip] %s: %s\n", strerror(errno), argv[optind]); return 1; @@ -122,7 +125,7 @@ int main(int argc, char **argv) } if (pstdout) - f_dst = _fileno(stdout); + f_dst = _fileno(stdout); //redundant code, dong else { char *name = malloc(strlen(argv[optind]) + 5); @@ -147,14 +150,14 @@ int main(int argc, char **argv) _close(f_src); return 0; } else { - struct stat sbuf; + struct __stat64 sbuf; int f_dst; if ( argc>optind ) { char *name; int len; - if ( stat(argv[optind],&sbuf)<0 ) + if ( _stat64(argv[optind],&sbuf)<0 ) { fprintf(stderr, "[bgzip] %s: %s\n", strerror(errno), argv[optind]); return 1;