Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 22 Feb 2001 04:56:15 +0100 (CET)
From:      Cyrille Lefevre <clefevre@poboxes.com>
To:        FreeBSD-gnats-submit@freebsd.org
Subject:   bin/25273: add fs type feature to vnconfig(8) to allow direct mount of iso images and co.
Message-ID:  <200102220356.f1M3uFh62808@gits.dyndns.org>

next in thread | raw e-mail | index | archive | help

>Number:         25273
>Category:       bin
>Synopsis:       add fs type feature to vnconfig(8) to allow direct mount of iso images and co.
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Wed Feb 21 20:00:07 PST 2001
>Closed-Date:
>Last-Modified:
>Originator:     Cyrille Lefevre
>Release:        FreeBSD 4.2-STABLE i386
>Organization:
ACME
>Environment:

FreeBSD gits 4.2-STABLE FreeBSD 4.2-STABLE #7: Tue Jan 23 07:33:34 CET 2001     root@gits:/disk2/4.x-stable/src/sys/compile/CUSTOM  i386

>Description:

	currently, it is not possible to mount an iso image
	in one pass using vnconfig such as :

	vnconfig -v -e vn0 /tmp/image.iso mountro=/mnt

	effectively, the -e option mount such image using the
	hard coded fs type which is ufs.

	so, to mount an iso image, you have to do the following
	statement :

	vnconfig -c vn0 /tmp/image.iso
	mount -t cd9660 vn0 /iso

	while it could be possible to do something like :

	vnconfig -v -e vn0 /tmp/image.iso mountro=/mnt type=cd9660

	or

	vnconfig -v -e vn0 /tmp/image.iso mountro=/mnt,cd9660

	using the first syntax, the ignore feature has precedence
	over the swap feature which has precedence over the mount*
	features.

	also, these patches correct two bugs in what_opt (-s none
	was a do nothing statement !) and config (the fclose is
	done too late and prevent the fs to be mounted).

>How-To-Repeat:

	already desbribed above.

>Fix:

	I provide two patches, the first one provides the first
	proposed syntax and the second one provides the second
	proposed syntax (the one I prefer).

----------==========---------- first patch ----------==========----------

Index: vnconfig.8
===================================================================
RCS file: /home/ncvs/src/usr.sbin/vnconfig/vnconfig.8,v
retrieving revision 1.14.2.4
diff -u -r1.14.2.4 vnconfig.8
--- vnconfig.8	2000/12/27 16:23:31	1.14.2.4
+++ vnconfig.8	2001/02/22 03:52:12
@@ -188,6 +188,12 @@
 .Xr mount 2 .
 .It Dv Pf mount= Pa mount_point
 Same as ``mountrw=''.
+.It Dv Pf type= Pa fstype
+Mounts the file system as type
+.Ar fstype .
+The type
+.Ar ufs
+is the default.
 .El
 .Pp
 A configuration file contains one line per device/file pair in the form:
@@ -217,6 +223,12 @@
 Configures
 .Pa vn0c
 and enables swapping on it.
+.Pp
+.Dl vnconfig -e vn0c myisoimage mountro=/iso type=cd9660
+.Pp
+Configures
+.Pa vn0c
+and read-only mounts an ISO-9660 image file.
 .Pp
 .Dl vnconfig -d vn0c myfilesystem mount=/mnt
 .Pp
Index: vnconfig.c
===================================================================
RCS file: /home/ncvs/src/usr.sbin/vnconfig/vnconfig.c,v
retrieving revision 1.13.2.4
diff -u -r1.13.2.4 vnconfig.c
--- vnconfig.c	2001/02/02 21:16:34	1.13.2.4
+++ vnconfig.c	2001/02/22 03:45:13
@@ -75,6 +75,7 @@
 	int	flags;
 	int	size;
 	char	*oarg;
+	char	*otype;
 } vndisks[MAXVNDISK];
 
 #define VN_CONFIG	0x01
@@ -222,8 +223,10 @@
 		vndisks[0].flags = flags;
 		vndisks[0].size = size;
 		vndisks[0].autolabel = autolabel;
-		if (optind < argc)
-			getoptions(&vndisks[0], argv[optind]);
+		vndisks[0].oarg = NULL;
+		vndisks[0].otype = "ufs";
+		while (optind < argc)
+			getoptions(&vndisks[0], argv[optind++]);
 		nvndisks = 1;
 	}
 	rv = 0;
@@ -242,8 +245,8 @@
 	if (!strcmp(str,"follow")) { *p |= VN_FOLLOW; return 0; }
 	if (!strcmp(str,"debug")) { *p |= VN_DEBUG; return 0; }
 	if (!strcmp(str,"io")) { *p |= VN_IO; return 0; }
-	if (!strcmp(str,"all")) { *p |= ~0; return 0; }
-	if (!strcmp(str,"none")) { *p |= 0; return 0; }
+	if (!strcmp(str,"all")) { *p = ~0; return 0; }
+	if (!strcmp(str,"none")) { *p = 0; return 0; }
 	return 1;
 }
 
@@ -251,7 +254,7 @@
 config(vnp)
 	struct vndisk *vnp;
 {
-	char *dev, *file, *oarg;
+	char *dev, *file, *oarg, *otype;
 	int flags;
 	struct vn_ioctl vnio;
 	register int rv;
@@ -272,6 +275,7 @@
 	file = vnp->file;
 	flags = vnp->flags;
 	oarg = vnp->oarg;
+	otype = vnp->otype;
 
 	if (flags & VN_IGNORE)
 		return(0);
@@ -436,6 +440,8 @@
 			printf("%s: flags now=%08lx\n",dev,l);
 	}
 
+	fclose(f);
+
 	/*
 	 * Enable special functions on the device
 	 */
@@ -446,22 +452,21 @@
 				warn("swapon");
 			else if (verbose)
 				printf("%s: swapping enabled\n", dev);
-		}
+		} else
 		if (flags & (VN_MOUNTRO|VN_MOUNTRW)) {
 			struct ufs_args args;
 			int mflags;
 
 			args.fspec = dev;
 			mflags = (flags & VN_MOUNTRO) ? MNT_RDONLY : 0;
-			rv = mount("ufs", oarg, mflags, &args);
+			rv = mount(otype, oarg, mflags, &args);
 			if (rv)
 				warn("mount");
 			else if (verbose)
-				printf("%s: mounted on %s\n", dev, oarg);
+				printf("%s: mounted on %s (%s)\n", dev, oarg, otype);
 		}
 	}
 /* done: */
-	fclose(f);
 	fflush(stdout);
 	return(rv < 0);
 }
@@ -509,15 +514,19 @@
 
 		if (*sp == '%' && strtol(sp + 1, NULL, 0) > 0) {
 			vndisks[ix].size = getsize(sp + 1);
+			vndisks[ix].file = NULL;
 		} else {
+			vndisks[ix].size = 0;
 			vndisks[ix].file = malloc(cp - sp);
 			strcpy(vndisks[ix].file, sp);
 		}
-
+		vndisks[ix].autolabel = NULL;
 		while (!EOL(*cp) && WHITE(*cp))
 			cp++;
 		vndisks[ix].flags = flags;
-		if (!EOL(*cp)) {
+		vndisks[ix].oarg = NULL;
+		vndisks[ix].otype = "ufs";
+		while (!EOL(*cp)) {
 			sp = cp;
 			while (!EOL(*cp) && !WHITE(*cp))
 				cp++;
@@ -536,6 +545,7 @@
 {
 	int flags = 0;
 	char *oarg = NULL;
+	char *otype = NULL;
 
 	if (strcmp(fstr, "swap") == 0)
 		flags |= VN_SWAP;
@@ -548,14 +558,18 @@
 	} else if (strncmp(fstr, "mountro=", 8) == 0) {
 		flags |= VN_MOUNTRO;
 		oarg = &fstr[8];
+	} else if (strncmp(fstr, "type=", 5) == 0) {
+		otype = &fstr[5];
 	} else if (strcmp(fstr, "ignore") == 0)
 		flags |= VN_IGNORE;
 	vnp->flags |= flags;
 	if (oarg) {
 		vnp->oarg = malloc(strlen(oarg) + 1);
 		strcpy(vnp->oarg, oarg);
-	} else
-		vnp->oarg = NULL;
+	} else if (otype) {
+		vnp->otype = malloc(strlen(otype) + 1);
+		strcpy(vnp->otype, otype);
+	}
 }
 
 char *
@@ -585,7 +599,7 @@
 {
 	fprintf(stderr, "%s\n%s\n%s\n",
 		"usage: vnconfig [-cdeguv] [-s option] [-r option] [-S value] special_file",
-		"                [regular_file] [feature]",
+		"                [regular_file] [features]",
 		"       vnconfig -a [-cdeguv] [-s option] [-r option] [-f config_file]");
 	exit(1);
 }

----------==========---------- second patch ----------==========----------

Index: vnconfig.8
===================================================================
RCS file: /home/ncvs/src/usr.sbin/vnconfig/vnconfig.8,v
retrieving revision 1.14.2.4
diff -u -r1.14.2.4 vnconfig.8
--- vnconfig.8	2000/12/27 16:23:31	1.14.2.4
+++ vnconfig.8	2001/02/22 03:42:17
@@ -176,14 +176,24 @@
 Swapping is enabled on the special file.
 See
 .Xr swapon 2 .
-.It Dv Pf mountro= Pa mount_point
+.It Dv Pf mountro= Pa mount_point[,fstype]
 The special file is mounted read-only on
-.Ar mount_point .
+.Ar mount_point
+using the file system type
+.Ar fstype
+if provided. The type
+.Ar ufs
+is the default.
 See
 .Xr mount 2 .
-.It Dv Pf mountrw= Pa mount_point
+.It Dv Pf mountrw= Pa mount_point[,fstype]
 The special file is mounted read-write on
-.Ar mount_point .
+.Ar mount_point
+using the file system type
+.Ar fstype
+if provided. The type
+.Ar ufs
+is the default.
 See
 .Xr mount 2 .
 .It Dv Pf mount= Pa mount_point
@@ -217,6 +227,12 @@
 Configures
 .Pa vn0c
 and enables swapping on it.
+.Pp
+.Dl vnconfig -e vn0c myisoimage mountro=/iso,cd9660
+.Pp
+Configures
+.Pa vn0c
+and read-only mounts an ISO-9660 image file.
 .Pp
 .Dl vnconfig -d vn0c myfilesystem mount=/mnt
 .Pp
Index: vnconfig.c
===================================================================
RCS file: /home/ncvs/src/usr.sbin/vnconfig/vnconfig.c,v
retrieving revision 1.13.2.4
diff -u -r1.13.2.4 vnconfig.c
--- vnconfig.c	2001/02/02 21:16:34	1.13.2.4
+++ vnconfig.c	2001/02/22 03:44:11
@@ -75,6 +75,7 @@
 	int	flags;
 	int	size;
 	char	*oarg;
+	char	*otype;
 } vndisks[MAXVNDISK];
 
 #define VN_CONFIG	0x01
@@ -222,6 +223,8 @@
 		vndisks[0].flags = flags;
 		vndisks[0].size = size;
 		vndisks[0].autolabel = autolabel;
+		vndisks[0].oarg = NULL;
+		vndisks[0].otype = "ufs";
 		if (optind < argc)
 			getoptions(&vndisks[0], argv[optind]);
 		nvndisks = 1;
@@ -242,8 +245,8 @@
 	if (!strcmp(str,"follow")) { *p |= VN_FOLLOW; return 0; }
 	if (!strcmp(str,"debug")) { *p |= VN_DEBUG; return 0; }
 	if (!strcmp(str,"io")) { *p |= VN_IO; return 0; }
-	if (!strcmp(str,"all")) { *p |= ~0; return 0; }
-	if (!strcmp(str,"none")) { *p |= 0; return 0; }
+	if (!strcmp(str,"all")) { *p = ~0; return 0; }
+	if (!strcmp(str,"none")) { *p = 0; return 0; }
 	return 1;
 }
 
@@ -251,7 +254,7 @@
 config(vnp)
 	struct vndisk *vnp;
 {
-	char *dev, *file, *oarg;
+	char *dev, *file, *oarg, *otype;
 	int flags;
 	struct vn_ioctl vnio;
 	register int rv;
@@ -272,6 +275,7 @@
 	file = vnp->file;
 	flags = vnp->flags;
 	oarg = vnp->oarg;
+	otype = vnp->otype;
 
 	if (flags & VN_IGNORE)
 		return(0);
@@ -436,6 +440,8 @@
 			printf("%s: flags now=%08lx\n",dev,l);
 	}
 
+	fclose(f);
+
 	/*
 	 * Enable special functions on the device
 	 */
@@ -453,15 +459,14 @@
 
 			args.fspec = dev;
 			mflags = (flags & VN_MOUNTRO) ? MNT_RDONLY : 0;
-			rv = mount("ufs", oarg, mflags, &args);
+			rv = mount(otype, oarg, mflags, &args);
 			if (rv)
 				warn("mount");
 			else if (verbose)
-				printf("%s: mounted on %s\n", dev, oarg);
+				printf("%s: mounted on %s (%s)\n", dev, oarg, otype);
 		}
 	}
 /* done: */
-	fclose(f);
 	fflush(stdout);
 	return(rv < 0);
 }
@@ -509,14 +514,18 @@
 
 		if (*sp == '%' && strtol(sp + 1, NULL, 0) > 0) {
 			vndisks[ix].size = getsize(sp + 1);
+			vndisks[ix].file = NULL;
 		} else {
+			vndisks[ix].size = 0;
 			vndisks[ix].file = malloc(cp - sp);
 			strcpy(vndisks[ix].file, sp);
 		}
-
+		vndisks[ix].autolabel = NULL;
 		while (!EOL(*cp) && WHITE(*cp))
 			cp++;
 		vndisks[ix].flags = flags;
+		vndisks[ix].oarg = NULL;
+		vndisks[ix].otype = "ufs";
 		if (!EOL(*cp)) {
 			sp = cp;
 			while (!EOL(*cp) && !WHITE(*cp))
@@ -536,6 +545,7 @@
 {
 	int flags = 0;
 	char *oarg = NULL;
+	char *otype = NULL;
 
 	if (strcmp(fstr, "swap") == 0)
 		flags |= VN_SWAP;
@@ -550,12 +560,18 @@
 		oarg = &fstr[8];
 	} else if (strcmp(fstr, "ignore") == 0)
 		flags |= VN_IGNORE;
+	if (flags & (VN_MOUNTRW|VN_MOUNTRO))
+		if (strtok(oarg, ","))
+			otype = strtok(NULL, ",");
 	vnp->flags |= flags;
 	if (oarg) {
 		vnp->oarg = malloc(strlen(oarg) + 1);
 		strcpy(vnp->oarg, oarg);
-	} else
-		vnp->oarg = NULL;
+	}
+	if (otype) {
+		vnp->otype = malloc(strlen(otype) + 1);
+		strcpy(vnp->otype, otype);
+	}
 }
 
 char *
>Release-Note:
>Audit-Trail:
>Unformatted:

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200102220356.f1M3uFh62808>