On Thu, Jul 10, 2014 at 04:28:49PM +0200, Alexander Hall wrote: > On 07/09/14 23:44, Alexander Hall wrote: > > > While looking at this, I noticed we don't support specifying the duid > > for the device to dump. Thinking a bit more, I'm forming a different > > approach for this. Hold on. > > Hm, the "different approach" was left out because of the messy argument > parsing. Bah. > > Anyway, I worked on your diff a bit more: > > - keep having -U and -u separate (as discussed) > - use Uflag instead of duidflag > - bail out if the duid is all 0. > - allow specifying the drive to dump by <duid>.<part> on the > command line. Subject to race conditions, but no more than the > current code. > > Do you think this makes sense, and can you please test if this works > for you? > > Anyone else testing this, please note that you need to install > dumprestore.h into /usr/include/protocols/ before building.
I was looking for something like this. Manly to make dump -W work with DUIDs. Would be nice if it would not introduce a new flag but I think I can live with that if the rest works. > /Alexander > > > Index: include/protocols/dumprestore.h > =================================================================== > RCS file: /cvs/src/include/protocols/dumprestore.h,v > retrieving revision 1.9 > diff -u -p -r1.9 dumprestore.h > --- include/protocols/dumprestore.h 15 Dec 2009 13:11:42 -0000 1.9 > +++ include/protocols/dumprestore.h 10 Jul 2014 13:41:16 -0000 > @@ -152,8 +152,8 @@ union u_spcl { > #define DR_NEWHEADER 0x0001 /* new format tape header */ > #define DR_NEWINODEFMT 0x0002 /* new format inodes on tape */ > > -#define DUMPOUTFMT "%-16s %c %s" /* for printf */ > +#define DUMPOUTFMT "%-18s %c %s" /* for printf */ > /* name, level, ctime(date) */ > -#define DUMPINFMT "%16s %c %[^\n]\n" /* inverse for scanf */ > +#define DUMPINFMT "%18s %c %[^\n]\n" /* inverse for scanf */ > > #endif /* !_PROTOCOLS_DUMPRESTORE_H_ */ > Index: sbin/dump/Makefile > =================================================================== > RCS file: /cvs/src/sbin/dump/Makefile,v > retrieving revision 1.11 > diff -u -p -r1.11 Makefile > --- sbin/dump/Makefile 6 Jan 2013 21:59:28 -0000 1.11 > +++ sbin/dump/Makefile 10 Jul 2014 13:41:16 -0000 > @@ -14,6 +14,8 @@ > PROG= dump > LINKS= ${BINDIR}/dump ${BINDIR}/rdump > CFLAGS+=-DRDUMP > +DPADD+= ${LIBUTIL} > +LDADD+= -lutil > SRCS= itime.c main.c optr.c dumprmt.c tape.c traverse.c > MAN= dump.8 > MLINKS+=dump.8 rdump.8 > Index: sbin/dump/dump.8 > =================================================================== > RCS file: /cvs/src/sbin/dump/dump.8,v > retrieving revision 1.46 > diff -u -p -r1.46 dump.8 > --- sbin/dump/dump.8 30 May 2014 20:48:21 -0000 1.46 > +++ sbin/dump/dump.8 10 Jul 2014 13:41:16 -0000 > @@ -40,7 +40,7 @@ > .Sh SYNOPSIS > .Nm dump > .Bk -words > -.Op Fl 0123456789acnSuWw > +.Op Fl 0123456789acnSUuWw > .Op Fl B Ar records > .Op Fl b Ar blocksize > .Op Fl d Ar density > @@ -229,6 +229,13 @@ The > flag is mutually exclusive from the > .Fl u > flag. > +.It Fl U > +Use the > +.Xr disklabel 8 > +UID instead of the device name when updating > +.Pa /etc/dumpdates > +and when searching for the date of the latest > +lower-level dump. > .It Fl u > Update the file > .Pa /etc/dumpdates > Index: sbin/dump/dump.h > =================================================================== > RCS file: /cvs/src/sbin/dump/dump.h,v > retrieving revision 1.20 > diff -u -p -r1.20 dump.h > --- sbin/dump/dump.h 13 Jun 2014 20:43:06 -0000 1.20 > +++ sbin/dump/dump.h 10 Jul 2014 13:41:16 -0000 > @@ -56,9 +56,11 @@ char *disk; /* name of the disk file */ > char *tape; /* name of the tape file */ > char *dumpdates; /* name of the file containing dump date information*/ > char *temp; /* name of the file for doing rewrite of dumpdates */ > +char *duid; /* duid of the disk being dumped */ > char lastlevel; /* dump level of previous dump */ > char level; /* dump level of this dump */ > int uflag; /* update flag */ > +int Uflag; /* use duids in dumpdates flag */ > int diskfd; /* disk file descriptor */ > int tapefd; /* tape file descriptor */ > int pipeout; /* true => output to standard output */ > Index: sbin/dump/itime.c > =================================================================== > RCS file: /cvs/src/sbin/dump/itime.c,v > retrieving revision 1.17 > diff -u -p -r1.17 itime.c > --- sbin/dump/itime.c 27 Oct 2009 23:59:32 -0000 1.17 > +++ sbin/dump/itime.c 10 Jul 2014 13:41:16 -0000 > @@ -124,7 +124,7 @@ getdumptime(void) > int i; > char *fname; > > - fname = disk; > + fname = Uflag ? duid : disk; > #ifdef FDEBUG > msg("Looking for name %s in dumpdates = %s for level = %c\n", > fname, dumpdates, level); > @@ -164,7 +164,7 @@ putdumptime(void) > quit("cannot rewrite %s: %s\n", dumpdates, strerror(errno)); > fd = fileno(df); > (void) flock(fd, LOCK_EX); > - fname = disk; > + fname = Uflag ? duid : disk; > free((char *)ddatev); > ddatev = 0; > nddates = 0; > Index: sbin/dump/main.c > =================================================================== > RCS file: /cvs/src/sbin/dump/main.c,v > retrieving revision 1.51 > diff -u -p -r1.51 main.c > --- sbin/dump/main.c 13 Jun 2014 20:43:06 -0000 1.51 > +++ sbin/dump/main.c 10 Jul 2014 13:41:16 -0000 > @@ -54,6 +54,7 @@ > #include <string.h> > #include <time.h> > #include <unistd.h> > +#include <util.h> > > #include "dump.h" > #include "pathnames.h" > @@ -94,8 +95,9 @@ main(int argc, char *argv[]) > ino_t maxino; > time_t t; > int dirlist; > - char *toplevel, *str, *mount_point = NULL; > + char *toplevel, *str, *mount_point = NULL, *realpath; > int just_estimate = 0; > + u_int64_t zero_uid = 0; > > spcl.c_date = (int64_t)time(NULL); > > @@ -112,7 +114,7 @@ main(int argc, char *argv[]) > usage(); > > obsolete(&argc, &argv); > - while ((ch = getopt(argc, argv, "0123456789aB:b:cd:f:h:ns:ST:uWw")) != > -1) > + while ((ch = getopt(argc, argv, "0123456789aB:b:cd:f:h:ns:ST:UuWw")) != > -1) > switch (ch) { > /* dump level */ > case '0': case '1': case '2': case '3': case '4': > @@ -180,6 +182,10 @@ main(int argc, char *argv[]) > lastlevel = '?'; > break; > > + case 'U': > + Uflag = 1; /* use duids */ > + break; > + > case 'u': /* update /etc/dumpdates */ > uflag = 1; > break; > @@ -213,6 +219,16 @@ main(int argc, char *argv[]) > for (i = 0; i < argc; i++) { > struct stat sb; > > + /* Convert potential duid into a device name */ > + if ((diskfd = opendev(argv[i], O_RDONLY | O_NOFOLLOW, 0, > + &realpath)) >= 0) { > + argv[i] = strdup(realpath); > + if (argv[i] == NULL) { > + msg("Cannot malloc realpath\n"); > + exit(X_STARTUP); > + } > + (void)close(diskfd); > + } > if (lstat(argv[i], &sb) == -1) { > msg("Cannot lstat %s: %s\n", argv[i], strerror(errno)); > exit(X_STARTUP); > @@ -370,6 +386,26 @@ main(int argc, char *argv[]) > (void)gethostname(spcl.c_host, sizeof(spcl.c_host)); > spcl.c_level = level - '0'; > spcl.c_type = TS_TAPE; > + > + if ((diskfd = open(disk, O_RDONLY)) < 0) { > + msg("Cannot open %s\n", disk); > + exit(X_STARTUP); > + } > + if (ioctl(diskfd, DIOCGDINFO, (char *)&lab) < 0) > + err(1, "ioctl (DIOCGDINFO)"); > + if (!Uflag) > + ; > + else if (memcmp(lab.d_uid, &zero_uid, sizeof(lab.d_uid)) == 0) { > + msg("Cannot find DUID of disk %s\n", disk); > + exit(X_STARTUP); > + } else if (asprintf(&duid, > + "%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx.%c", > + lab.d_uid[0], lab.d_uid[1], lab.d_uid[2], lab.d_uid[3], > + lab.d_uid[4], lab.d_uid[5], lab.d_uid[6], lab.d_uid[7], > + disk[strlen(disk)-1]) == -1) { > + msg("Cannot malloc duid\n"); > + exit(X_STARTUP); > + } else { fprintf(stderr, "duid: %s\n", duid); } > if (!Tflag) > getdumptime(); /* /etc/dumpdates snarfed */ > > @@ -387,10 +423,6 @@ main(int argc, char *argv[]) > else > msgtail("to %s\n", tape); > > - if ((diskfd = open(disk, O_RDONLY)) < 0) { > - msg("Cannot open %s\n", disk); > - exit(X_STARTUP); > - } > if (ioctl(diskfd, DIOCGPDINFO, (char *)&lab) < 0) > err(1, "ioctl (DIOCGPDINFO)"); > sync(); > -- :wq Claudio