Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 7 Aug 2010 11:15:33 +0000 (UTC)
From:      Bruce Cran <brucec@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org
Subject:   svn commit: r211002 - stable/7/usr.sbin/sysinstall
Message-ID:  <201008071115.o77BFXi4022275@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: brucec
Date: Sat Aug  7 11:15:32 2010
New Revision: 211002
URL: http://svn.freebsd.org/changeset/base/211002

Log:
  MFC r209235, r210381 (bug fix for r209235):
  
  * Allow partial MB/GB values to be entered in the slice and label editor.
  * Don't strdup the name when calling deviceRegister because the string is
  copied within new_device.
  * Use a subtype of 165, not 3, when creating a slice in noninteractive
  mode.
  
  PR: bin/135333
  PR: bin/66350
  Approved by: rrs (mentor)

Modified:
  stable/7/usr.sbin/sysinstall/devices.c
  stable/7/usr.sbin/sysinstall/disks.c
  stable/7/usr.sbin/sysinstall/label.c
Directory Properties:
  stable/7/usr.sbin/sysinstall/   (props changed)

Modified: stable/7/usr.sbin/sysinstall/devices.c
==============================================================================
--- stable/7/usr.sbin/sysinstall/devices.c	Sat Aug  7 11:13:50 2010	(r211001)
+++ stable/7/usr.sbin/sysinstall/devices.c	Sat Aug  7 11:15:32 2010	(r211002)
@@ -281,6 +281,8 @@ deviceGetAll(void)
 
     msgNotify("Probing devices, please wait (this can take a while)...");
     /* First go for the network interfaces.  Stolen shamelessly from ifconfig! */
+    memset(&ifc, 0, sizeof(ifc));
+    memset(buffer, 0, INTERFACE_MAX * sizeof(struct ifreq));
     ifc.ifc_len = sizeof(buffer);
     ifc.ifc_buf = buffer;
 
@@ -357,7 +359,7 @@ skipif:
 
 		    if (fd >= 0) close(fd);
 		    snprintf(n, sizeof n, device_names[i].name, j);
-		    deviceRegister(strdup(n), device_names[i].description, strdup(try),
+		    deviceRegister(n, device_names[i].description, strdup(try),
 					 DEVICE_TYPE_CDROM, TRUE, mediaInitCDROM, mediaGetCDROM,
 					 mediaShutdownCDROM, NULL);
 		    if (isDebug())
@@ -390,7 +392,7 @@ skipif:
 
 		    close(fd);
 		    snprintf(n, sizeof n, device_names[i].name, j);
-		    deviceRegister(strdup(n), device_names[i].description, strdup(try),
+		    deviceRegister(n, device_names[i].description, strdup(try),
 				   DEVICE_TYPE_FLOPPY, TRUE, mediaInitFloppy, mediaGetFloppy,
 				   mediaShutdownFloppy, NULL);
 		    if (isDebug())

Modified: stable/7/usr.sbin/sysinstall/disks.c
==============================================================================
--- stable/7/usr.sbin/sysinstall/disks.c	Sat Aug  7 11:13:50 2010	(r211001)
+++ stable/7/usr.sbin/sysinstall/disks.c	Sat Aug  7 11:15:32 2010	(r211002)
@@ -455,6 +455,7 @@ diskPartition(Device *dev)
 	    else {
 		char *val, tmp[20], name[16], *cp;
 		daddr_t size;
+		long double dsize;
 		int subtype;
 		chunk_e partitiontype;
 #ifdef PC98
@@ -469,11 +470,20 @@ diskPartition(Device *dev)
 		snprintf(tmp, 20, "%jd", (intmax_t)chunk_info[current_chunk]->size);
 		val = msgGetInput(tmp, "Please specify the size for new FreeBSD slice in blocks\n"
 				  "or append a trailing `M' for megabytes (e.g. 20M).");
-		if (val && (size = strtoimax(val, &cp, 0)) > 0) {
+		if (val && (dsize = strtold(val, &cp)) > 0 && dsize < UINT32_MAX) {
 		    if (*cp && toupper(*cp) == 'M')
-			size *= ONE_MEG;
+			size = (daddr_t) (dsize * ONE_MEG);
 		    else if (*cp && toupper(*cp) == 'G')
-			size *= ONE_GIG;
+			size = (daddr_t) (dsize * ONE_GIG);
+		    else
+			size = (daddr_t) dsize;
+
+		    if (size < ONE_MEG) {
+			msgConfirm("The minimum slice size is 1MB");
+			break;
+		    }
+
+
 		    sprintf(tmp, "%d", SUBTYPE_FREEBSD);
 		    val = msgGetInput(tmp, "Enter type of partition to create:\n\n"
 			"Pressing Enter will choose the default, a native FreeBSD\n"
@@ -927,7 +937,8 @@ diskPartitionNonInteractive(Device *dev)
 {
     char *cp;
     int i, all_disk = 0;
-    daddr_t sz;
+    daddr_t size;
+    long double dsize;
 #ifdef PC98
     u_char *bootipl;
     size_t bootipl_size;
@@ -971,7 +982,7 @@ diskPartitionNonInteractive(Device *dev)
 		/* If a chunk is at least 10MB in size, use it. */
 		if (chunk_info[i]->type == unused && chunk_info[i]->size > (10 * ONE_MEG)) {
 		    Create_Chunk(d, chunk_info[i]->offset, chunk_info[i]->size,
-				 freebsd, 3,
+				 freebsd, SUBTYPE_FREEBSD,
 				 (chunk_info[i]->flags & CHUNK_ALIGN),
 				 "FreeBSD");
 		    variable_set2(DISK_PARTITIONED, "yes", 0);
@@ -995,16 +1006,19 @@ diskPartitionNonInteractive(Device *dev)
 
 	    All_FreeBSD(d, all_disk = TRUE);
 	}
-	else if ((sz = strtoimax(cp, &cp, 0))) {
-	    /* Look for sz bytes free */
+	else if ((dsize = strtold(cp, &cp))) {
 	    if (*cp && toupper(*cp) == 'M')
-		sz *= ONE_MEG;
+		size *= (daddr_t) (dsize * ONE_MEG);
 	    else if (*cp && toupper(*cp) == 'G')
-		sz *= ONE_GIG;
+		size = (daddr_t) (dsize * ONE_GIG);
+	    else
+		size = (daddr_t) dsize;
+
+	    /* Look for size bytes free */
 	    for (i = 0; chunk_info[i]; i++) {
 		/* If a chunk is at least sz MB, use it. */
-		if (chunk_info[i]->type == unused && chunk_info[i]->size >= sz) {
-		    Create_Chunk(d, chunk_info[i]->offset, sz, freebsd, 3,
+		if (chunk_info[i]->type == unused && chunk_info[i]->size >= size) {
+		    Create_Chunk(d, chunk_info[i]->offset, size, freebsd, SUBTYPE_FREEBSD,
 				 (chunk_info[i]->flags & CHUNK_ALIGN),
 				 "FreeBSD");
 		    variable_set2(DISK_PARTITIONED, "yes", 0);
@@ -1013,7 +1027,7 @@ diskPartitionNonInteractive(Device *dev)
 	    }
 	    if (!chunk_info[i]) {
 		    msgConfirm("Unable to find %jd free blocks on this disk!",
-			(intmax_t)sz);
+			(intmax_t)size);
 		return;
 	    }
 	}

Modified: stable/7/usr.sbin/sysinstall/label.c
==============================================================================
--- stable/7/usr.sbin/sysinstall/label.c	Sat Aug  7 11:13:50 2010	(r211001)
+++ stable/7/usr.sbin/sysinstall/label.c	Sat Aug  7 11:15:32 2010	(r211002)
@@ -999,6 +999,7 @@ diskLabel(Device *dev)
 	    else {
 		char *val;
 		daddr_t size;
+		long double dsize;
 		struct chunk *tmp;
 		char osize[80];
 		u_long flags = 0;
@@ -1019,22 +1020,27 @@ diskLabel(Device *dev)
 #endif
 				  "%jd blocks (%jdMB) are free.",
 				  (intmax_t)sz, (intmax_t)sz / ONE_MEG);
-		if (!val || (size = strtoimax(val, &cp, 0)) <= 0) {
+		if (!val || (dsize = strtold(val, &cp)) <= 0) {
 		    clear_wins();
 		    break;
 		}
 
 		if (*cp) {
 		    if (toupper(*cp) == 'M')
-			size *= ONE_MEG;
+			size = (daddr_t) (dsize * ONE_MEG);
 		    else if (toupper(*cp) == 'G')
-			size *= ONE_GIG;
+			size = (daddr_t) (dsize * ONE_GIG);
 #ifndef __ia64__
 		    else if (toupper(*cp) == 'C')
-			size *= (label_chunk_info[here].c->disk->bios_hd * label_chunk_info[here].c->disk->bios_sect);
+			size = (daddr_t) dsize * (label_chunk_info[here].c->disk->bios_hd * label_chunk_info[here].c->disk->bios_sect);
 #endif
+		    else
+			size = (daddr_t) dsize;
+		} else {
+			size = (daddr_t) dsize;
 		}
-		if (size <= FS_MIN_SIZE) {
+
+		if (size < FS_MIN_SIZE) {
 		    msgConfirm("The minimum filesystem size is %dMB", FS_MIN_SIZE / ONE_MEG);
 		    clear_wins();
 		    break;



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