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

Reply via email to