* 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
This commit is contained in:
brucec 2010-06-16 15:40:13 +00:00
parent 0df344c42a
commit 2f90e1d7fc
3 changed files with 39 additions and 20 deletions

View File

@ -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);

View File

@ -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;
}
}

View File

@ -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;