proposed bsdlabel patch

From: Luigi Rizzo <rizzo_at_icir.org>
Date: Mon, 29 Mar 2004 16:39:26 -0800
if there are no strong objections, I'd like to commit
the following minor patch to bsdlabel (and associated bsdlabel.8
changes) to implement a '-f' option which enables bsdlabel to
work on an image file too.

With this, and ports/sysutils/makefs, we will be able to
build a bootable image entirely without root privileges,
which should be of some interests for a number of applications

	cheers
	luigi

--- bsdlabel.c	Mon Mar 15 23:10:34 2004
+++ /usr/src/sbin/bsdlabel/bsdlabel.c	Tue Mar 30 00:18:18 2004
_at__at_ -139,7 +139,7 _at__at_
 
 
 static int	disable_write;   /* set to disable writing to disk label */
-
+static int	is_file;	/* work on a file (abs. pathname), "-f" opt. */
 int
 main(int argc, char *argv[])
 {
_at__at_ -147,7 +147,7 _at__at_
 	int ch, error = 0;
 	char const *name = 0;
 
-	while ((ch = getopt(argc, argv, "ABb:em:nRrs:w")) != -1)
+	while ((ch = getopt(argc, argv, "ABb:efm:nRrs:w")) != -1)
 		switch (ch) {
 			case 'A':
 				allfields = 1;
_at__at_ -158,6 +158,9 _at__at_
 			case 'b':
 				xxboot = optarg;
 				break;
+			case 'f':
+				is_file=1;
+				break;
 			case 'm':
 				if (!strcmp(optarg, "i386") ||
 				    !strcmp(optarg, "amd64") ||
_at__at_ -214,6 +217,8 _at__at_
 
 	/* Figure out the names of the thing we're working on */
 	if (argv[0][0] != '/') {
+		if (is_file)
+			errx(1, "-f requires an absolute pathname");
 		dkname = argv[0];
 		asprintf(&specname, "%s%s", _PATH_DEV, argv[0]);
 	} else {
_at__at_ -446,6 +441,10 _at__at_
 	f = open(specname, O_RDONLY);
 	if (f < 0)
 		err(1, specname);
+	if (is_file) {
+		secsize = DEV_BSIZE;
+		mediasize = lseek(f, (off_t)0, SEEK_END);
+	} else
 	/* New world order */
 	if ((ioctl(f, DIOCGMEDIASIZE, &mediasize) != 0) ||
 	    (ioctl(f, DIOCGSECTORSIZE, &secsize) != 0)) {
_at__at_ -1329,6 +1328,10 _at__at_
 		return (NULL);
 	}
 
+	if (is_file) {
+		secsize = DEV_BSIZE;
+		mediasize = lseek(f, (off_t)0, SEEK_END);
+	} else
 	/* New world order */
 	if ((ioctl(f, DIOCGMEDIASIZE, &mediasize) != 0) ||
 	    (ioctl(f, DIOCGSECTORSIZE, &secsize) != 0)) {
Received on Mon Mar 29 2004 - 14:39:27 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:37:49 UTC