summaryrefslogtreecommitdiffstats
path: root/usr.sbin
diff options
context:
space:
mode:
authorbrucec <brucec@FreeBSD.org>2010-06-16 15:40:13 +0000
committerbrucec <brucec@FreeBSD.org>2010-06-16 15:40:13 +0000
commit2f90e1d7fcc2224c3b8450ec20a8baf426500919 (patch)
tree0c4340ac2b478dfae256f3cb95e737252c2e545d /usr.sbin
parent0df344c42a61f9606dffa8573cb075f48ae549fa (diff)
downloadFreeBSD-src-2f90e1d7fcc2224c3b8450ec20a8baf426500919.zip
FreeBSD-src-2f90e1d7fcc2224c3b8450ec20a8baf426500919.tar.gz
* 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
Diffstat (limited to 'usr.sbin')
-rw-r--r--usr.sbin/sysinstall/devices.c8
-rw-r--r--usr.sbin/sysinstall/disks.c38
-rw-r--r--usr.sbin/sysinstall/label.c13
3 files changed, 39 insertions, 20 deletions
diff --git a/usr.sbin/sysinstall/devices.c b/usr.sbin/sysinstall/devices.c
index 8cf1fb3..640b6da 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 @@ 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())
@@ -405,7 +407,7 @@ skipif:
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 dca6945..4cc7848 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 08cd3df..c5c06ea 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;
OpenPOWER on IntegriCloud