diff options
Diffstat (limited to 'src/package.c')
-rw-r--r-- | src/package.c | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/src/package.c b/src/package.c index 1375370..0c26fef 100644 --- a/src/package.c +++ b/src/package.c @@ -73,14 +73,14 @@ static ssize_t package_write(struct package *p, void *d, size_t l) { return -1; } -static int copy_deflate(struct package *p, int sfd, size_t l) { +static int copy_deflate(struct package *p, int sfd, off_t l) { assert(0); return 0; } -static int copy_inflate(struct package *p, int dfd, size_t l) { +static int copy_inflate(struct package *p, int dfd, off_t l) { assert(0); @@ -147,12 +147,14 @@ static void append_item(struct package *p, struct package_item *i) { p->items = p->last = i; } -#define X(i) (((i)<<24)|(((i)<<8)&0x0F00)|(((i)>>8)&0x00F0)|((i)>>24)) +#define X32(i) (((i)<<24)|(((i)<<8)&0x00FF0000)|(((i)>>8)&0x0000FF00)|((i)>>24)) +#define X64(i) (X32((i)>>32)|X32((i)>>32)) static int read_item(struct package *p) { char name[PACKAGE_ITEMNAMELEN+1]; char path[PATH_MAX] = ""; - uint32_t size; + off_t size; + uint64_t l; ssize_t r; int fd = -1; struct package_item *i; @@ -173,7 +175,7 @@ static int read_item(struct package *p) { goto fail; } - if ((r = package_read(p, &size, 4) != 4)) { + if ((r = package_read(p, &l, 8) != 8)) { if (r >= 0) fprintf(stderr, "Short read\n"); else @@ -183,8 +185,10 @@ static int read_item(struct package *p) { } if (p->x_endianess) - size = X(size); + l = X64(l); + size = (off_t) l; + snprintf(path, sizeof(path), "%s/%i", p->base, p->count++); if ((fd = open(path, O_RDWR|O_CREAT|O_EXCL, 0666)) < 0) { /* RDWR for mmap compatibility */ @@ -225,7 +229,8 @@ static int write_item(struct package *p, struct package_item *i) { char name[PACKAGE_ITEMNAMELEN+1]; ssize_t r; int fd = -1; - uint32_t size; + off_t size; + uint64_t l; if ((fd = open(i->path, O_RDONLY)) < 0) { if (errno == ENOENT) @@ -235,8 +240,9 @@ static int write_item(struct package *p, struct package_item *i) { goto fail; } - if ((size = filesize(fd)) < 0) + if ((size = filesize(fd)) == (off_t) -1) return -1; + memset(name, 0, sizeof(name)); strncpy(name, i->name, PACKAGE_ITEMNAMELEN); @@ -250,7 +256,8 @@ static int write_item(struct package *p, struct package_item *i) { goto fail; } - if ((r = package_write(p, &size, 4) != 4)) { + l = (uint64_t) size; + if ((r = package_write(p, &l, 8) != 8)) { if (r >= 0) fprintf(stderr, "Short write\n"); else @@ -327,11 +334,11 @@ struct package* package_open(const char *fn, int force) { if (id == PACKAGE_FILEID) p->x_endianess = 0; - else if (id == X(PACKAGE_FILEID)) + else if (id == X32(PACKAGE_FILEID)) p->x_endianess = 1; else if (id == PACKAGE_FILEIDCOMPRESSED) p->x_endianess = !(p->compressed = 1); - else if (id == X(PACKAGE_FILEIDCOMPRESSED)) + else if (id == X32(PACKAGE_FILEIDCOMPRESSED)) p->x_endianess = p->compressed = 1; else { fprintf(stderr, "%s is not a syrep snapshot or patch\n", fn); @@ -359,8 +366,11 @@ static int load_complete(struct package *p) { if (p->read_fd < 0) return 0; - while ((r = read_item(p)) > 0); - + while ((r = read_item(p)) > 0) + rotdash(); + + rotdash_hide(); + return r; } @@ -401,6 +411,8 @@ int package_save(struct package *p, const char *fn) { if (write_item(p, i) < 0) goto finish; + + rotdash(); } r = 0; @@ -415,6 +427,8 @@ finish: if (r < 0 && fn) unlink(fn); + rotdash_hide(); + return r; } |