summaryrefslogtreecommitdiffstats
path: root/src/package.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/package.c')
-rw-r--r--src/package.c40
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;
}