X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=filestore%2Fserver.c;h=0e2ed4bd71016cb4beeb9876f09fb3fe53cd5707;hb=b9f7906b9eee10ea9e7eef3b4ff943319d5cf5d6;hp=6bdc60f03361dd207fb2f3486076ca32ec648264;hpb=c5521806064224d3275d7a54ff95d329905804d7;p=bluesky.git diff --git a/filestore/server.c b/filestore/server.c index 6bdc60f..0e2ed4b 100644 --- a/filestore/server.c +++ b/filestore/server.c @@ -136,12 +136,24 @@ void cmd_get(int fd, char *path, size_t start, ssize_t len) return; } - size_t filelen = statbuf.st_size; - sprintf(buf, "%zd\n", filelen); + size_t datalen = statbuf.st_size; + if (start > 0) { + if (start >= datalen) { + datalen = 0; + } else { + lseek(file, start, SEEK_SET); + datalen -= start; + } + } + if (len > 0 && len < datalen) { + datalen = len; + } + + sprintf(buf, "%zd\n", datalen); write_data(fd, buf, strlen(buf)); - while (filelen > 0) { - size_t needed = filelen > sizeof(buf) ? sizeof(buf) : filelen; + while (datalen > 0) { + size_t needed = datalen > sizeof(buf) ? sizeof(buf) : datalen; ssize_t bytes = read(file, buf, needed); if (bytes < 0 && errno == EINTR) continue; @@ -152,7 +164,7 @@ void cmd_get(int fd, char *path, size_t start, ssize_t len) bytes = needed; } write_data(fd, buf, bytes); - filelen -= bytes; + datalen -= bytes; } close(file);