Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 9 Jan 2011 16:32:44 +0000 (UTC)
From:      Nathan Whitehorn <nwhitehorn@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r217198 - in user/nwhitehorn/bsdinstall: partedit scripts
Message-ID:  <201101091632.p09GWi37049139@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: nwhitehorn
Date: Sun Jan  9 16:32:44 2011
New Revision: 217198
URL: http://svn.freebsd.org/changeset/base/217198

Log:
  Make it slightly more difficult to shoot yourself in the foot by not
  specifying mountpoints, not making a / partition, or having a partition
  mounted deep in the hierarchy.
  
  Suggested by:	Michael Ross <michael dot ross at gmx dot net>

Modified:
  user/nwhitehorn/bsdinstall/partedit/gpart_ops.c
  user/nwhitehorn/bsdinstall/partedit/partedit.c
  user/nwhitehorn/bsdinstall/scripts/mount

Modified: user/nwhitehorn/bsdinstall/partedit/gpart_ops.c
==============================================================================
--- user/nwhitehorn/bsdinstall/partedit/gpart_ops.c	Sun Jan  9 15:59:52 2011	(r217197)
+++ user/nwhitehorn/bsdinstall/partedit/gpart_ops.c	Sun Jan  9 16:32:44 2011	(r217198)
@@ -268,7 +268,7 @@ gpart_edit(struct gprovider *pp)
 		    "megabytes or gigabytes.", FALSE},
 		{0, "Mountpoint:", 11, 2, 0, FALSE, "", 11, 2, 12, 15, 0,
 		    FALSE, "Path at which to mount this partition (leave blank "
-		    "for swap)", FALSE},
+		    "for swap, set to / for root filesystem)", FALSE},
 		{0, "Label:", 7, 3, 0, FALSE, "", 11, 3, 12, 15, 0, FALSE,
 		    "Partition name. Not all partition schemes support this.",
 		    FALSE},
@@ -514,8 +514,8 @@ gpart_create(struct gprovider *pp)
 		    FALSE, "Partition size. Append K, M, G for kilobytes, "
 		    "megabytes or gigabytes.", FALSE},
 		{0, "Mountpoint:", 11, 2, 0, FALSE, "", 11, 2, 12, 15, 0,
-		    FALSE, "Path at which to mount this partition (leave blank "
-		    "for swap)", FALSE},
+		    FALSE, "Path at which to mount partition (blank for "
+		    "swap, / for root filesystem)", FALSE},
 		{0, "Label:", 7, 3, 0, FALSE, "", 11, 3, 12, 15, 0, FALSE,
 		    "Partition name. Not all partition schemes support this.",
 		    FALSE},
@@ -575,13 +575,12 @@ gpart_create(struct gprovider *pp)
 				intmax_t partend;
 				partend = strtoimax(gc->lg_val, NULL, 0);
 				if (partend > firstfree)
-					firstfree = partend;
+					firstfree = partend + 1;
 			}
 		}
 	}
 
 	/* Compute beginning of new partition and maximum available space */
-	firstfree++;
 	if (stripe > 0 && (firstfree*sector % stripe) != 0) 
 		firstfree += (stripe - ((firstfree*sector) % stripe)) / sector;
 
@@ -628,6 +627,21 @@ addpartform:
 		size = MIN((intmax_t)(bytes/sector), maxsize);
 	}
 
+	/* Warn if no mountpoint set */
+	if (strcmp(items[0].text, "freebsd-ufs") == 0 &&
+	    items[2].text[0] != '/') {
+		dialog_vars.defaultno = TRUE;
+		choice = dialog_yesno("Warning",
+		    "This partition does not have a valid mountpoint "
+		    "(for the partition from which you intend to boot the "
+		    "operating system, the mountpoint should be /). Are you "
+		    "sure you want to continue?"
+		, 0, 0);
+		dialog_vars.defaultno = FALSE;
+		if (choice == 1) /* cancel */
+			goto addpartform;
+	}
+
 	/* If this is the root partition, check that this scheme is bootable */
 	if (strcmp(items[2].text, "/") == 0 && !is_scheme_bootable(scheme)) {
 		char message[512];

Modified: user/nwhitehorn/bsdinstall/partedit/partedit.c
==============================================================================
--- user/nwhitehorn/bsdinstall/partedit/partedit.c	Sun Jan  9 15:59:52 2011	(r217197)
+++ user/nwhitehorn/bsdinstall/partedit/partedit.c	Sun Jan  9 16:32:44 2011	(r217198)
@@ -19,6 +19,7 @@ static void add_geom_children(struct gge
     struct partedit_item **items, int *nitems);
 static void init_fstab_metadata(void);
 static void get_mount_points(struct partedit_item *items, int nitems);
+static int validate_setup(void);
 
 int
 main(void) {
@@ -84,7 +85,7 @@ main(void) {
 		}
 
 		error = 0;
-		if (op == 4) { /* Finished */
+		if (op == 4 && validate_setup()) { /* Finished */
 			dialog_vars.extra_button = TRUE;
 			dialog_vars.extra_label = "Don't Save";
 			dialog_vars.ok_label = "Save";
@@ -159,7 +160,30 @@ delete_part_metadata(const char *name) {
 		}
 	}
 }
-	
+
+static int
+validate_setup(void)
+{
+	struct partition_metadata *md;
+	int root_found = FALSE;
+
+	TAILQ_FOREACH(md, &part_metadata, metadata) {
+		if (md->fstab != NULL && strcmp(md->fstab->fs_file, "/") == 0)
+			root_found = TRUE;
+
+		/* XXX: Check for duplicate mountpoints */
+	}
+
+	if (!root_found) {
+		dialog_msgbox("Error", "No root partition was found. "
+		    "The root FreeBSD partition must have a mountpoint of '/'.",
+		0, 0, TRUE);
+		return (FALSE);
+	}
+
+	return (TRUE);
+}
+
 static int
 apply_changes(struct gmesh *mesh)
 {

Modified: user/nwhitehorn/bsdinstall/scripts/mount
==============================================================================
--- user/nwhitehorn/bsdinstall/scripts/mount	Sun Jan  9 15:59:52 2011	(r217197)
+++ user/nwhitehorn/bsdinstall/scripts/mount	Sun Jan  9 16:32:44 2011	(r217198)
@@ -15,7 +15,7 @@ cat $PATH_FSTAB | awk -v BSDINSTALL_CHRO
 FILESYSTEMS=`cat $TMP_FSTAB | awk '/^[^#].*/ {if ($2 ~ "^/.*") printf("%s\n", $2);}' | sort -t /`
 
 for i in $FILESYSTEMS; do
-	mkdir $i 2>/dev/null
+	mkdir -p $i 2>/dev/null
 	MNTERROR=`mount -F $TMP_FSTAB $i 2>&1`
 	if [ $? -ne 0 ]; then
 		cdialog --backtitle "FreeBSD Installer" --title "Error" \



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