From 2f90e1d7fcc2224c3b8450ec20a8baf426500919 Mon Sep 17 00:00:00 2001 From: brucec Date: Wed, 16 Jun 2010 15:40:13 +0000 Subject: [PATCH] * Allow partial MB/GB values to be entered in the slice and label editors. * 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) MFC after: 1 month --- usr.sbin/sysinstall/devices.c | 8 +++++--- usr.sbin/sysinstall/disks.c | 38 ++++++++++++++++++++++++----------- usr.sbin/sysinstall/label.c | 13 +++++++----- 3 files changed, 39 insertions(+), 20 deletions(-) diff --git a/usr.sbin/sysinstall/devices.c b/usr.sbin/sysinstall/devices.c index 8cf1fb30c493..640b6da625a7 100644 --- a/usr.sbin/sysinstall/devices.c +++ b/usr.sbin/sysinstall/devices.c @@ -295,6 +295,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; @@ -371,7 +373,7 @@ deviceGetAll(void) 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 @@ deviceGetAll(void) 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()) @@ -405,7 +407,7 @@ deviceGetAll(void) close(fd); snprintf(n, sizeof(n), device_names[i].name, j); - deviceRegister(strdup(n), device_names[i].description, + deviceRegister(n, device_names[i].description, strdup(try), DEVICE_TYPE_USB, TRUE, mediaInitUSB, mediaGetUSB, mediaShutdownUSB, NULL); diff --git a/usr.sbin/sysinstall/disks.c b/usr.sbin/sysinstall/disks.c index dca6945bbf64..4cc78481e2a6 100644 --- a/usr.sbin/sysinstall/disks.c +++ b/usr.sbin/sysinstall/disks.c @@ -479,6 +479,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 @@ -493,11 +494,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" @@ -920,7 +930,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; @@ -964,7 +975,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); @@ -988,16 +999,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); @@ -1006,7 +1020,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; } } diff --git a/usr.sbin/sysinstall/label.c b/usr.sbin/sysinstall/label.c index 08cd3dfe5e57..c5c06ea7cad3 100644 --- a/usr.sbin/sysinstall/label.c +++ b/usr.sbin/sysinstall/label.c @@ -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,24 @@ 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; } - 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;