From 81c1c5a8731555d6f1d67b3d834356619907e3a1 Mon Sep 17 00:00:00 2001 From: ianmdlvl Date: Sun, 18 Feb 2007 13:02:59 +0000 Subject: [PATCH] @@ -1,3 +1,12 @@ +chiark-utils (4.1.14) unstable; urgency=low + + * summer has new -x (one file system) option. + * summer produces better output with -f when scandir fails. + * chiark-backup's snaprsync uses summer -x. + * chiark-backup suggests chiark-cprogs with summer with -x. + + -- Ian Jackson Sun, 18 Feb 2007 13:02:21 +0000 + chiark-utils (4.1.13) unstable; urgency=low * New `nosnap' no-op snap kind. --- backup/snaprsync | 2 +- cprogs/summer.c | 37 +++++++++++++++++++++++++------------ debian/changelog | 9 +++++++++ debian/control | 1 + 4 files changed, 36 insertions(+), 13 deletions(-) diff --git a/backup/snaprsync b/backup/snaprsync index e31c27b..5cd567a 100755 --- a/backup/snaprsync +++ b/backup/snaprsync @@ -65,7 +65,7 @@ ssh $rhost "$sshpfx ls -d $rvardir" test -d $localarea || x mkdir $localarea ournode=`uname -n` rsumsfile=for-$ournode.sums -summer="$summer -ACDbtqf" +summer="$summer -ACDbtqfx" td=/dev/enoent rc=12 diff --git a/cprogs/summer.c b/cprogs/summer.c index ada0f14..5e85111 100644 --- a/cprogs/summer.c +++ b/cprogs/summer.c @@ -27,10 +27,12 @@ #define CSUMXL 32 static int quiet=0, hidectime=0, hideatime=0; -static int hidedirsize=0, hidelinkmtime=0; +static int hidedirsize=0, hidelinkmtime=0, onefilesystem=0; static int filenamefieldsep=' '; static FILE *errfile; +#define nodeflag_fsvalid 1u + static void malloc_fail(void) { perror("summer: alloc failed"); exit(12); } static void *mmalloc(size_t sz) { @@ -156,14 +158,14 @@ static int hardlink_compar(const void *av, const void *bv) { return b->dev - a->dev; } -static void recurse(const char *path); +static void recurse(const char *path, unsigned nodeflags, dev_t fs); -static void node(const char *path) { +static void node(const char *path, unsigned nodeflags, dev_t fs) { char linktarg[MAXFN+1]; struct hardlink *foundhl; const struct stat *stab; struct stat stabuf; - int r; + int r, mountpoint=0; r= lstat(path, &stabuf); stab= r ? 0 : &stabuf; @@ -185,15 +187,22 @@ static void node(const char *path) { } } + if (stab) { + if ((nodeflags & nodeflag_fsvalid) && stab->st_dev != fs) + mountpoint= 1; + fs= stab->st_dev; + nodeflags |= nodeflag_fsvalid; + } + if (!stab) problem_e(path,CSUMXL,"inaccessible"); else if (foundhl) csum_str("hardlink"); else if (S_ISREG(stab->st_mode)) csum_file(path); - else if (S_ISDIR(stab->st_mode)) csum_str("dir"); else if (S_ISCHR(stab->st_mode)) csum_dev('c',stab); else if (S_ISBLK(stab->st_mode)) csum_dev('b',stab); else if (S_ISFIFO(stab->st_mode)) csum_str("pipe"); else if (S_ISLNK(stab->st_mode)) csum_str("symlink"); else if (S_ISSOCK(stab->st_mode)) csum_str("sock"); + else if (S_ISDIR(stab->st_mode)) csum_str(mountpoint ? "mountpoint" : "dir"); else problem(path,CSUMXL,"badobj: 0x%lx", (unsigned long)stab->st_mode); if (stab && S_ISLNK(stab->st_mode)) { @@ -256,14 +265,14 @@ static void node(const char *path) { if (ferror(stdout)) { perror("summer: stdout"); exit(12); } - if (stab && S_ISDIR(stab->st_mode)) - recurse(path); + if (stab && S_ISDIR(stab->st_mode) && !(mountpoint && onefilesystem)) + recurse(path, nodeflags, fs); } static void process(const char *startpoint) { if (!quiet) fprintf(stderr,"summer: processing: %s\n",startpoint); - node(startpoint); + node(startpoint, 0,0); tdestroy(hardlinks,free); hardlinks= 0; } @@ -287,7 +296,7 @@ static int recurse_compar(const void *av, const void *bv) { return strcmp((*a)->d_name, (*b)->d_name); } -static void recurse(const char *path_or_buf) { +static void recurse(const char *path_or_buf, unsigned nodeflags, dev_t fs) { static char *buf; static int buf_allocd; @@ -312,13 +321,14 @@ static void recurse(const char *path_or_buf) { buf[pathl]= '/'; pathl++; if (nentries < 0) { - strcpy(buf+pathl,"\\?"); errno= esave; - problem_e(buf,-1,"scandir failed"); + buf[pathl]= 0; errno= esave; + problem_e(buf,CSUMXL+72,"scandir failed"); + fn_escaped(stdout,buf); putchar('\n'); return; } for (i=0, de=namelist; id_name); - node(buf); + node(buf, nodeflags, fs); free(*de); } free(namelist); @@ -369,6 +379,9 @@ int main(int argc, const char *const *argv) { case 'b': hidelinkmtime= 1; break; + case 'x': + onefilesystem= 1; + break; case 'C': hidectime= 1; break; diff --git a/debian/changelog b/debian/changelog index 7ac8f1a..675104a 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,12 @@ +chiark-utils (4.1.14) unstable; urgency=low + + * summer has new -x (one file system) option. + * summer produces better output with -f when scandir fails. + * chiark-backup's snaprsync uses summer -x. + * chiark-backup suggests chiark-cprogs with summer with -x. + + -- Ian Jackson Sun, 18 Feb 2007 13:02:21 +0000 + chiark-utils (4.1.13) unstable; urgency=low * New `nosnap' no-op snap kind. diff --git a/debian/control b/debian/control index 1434f5c..b80c83b 100644 --- a/debian/control +++ b/debian/control @@ -11,6 +11,7 @@ Section: utils Priority: extra Architecture: all Depends: chiark-rwbuffer +Suggests: chiark-cprogs (>= 4.1.14) Description: backup system for small systems and networks These are the backup scripts used by chiark.greenend.org.uk and other systems belonging to the Sinister Greenend Organisation. Features: -- 2.30.2