From f0f2ed47e265ca01dea3b8a217afc8b45690fc5e Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Sun, 31 Aug 2003 14:34:25 +0000 Subject: resolv ed conbflict git-svn-id: file:///home/lennart/svn/public/syrep/trunk@17 07ea20a6-d2c5-0310-9e02-9ef735347d72 --- src/dbstruct.h | 14 -------------- src/diff.c | 5 ++++- src/list.c | 12 ++++++------ src/makepatch.c | 2 ++ src/package.c | 40 +++++++++++++++++++++++++++------------- src/syrep.c | 2 ++ src/update.c | 6 ++---- src/util.c | 43 ++++++++++++++++++++++++++++--------------- src/util.h | 4 ++-- 9 files changed, 73 insertions(+), 55 deletions(-) diff --git a/src/dbstruct.h b/src/dbstruct.h index 1b7a9be..2df2aed 100644 --- a/src/dbstruct.h +++ b/src/dbstruct.h @@ -26,16 +26,6 @@ struct syrep_meta { uint32_t last_seen; }; -/* struct syrep_namels { */ -/* uint32_t last_seen; */ -/* struct syrep_name name; */ -/* }; */ - -/* struct syrep_mdls { */ -/* uint32_t last_seen; */ -/* struct syrep_md md; */ -/* }; */ - struct syrep_timestamp { uint32_t t; }; @@ -55,8 +45,4 @@ struct syrep_version { * */ -/* - * syrep_namels :: syrep_md => namels_md - * syrep_mdls :: syrep_name => mdls_name - */ #endif diff --git a/src/diff.c b/src/diff.c index 54185b2..8338be9 100644 --- a/src/diff.c +++ b/src/diff.c @@ -81,7 +81,6 @@ static int foreach(DB *ddb, struct syrep_db_context *c1, struct syrep_db_context if ((md2_valid = get_current_md_by_name(c2, name, &md2)) < 0) return -1; - //fprintf(stderr, "FOREACH %i %i %s\n", md1_valid, md2_valid, name->path); if (md1_valid && md2_valid) { @@ -196,6 +195,8 @@ static int enumerate(DB *ddb, struct syrep_db_context *c1, struct syrep_db_conte fprintf(stderr, "foreach() failed\n"); goto finish; } + + rotdash(); } @@ -234,6 +235,8 @@ DB* make_diff(struct syrep_db_context *c1, struct syrep_db_context *c2) { if (enumerate(ddb, c2, c1) < 0) goto finish; + rotdash_hide(); + return ddb; finish: diff --git a/src/list.c b/src/list.c index 5f1e5e2..333a780 100644 --- a/src/list.c +++ b/src/list.c @@ -52,20 +52,20 @@ static int handle_file(struct syrep_db_context *c, const struct syrep_name *name fhex(md->digest, SYREP_DIGESTLENGTH, d); d[SYREP_DIGESTLENGTH*2] = 0; - fprintf(stderr, "%s %s%s", d, name->path, meta->last_seen == c->version ? "\t\t" : "\t(deleted)"); + printf("%s %s%s", d, name->path, meta->last_seen == c->version ? "\t\t" : "\t(deleted)"); } else - fprintf(stderr, "\t%s%s", name->path, meta->last_seen == c->version ? "\t\t" : "\t(deleted)"); + printf("\t%s%s", name->path, meta->last_seen == c->version ? "\t\t" : "\t(deleted)"); if (args.show_times_flag) - fprintf(stderr, "\t(first-seen: %u; last-seen: %u)\n", meta->first_seen, meta->last_seen); + printf( "\t(first-seen: %u; last-seen: %u)\n", meta->first_seen, meta->last_seen); else - fputc('\n', stderr); + fputc('\n', stdout); } else { char d[SYREP_DIGESTLENGTH*2+1]; fhex(md->digest, SYREP_DIGESTLENGTH, d); d[SYREP_DIGESTLENGTH*2] = 0; - fprintf(stderr, "\t%s", name->path); + printf("\t%s", name->path); } return 0; @@ -130,7 +130,7 @@ int list(struct syrep_db_context *c) { char d[SYREP_DIGESTLENGTH*2+1]; fhex(md->digest, SYREP_DIGESTLENGTH, d); d[SYREP_DIGESTLENGTH*2] = 0; - fprintf(stderr, "%s:\n", d); + printf("%s:\n", d); memcpy(&previous_md, md, sizeof(previous_md)); } diff --git a/src/makepatch.c b/src/makepatch.c index 01af65e..5ae5b29 100644 --- a/src/makepatch.c +++ b/src/makepatch.c @@ -59,6 +59,8 @@ static int cb(DB *ddb, struct syrep_name *name, struct diff_entry *de, void *p) fprintf(stderr, "Adding %s (%s) to patch.\n", name->path, d); + /*** MISSING: DO NOT ADD FILES ALREADY EXISTING BY MD5 ***/ + if (!package_get_item(cb_info->c1->package, d, 0)) if (package_add_file(cb_info->c1->package, d, path) < 0) return -1; 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; } diff --git a/src/syrep.c b/src/syrep.c index 03cf5d8..25d939d 100644 --- a/src/syrep.c +++ b/src/syrep.c @@ -464,6 +464,8 @@ static void free_args(void) { int main(int argc, char *argv[]) { struct sigaction sa; + fprintf(stderr, "Compiled with %i Bit off_t\n", sizeof(off_t)*8); + memset(&sa, 0, sizeof(sa)); sa.sa_handler = sigint; sigaction(SIGINT, &sa, NULL); diff --git a/src/update.c b/src/update.c index e0e7f9c..0c65d4c 100644 --- a/src/update.c +++ b/src/update.c @@ -149,8 +149,7 @@ static int iterate_dir(struct syrep_db_context *c, struct syrep_md_cache *cache, goto finish; } - if (args.progress_flag) - rotdash(); + rotdash(); snprintf(p, sizeof(p), "%s/%s", root, de->d_name); @@ -226,8 +225,7 @@ int update(struct syrep_db_context *c, struct syrep_md_cache *cache) { if (iterate_dir(c, cache, version, ".") < 0) return -1; - if (args.progress_flag) - rotdash_hide(); + rotdash_hide(); if (new_version(c, version, now) < 0) return -1; diff --git a/src/util.c b/src/util.c index 5040259..a7118ac 100644 --- a/src/util.c +++ b/src/util.c @@ -95,6 +95,9 @@ void rotdash(void) { static const char dashes[] = /* ".oOo"; */ "|/-\\"; const static char *d = dashes; + if (!args.progress_flag) + return; + if (stderr_tty < 0) stderr_tty = isatty(fileno(stderr)); @@ -108,6 +111,9 @@ void rotdash(void) { } void rotdash_hide(void) { + if (!args.progress_flag) + return; + if (stderr_tty < 0) stderr_tty = isatty(fileno(stderr)); @@ -156,24 +162,32 @@ int isdirectory(const char *path) { #ifdef USE_SENDFILE -static int copy_fd_sendfile(int sfd, int dfd, size_t l) { +#define MAX_SENDFILE_SIZE (1024*1024*1024) /* A gigabyte */ + +static int copy_fd_sendfile(int sfd, int dfd, off_t l) { off_t sfo, o; - ssize_t r; if ((sfo = lseek(sfd, 0, SEEK_CUR)) == (off_t) -1) o = 0; else o = sfo; - - if ((r = sendfile(dfd, sfd, &o, l)) != l) - return -1; - if (sfo != (off_t) -1) { - sfo += r; + while (l > 0) { + size_t m = l > MAX_SENDFILE_SIZE ? MAX_SENDFILE_SIZE : l; + ssize_t r; + + if ((r = sendfile(dfd, sfd, &o, m)) <= 0) + return -1; + + l -= r; - lseek(sfd, sfo, SEEK_SET); + if (sfo != (off_t) -1) + sfo += r; } + if (sfo != (off_t) -1) + lseek(sfd, sfo, SEEK_SET); + return 0; } @@ -185,7 +199,7 @@ off_t filesize(int fd) { if (fstat(fd, &st) < 0) { fprintf(stderr, "stat(): %s\n", strerror(errno)); - return -1; + return (off_t) -1; } return st.st_size; @@ -206,7 +220,7 @@ int expand_file(int fd, off_t l) { return 0; } -#define MMAPSIZE (100*1024*1024) +#define MMAPSIZE (100*1024*1024) /* 100MB */ #define BUFSIZE (32*1024) int copy_fd(int sfd, int dfd, off_t l) { @@ -229,7 +243,7 @@ int copy_fd(int sfd, int dfd, off_t l) { if (l > BUFSIZE) { - m = l < MMAPSIZE ? l : MMAPSIZE; + m = (size_t) (l < MMAPSIZE ? l : MMAPSIZE); if ((sfo = lseek(sfd, 0, SEEK_CUR)) != (off_t) -1) { off_t s; @@ -238,7 +252,7 @@ int copy_fd(int sfd, int dfd, off_t l) { return -1; if (s < sfo+l) { - fprintf(stderr, "File too short (%u vs. %lu %i)\n", s, sfo+l, l); + fprintf(stderr, "File too short\n"); return -1; } @@ -268,8 +282,7 @@ int copy_fd(int sfd, int dfd, off_t l) { while (l > 0) { off_t n; - - m = l > BUFSIZE ? BUFSIZE : l; + size_t m = l > BUFSIZE ? BUFSIZE : l; if ((n = loop_read(sfd, buf, m)) != m) { @@ -417,7 +430,7 @@ int copy_fd(int sfd, int dfd, off_t l) { int copy_file(const char *src, const char *dst, int c) { int sfd = -1, dfd = -1, r = -1; - size_t size; + off_t size; if ((sfd = open(src, O_RDONLY)) < 0) { fprintf(stderr, "open(\"%s\", O_RDONLY): %s\n", src, strerror(errno)); diff --git a/src/util.h b/src/util.h index 8b34022..b7fb571 100644 --- a/src/util.h +++ b/src/util.h @@ -57,7 +57,7 @@ int rm_rf(const char *root, int rec); ssize_t loop_read(int fd, void *d, size_t l); ssize_t loop_write(int fd, void *d, size_t l); -int expand_file(int fd, size_t l); -int filesize(int fd); +int expand_file(int fd, off_t l); +off_t filesize(int fd); #endif -- cgit