I could not find this commited or further discussed. Therefore: ping? Bye, Marcus
ccut...@csail.mit.edu (Cody Cutler), 2013.11.29 (Fri) 20:32 (CET): > j...@sing.id.au (Joel Sing) - Thu, Nov 28, 2013 at 03:16:20AM +1100 > > From a quick glance, you should be able to use opendev(3) to open the disk > > device (rather than using open), in which case you'll get DUID handling for > > free. This also avoids the TOCTOU issues associated with attempting to map > > a > > DUID back to a name. Even if this is not possible, then it would be > > preferable to use opendev(3) to get the realname (as is done in fsck(8) > > from > > memory), rather than the hand rolled version below. > > thanks joel. round two is inline below. > > Index: Makefile > =================================================================== > RCS file: /cvs/src/sbin/dump/Makefile,v > retrieving revision 1.11 > diff -p -u -r1.11 Makefile > --- Makefile 6 Jan 2013 21:59:28 -0000 1.11 > +++ Makefile 29 Nov 2013 19:26:23 -0000 > @@ -12,6 +12,8 @@ > # TDEBUG trace out the process forking > > PROG= dump > +LDADD= -lutil > +DPADD= ${LIBUTIL} > LINKS= ${BINDIR}/dump ${BINDIR}/rdump > CFLAGS+=-DRDUMP > SRCS= itime.c main.c optr.c dumprmt.c tape.c traverse.c > Index: dump.h > =================================================================== > RCS file: /cvs/src/sbin/dump/dump.h,v > retrieving revision 1.17 > diff -p -u -r1.17 dump.h > --- dump.h 11 Jun 2013 16:42:04 -0000 1.17 > +++ dump.h 29 Nov 2013 19:26:23 -0000 > @@ -86,6 +86,7 @@ int tp_bshift; /* log2(TP_BSIZE) */ > /* operator interface functions */ > void broadcast(char *message); > time_t do_stats(void); > +char *duidtorawname(char *duid, char *buf, size_t s); > void lastdump(int arg); /* int should be char */ > void msg(const char *fmt, ...) > __attribute__((__format__ (printf, 1, 2))); > Index: main.c > =================================================================== > RCS file: /cvs/src/sbin/dump/main.c,v > retrieving revision 1.46 > diff -p -u -r1.46 main.c > --- main.c 16 Apr 2013 18:17:39 -0000 1.46 > +++ main.c 29 Nov 2013 19:26:23 -0000 > @@ -51,6 +51,7 @@ > #include <string.h> > #include <time.h> > #include <unistd.h> > +#include <util.h> > > #include "dump.h" > #include "pathnames.h" > @@ -204,7 +205,9 @@ main(int argc, char *argv[]) > for (i = 0; i < argc; i++) { > struct stat sb; > > - if (lstat(argv[i], &sb) == -1) { > + if (isduid(argv[i], 0)) > + break; > + else if (lstat(argv[i], &sb) == -1) { > msg("Cannot lstat %s: %s\n", argv[i], strerror(errno)); > exit(X_STARTUP); > } > @@ -341,7 +344,8 @@ main(int argc, char *argv[]) > } > } else if ((dt = fstabsearch(disk)) != NULL) { > /* in fstab? */ > - disk = rawname(dt->fs_spec); > + if (!isduid(disk, 0)) > + disk = rawname(dt->fs_spec); > mount_point = dt->fs_file; > (void)strlcpy(spcl.c_dev, dt->fs_spec, sizeof(spcl.c_dev)); > if (dirlist != 0) { > @@ -378,7 +382,7 @@ main(int argc, char *argv[]) > else > msgtail("to %s\n", tape); > > - if ((diskfd = open(disk, O_RDONLY)) < 0) { > + if ((diskfd = opendev(disk, O_RDONLY, 0, NULL)) < 0) { > msg("Cannot open %s\n", disk); > exit(X_STARTUP); > } > @@ -605,16 +609,39 @@ sig(int signo) > } > > char * > +duidtorawname(char *duid, char *buf, size_t s) > +{ > + char *rp; > + int fd; > + > + if (s) > + buf[0] = '\0'; > + > + if ((fd = opendev(duid, O_RDONLY, 0, &rp)) < 0) > + return NULL; > + > + close(fd); > + strlcpy(buf, rp, s); > + > + return buf; > +} > + > +char * > rawname(char *cp) > { > static char rawbuf[MAXPATHLEN]; > - char *dp = strrchr(cp, '/'); > - > - if (dp == NULL) > - return (NULL); > - *dp = '\0'; > - (void)snprintf(rawbuf, sizeof(rawbuf), "%s/r%s", cp, dp + 1); > - *dp = '/'; > + char *dp; > + > + if (isduid(cp, 0)) > + return duidtorawname(cp, rawbuf, sizeof(rawbuf)); > + else { > + dp = strrchr(cp, '/'); > + if (dp == NULL) > + return (NULL); > + *dp = '\0'; > + (void)snprintf(rawbuf, sizeof(rawbuf), "%s/r%s", cp, dp + 1); > + *dp = '/'; > + } > return (rawbuf); > } > > Index: optr.c > =================================================================== > RCS file: /cvs/src/sbin/dump/optr.c,v > retrieving revision 1.34 > diff -p -u -r1.34 optr.c > --- optr.c 12 Nov 2013 04:59:02 -0000 1.34 > +++ optr.c 29 Nov 2013 19:26:23 -0000 > @@ -47,6 +47,7 @@ > #include <tzfile.h> > #include <unistd.h> > #include <utmp.h> > +#include <util.h> > > #include "dump.h" > #include "pathnames.h" > @@ -335,17 +336,23 @@ getfstab(void) > struct fstab * > fstabsearch(char *key) > { > + char keyrn[MAXPATHLEN]; > struct pfstab *pf; > struct fstab *fs; > char *rn; > > + keyrn[0] = '\0'; > + if (isduid(key, 0)) > + duidtorawname(key, keyrn, sizeof(keyrn)); > + > for (pf = table; pf != NULL; pf = pf->pf_next) { > fs = pf->pf_fstab; > if (strcmp(fs->fs_file, key) == 0 || > strcmp(fs->fs_spec, key) == 0) > return (fs); > rn = rawname(fs->fs_spec); > - if (rn != NULL && strcmp(rn, key) == 0) > + if (rn != NULL && (strcmp(rn, key) == 0 || > + strcmp(rn, keyrn) == 0)) > return (fs); > if (key[0] != '/') { > if (*fs->fs_spec == '/' && > Index: tape.c > =================================================================== > RCS file: /cvs/src/sbin/dump/tape.c,v > retrieving revision 1.38 > diff -p -u -r1.38 tape.c > --- tape.c 12 Nov 2013 04:59:02 -0000 1.38 > +++ tape.c 29 Nov 2013 19:26:23 -0000 > @@ -803,7 +803,7 @@ doslave(int cmd, int slave_number) > * Need our own seek pointer. > */ > (void) close(diskfd); > - if ((diskfd = open(disk, O_RDONLY)) < 0) > + if ((diskfd = opendev(disk, O_RDONLY, 0, NULL)) < 0) > quit("slave couldn't reopen disk: %s\n", strerror(errno)); > > /*