On Sun, Apr 14, 2019 at 08:05:21PM +0100, Rafael Neves wrote:
> On Mon, Apr 08, 2019 at 12:35:41AM +0100, Rafael Neves wrote:
> > Hi tech@,
> >
> > When I had to change a HD between machines I figured out that -P option
> > of mount_mfs(8) does not work with DUIDs:
> >
> > # mount_mfs -P ca7552589896b01e.d swap /mnt
> > mount_mfs: cannot stat ca7552589896b01e.d: No such file or directory
> >
> > mount_mfs(8) already allows a DUID as the `special` argument, it is not
> > documented though. The patch bellow allow using -P with a DUID as block
> > device.
> >
> > Important:
> > I used the same approach used in the code (pointer swap) to resolve DUID
> > to device using opendev(3). But after the patch there will be two
> > opendev(3) calls with non-NULL realpath, and as manpage states the
> > stored path is overwritten by subsequent calls.
> >
> > It took some time of code reading and rereading until I convinced myself
> > that there is no problem in this *specific* situation.
> >
> > However, I think that should be safier to use malloc(size = PATH_MAX) +
> > strlcpy() on `pop` and `special`. That way, code refactoring doesn't to
> > care about the relative position of the opendev(3) calls.
> >
> > What do you think? Comments?
> >
> [snip]
>
> Here is a revised patch that uses malloc(3)+strlcpy(3) idiom, and
> document that newfs(8) accepts DUID as `special` and as an argument
> of -P option.
>
> [snip]
>
ping?
Here follows a updated patch, that removes a not used the declaration
that sneaked in the previous patch, and includes the lastest version
of newfs(8) manpage.
Regards,
Rafael
Index: sbin/newfs/newfs.8
===================================================================
RCS file: /cvs/src/sbin/newfs/newfs.8,v
retrieving revision 1.75
diff -u -p -r1.75 newfs.8
--- sbin/newfs/newfs.8 23 Apr 2019 18:13:11 -0000 1.75
+++ sbin/newfs/newfs.8 4 May 2019 19:24:40 -0000
@@ -88,8 +88,10 @@ The
.Ar special
file should be a raw device,
for example
-.Pa /dev/rsd0a ;
-if a relative path like
+.Pa /dev/rsd0a ,
+or a
+.Xr disklabel 8
+UID (DUID); if a relative path like
.Pa sd0a
is specified,
the corresponding raw device is used.
@@ -293,7 +295,7 @@ is a directory, populate the created mfs
contents of the directory.
If
.Ar file
-is a block device, populate the created mfs file system with the
+is a block device or a DUID, populate the created mfs file system with the
contents of the FFS file system contained on the device.
.El
.Pp
Index: sbin/newfs/newfs.c
===================================================================
RCS file: /cvs/src/sbin/newfs/newfs.c,v
retrieving revision 1.111
diff -u -p -r1.111 newfs.c
--- sbin/newfs/newfs.c 25 Nov 2018 17:12:10 -0000 1.111
+++ sbin/newfs/newfs.c 4 May 2019 19:24:40 -0000
@@ -174,7 +174,7 @@ main(int argc, char *argv[])
struct stat st;
struct statfs *mp;
struct rlimit rl;
- int fsi = -1, oflagset = 0, fso, len, n, maxpartitions;
+ int fsi = -1, oflagset = 0, fso, fd, len, n, maxpartitions;
char *cp = NULL, *s1, *s2, *special, *opstring, *realdev;
#ifdef MFS
char mountfromname[BUFSIZ];
@@ -382,7 +382,10 @@ main(int argc, char *argv[])
fso = opendev(special, O_WRONLY, 0, &realdev);
if (fso < 0)
fatal("%s: %s", special, strerror(errno));
- special = realdev;
+
+ if ((special = malloc(PATH_MAX)) == NULL)
+ fatal("cannot allocate memory");
+ strlcpy(special, realdev, PATH_MAX);
/* Bail if target special is mounted */
n = getmntinfo(&mp, MNT_NOWAIT);
@@ -526,6 +529,17 @@ havelabel:
args.export_info.ex_flags = MNT_EXRDONLY;
if (mntflags & MNT_NOPERM)
mntflags |= MNT_NODEV | MNT_NOEXEC;
+
+ if (pop != NULL && isduid(pop, 0)) {
+ fd = opendev(pop, O_RDONLY, OPENDEV_BLCK, &realdev);
+ if (fd < 0)
+ err(1, "could not open %s", pop);
+ close(fd);
+
+ if ((pop = malloc(PATH_MAX)) == NULL)
+ fatal("cannot allocate memory");
+ strlcpy(pop, realdev, PATH_MAX);
+ }
switch (pid = fork()) {
case -1: