summaryrefslogtreecommitdiffstats
path: root/fdisk/fdisk.c
diff options
context:
space:
mode:
authorFrancesco Cosoleto2011-07-03 12:01:21 +0200
committerKarel Zak2011-07-11 12:01:42 +0200
commit365acc97654d33a01698ada9bf18fbbdce7d88cc (patch)
tree243cce58d7c6210a53a832028165dc25f4f8e73d /fdisk/fdisk.c
parentmount: fix typos in mount.8 (diff)
downloadkernel-qcow2-util-linux-365acc97654d33a01698ada9bf18fbbdce7d88cc.tar.gz
kernel-qcow2-util-linux-365acc97654d33a01698ada9bf18fbbdce7d88cc.tar.xz
kernel-qcow2-util-linux-365acc97654d33a01698ada9bf18fbbdce7d88cc.zip
fdisk: use a single variable for the current disklabel
Using a variable for each supported partition table type doesn't seem necessary. This fixes also a minor bug in switching from SGI label to SUN label: the expert menu isn't available as sgi_label variable remains set to true. Code a bit more clear as *_label names have similarity with names such as "sgilabel", "struct sun_label". Signed-off-by: Francesco Cosoleto <cosoleto@gmail.com>
Diffstat (limited to 'fdisk/fdisk.c')
-rw-r--r--fdisk/fdisk.c142
1 files changed, 70 insertions, 72 deletions
diff --git a/fdisk/fdisk.c b/fdisk/fdisk.c
index f62fd0f32..f6a2bc4d7 100644
--- a/fdisk/fdisk.c
+++ b/fdisk/fdisk.c
@@ -235,12 +235,8 @@ unsigned long grain = DEFAULT_SECTOR_SIZE,
alignment_offset;
int has_topology;
-#define dos_label (!sun_label && !sgi_label && !aix_label && !mac_label && !osf_label)
-int sun_label = 0; /* looking at sun disklabel */
-int sgi_label = 0; /* looking at sgi disklabel */
-int aix_label = 0; /* looking at aix disklabel */
-int osf_label = 0; /* looking at OSF/1 disklabel */
-int mac_label = 0; /* looking at mac disklabel */
+enum labeltype disklabel = DOS_LABEL; /* Current disklabel */
+
int possibly_osf_label = 0;
jmp_buf listingbuf;
@@ -379,7 +375,7 @@ is_dos_partition(int t) {
static void
menu(void) {
- if (sun_label) {
+ if (disklabel == SUN_LABEL) {
puts(_("Command action"));
puts(_(" a toggle a read only flag")); /* sun */
puts(_(" b edit bsd disklabel"));
@@ -398,7 +394,7 @@ menu(void) {
puts(_(" w write table to disk and exit"));
puts(_(" x extra functionality (experts only)"));
}
- else if (sgi_label) {
+ else if (disklabel == SGI_LABEL) {
puts(_("Command action"));
puts(_(" a select bootable partition")); /* sgi flavour */
puts(_(" b edit bootfile entry")); /* sgi */
@@ -416,7 +412,7 @@ menu(void) {
puts(_(" v verify the partition table"));
puts(_(" w write table to disk and exit"));
}
- else if (aix_label || mac_label) {
+ else if (disklabel == AIX_LABEL || disklabel == MAC_LABEL) {
puts(_("Command action"));
puts(_(" m print this menu"));
puts(_(" o create a new empty DOS partition table"));
@@ -446,7 +442,7 @@ menu(void) {
static void
xmenu(void) {
- if (sun_label) {
+ if (disklabel == SUN_LABEL) {
puts(_("Command action"));
puts(_(" a change number of alternate cylinders")); /*sun*/
puts(_(" c change number of cylinders"));
@@ -464,7 +460,7 @@ xmenu(void) {
puts(_(" w write table to disk and exit"));
puts(_(" y change number of physical cylinders")); /*sun*/
}
- else if (sgi_label) {
+ else if (disklabel == SGI_LABEL) {
puts(_("Command action"));
puts(_(" b move beginning of data in a partition")); /* !sun */
puts(_(" c change number of cylinders"));
@@ -480,7 +476,7 @@ xmenu(void) {
puts(_(" v verify the partition table"));
puts(_(" w write table to disk and exit"));
}
- else if (aix_label || mac_label) {
+ else if (disklabel == AIX_LABEL || disklabel == MAC_LABEL) {
puts(_("Command action"));
puts(_(" b move beginning of data in a partition")); /* !sun */
puts(_(" c change number of cylinders"));
@@ -519,16 +515,16 @@ xmenu(void) {
static int
get_sysid(int i) {
return (
- sun_label ? sun_get_sysid(i) :
- sgi_label ? sgi_get_sysid(i) :
+ disklabel == SUN_LABEL ? sun_get_sysid(i) :
+ disklabel == SGI_LABEL ? sgi_get_sysid(i) :
ptes[i].part_table->sys_ind);
}
static struct systypes *
get_sys_types(void) {
return (
- sun_label ? sun_sys_types :
- sgi_label ? sgi_sys_types :
+ disklabel == SUN_LABEL ? sun_sys_types :
+ disklabel == SGI_LABEL ? sgi_sys_types :
i386_sys_types);
}
@@ -729,7 +725,7 @@ warn_geometry(void) {
char *m = NULL;
int prev = 0;
- if (sgi_label) /* cannot set cylinders etc anyway */
+ if (disklabel == SGI_LABEL) /* cannot set cylinders etc anyway */
return 0;
if (!heads)
prev = test_c(&m, _("heads"));
@@ -938,7 +934,8 @@ create_doslabel(void) {
id);
sun_nolabel(); /* otherwise always recognised as sun */
sgi_nolabel(); /* otherwise always recognised as sgi */
- mac_label = aix_label = osf_label = possibly_osf_label = 0;
+ disklabel = DOS_LABEL;
+ possibly_osf_label = 0;
partitions = 4;
/* Zero out the MBR buffer */
@@ -1233,7 +1230,7 @@ get_boot(enum action what) {
if (check_osf_label()) {
possibly_osf_label = 1;
if (!valid_part_table_flag(MBRbuffer)) {
- osf_label = 1;
+ disklabel = OSF_LABEL;
return 0;
}
printf(_("This disk has both DOS and BSD magic.\n"
@@ -1543,11 +1540,11 @@ get_partition_dflt(int warn, int max, int dflt) {
pe = &ptes[i];
if (warn) {
- if ((!sun_label && !sgi_label && !pe->part_table->sys_ind)
- || (sun_label &&
+ if ((disklabel != SUN_LABEL && disklabel != SGI_LABEL && !pe->part_table->sys_ind)
+ || (disklabel == SUN_LABEL &&
(!sunlabel->partitions[i].num_sectors ||
!sunlabel->part_tags[i].tag))
- || (sgi_label && (!sgi_get_num_sectors(i)))
+ || (disklabel == SGI_LABEL && (!sgi_get_num_sectors(i)))
)
fprintf(stderr,
_("Warning: partition %d has empty type\n"),
@@ -1576,6 +1573,7 @@ get_existing_partition(int warn, int max) {
pno = i;
}
}
+
if (pno >= 0) {
printf(_("Selected partition %d\n"), pno+1);
return pno;
@@ -1673,12 +1671,12 @@ delete_partition(int i) {
return; /* C/H/S not set */
pe->changed = 1;
- if (sun_label) {
+ if (disklabel == SUN_LABEL) {
sun_delete_partition(i);
return;
}
- if (sgi_label) {
+ if (disklabel == SGI_LABEL) {
sgi_delete_partition(i);
return;
}
@@ -1741,7 +1739,7 @@ change_sysid(void) {
/* If sgi_label then don't use get_existing_partition,
let the user select a partition, since get_existing_partition()
only works for Linux like partition tables. */
- if (!sgi_label) {
+ if (disklabel != SGI_LABEL) {
i = get_existing_partition(0, partitions);
} else {
i = get_partition(0, partitions);
@@ -1754,12 +1752,12 @@ change_sysid(void) {
/* if changing types T to 0 is allowed, then
the reverse change must be allowed, too */
- if (!sys && !sgi_label && !sun_label && !get_nr_sects(p))
+ if (!sys && disklabel != SGI_LABEL && disklabel != SUN_LABEL && !get_nr_sects(p))
printf(_("Partition %d does not exist yet!\n"), i + 1);
else while (1) {
sys = read_hex (get_sys_types());
- if (!sys && !sgi_label && !sun_label) {
+ if (!sys && disklabel != SGI_LABEL && disklabel != SUN_LABEL) {
printf(_("Type 0 means free space to many systems\n"
"(but not to Linux). Having partitions of\n"
"type 0 is probably unwise. You can delete\n"
@@ -1767,7 +1765,7 @@ change_sysid(void) {
/* break; */
}
- if (!sun_label && !sgi_label) {
+ if (disklabel != SGI_LABEL && disklabel != SUN_LABEL) {
if (IS_EXTENDED (sys) != IS_EXTENDED (p->sys_ind)) {
printf(_("You cannot change a partition into"
" an extended one or vice versa\n"
@@ -1777,12 +1775,12 @@ change_sysid(void) {
}
if (sys < 256) {
- if (sun_label && i == 2 && sys != SUN_TAG_BACKUP)
+ if (disklabel == SUN_LABEL && i == 2 && sys != SUN_TAG_BACKUP)
printf(_("Consider leaving partition 3 "
"as Whole disk (5),\n"
"as SunOS/Solaris expects it and "
"even Linux likes it.\n\n"));
- if (sgi_label && ((i == 10 && sys != ENTIRE_DISK)
+ if (disklabel == SGI_LABEL && ((i == 10 && sys != ENTIRE_DISK)
|| (i == 8 && sys != 0)))
printf(_("Consider leaving partition 9 "
"as volume header (0),\nand "
@@ -1790,10 +1788,10 @@ change_sysid(void) {
"as IRIX expects it.\n\n"));
if (sys == origsys)
break;
- if (sun_label) {
+ if (disklabel == SUN_LABEL) {
ptes[i].changed = sun_change_sysid(i, sys);
} else
- if (sgi_label) {
+ if (disklabel == SGI_LABEL) {
ptes[i].changed = sgi_change_sysid(i, sys);
} else {
p->sys_ind = sys;
@@ -1931,7 +1929,7 @@ list_disk_geometry(void) {
min_io_size, io_size);
if (alignment_offset)
printf(_("Alignment offset: %lu bytes\n"), alignment_offset);
- if (dos_label)
+ if (disklabel == DOS_LABEL)
dos_print_mbr_id();
printf("\n");
}
@@ -2077,19 +2075,19 @@ list_table(int xtra) {
char *type;
int i, w;
- if (sun_label) {
+ if (disklabel == SUN_LABEL) {
sun_list_table(xtra);
return;
}
- if (sgi_label) {
+ if (disklabel == SGI_LABEL) {
sgi_list_table(xtra);
return;
}
list_disk_geometry();
- if (osf_label) {
+ if (disklabel == OSF_LABEL) {
xbsd_print_disklabel(xtra);
return;
}
@@ -2146,7 +2144,7 @@ list_table(int xtra) {
/* Is partition table in disk order? It need not be, but... */
/* partition table entries are not checked for correct order if this
is a sgi, sun or aix labeled disk... */
- if (dos_label && wrong_p_order(NULL)) {
+ if (disklabel == DOS_LABEL && wrong_p_order(NULL)) {
printf(_("\nPartition table entries are not in disk order\n"));
}
}
@@ -2235,12 +2233,12 @@ verify(void) {
if (warn_geometry())
return;
- if (sun_label) {
+ if (disklabel == SUN_LABEL) {
verify_sun();
return;
}
- if (sgi_label) {
+ if (disklabel == SGI_LABEL) {
verify_sgi(1);
return;
}
@@ -2489,17 +2487,17 @@ new_partition(void) {
if (warn_geometry())
return;
- if (sun_label) {
+ if (disklabel == SUN_LABEL) {
add_sun_partition(get_partition(0, partitions), LINUX_NATIVE);
return;
}
- if (sgi_label) {
+ if (disklabel == SGI_LABEL) {
sgi_add_partition(get_partition(0, partitions), LINUX_NATIVE);
return;
}
- if (aix_label) {
+ if (disklabel == AIX_LABEL) {
printf(_("\tSorry - this fdisk cannot handle AIX disk labels."
"\n\tIf you want to add DOS-type partitions, create"
"\n\ta new empty DOS partition table first. (Use o.)"
@@ -2508,7 +2506,7 @@ new_partition(void) {
return;
}
- if (mac_label) {
+ if (disklabel == MAC_LABEL) {
printf(_("\tSorry - this fdisk cannot handle Mac disk labels."
"\n\tIf you want to add DOS-type partitions, create"
"\n\ta new empty DOS partition table first. (Use o.)"
@@ -2576,7 +2574,7 @@ static void
write_table(void) {
int i;
- if (dos_label) {
+ if (disklabel == DOS_LABEL) {
/* MBR (primary partitions) */
if (!MBRbuffer_changed) {
for (i = 0; i < 4; i++)
@@ -2597,10 +2595,10 @@ write_table(void) {
}
}
}
- else if (sgi_label) {
+ else if (disklabel == SGI_LABEL) {
/* no test on change? the printf below might be mistaken */
sgi_write_table();
- } else if (sun_label) {
+ } else if (disklabel == SUN_LABEL) {
int needw = 0;
for (i=0; i<8; i++)
@@ -2681,7 +2679,7 @@ print_raw(void) {
int i;
printf(_("Device: %s\n"), disk_device);
- if (sun_label || sgi_label)
+ if (disklabel == SUN_LABEL || disklabel == SGI_LABEL)
print_buffer(MBRbuffer);
else for (i = 3; i < partitions; i++)
print_buffer(ptes[i].sectorbuffer);
@@ -2745,34 +2743,34 @@ xselect(void) {
c = tolower(read_char(_("Expert command (m for help): ")));
switch (c) {
case 'a':
- if (sun_label)
+ if (disklabel == SUN_LABEL)
sun_set_alt_cyl();
break;
case 'b':
- if (dos_label)
+ if (disklabel == DOS_LABEL)
move_begin(get_partition(0, partitions));
break;
case 'c':
user_cylinders = cylinders =
read_int(1, cylinders, 1048576, 0,
_("Number of cylinders"));
- if (sun_label)
+ if (disklabel == SUN_LABEL)
sun_set_ncyl(cylinders);
break;
case 'd':
print_raw();
break;
case 'e':
- if (sgi_label)
+ if (disklabel == SGI_LABEL)
sgi_set_xcyl();
- else if (sun_label)
+ else if (disklabel == SUN_LABEL)
sun_set_xcyl();
else
- if (dos_label)
+ if (disklabel == DOS_LABEL)
x_list_table(1);
break;
case 'f':
- if (dos_label)
+ if (disklabel == DOS_LABEL)
fix_partition_table_order();
break;
case 'g':
@@ -2784,17 +2782,17 @@ xselect(void) {
update_units();
break;
case 'i':
- if (sun_label)
+ if (disklabel == SUN_LABEL)
sun_set_ilfact();
- if (dos_label)
+ else if (disklabel == DOS_LABEL)
dos_set_mbr_id();
break;
case 'o':
- if (sun_label)
+ if (disklabel == SUN_LABEL)
sun_set_rspeed();
break;
case 'p':
- if (sun_label)
+ if (disklabel == SUN_LABEL)
list_table(1);
else
x_list_table(0);
@@ -2822,7 +2820,7 @@ xselect(void) {
write_table(); /* does not return */
break;
case 'y':
- if (sun_label)
+ if (disklabel == SUN_LABEL)
sun_set_pcylcount();
break;
default:
@@ -2888,7 +2886,7 @@ try(char *device, int user_specified) {
if (gb > 0) { /* I/O error */
} else if (gb < 0) { /* no DOS signature */
list_disk_geometry();
- if (!aix_label && !mac_label && btrydev(device) < 0)
+ if (disklabel != AIX_LABEL && disklabel != MAC_LABEL && btrydev(device) < 0)
fprintf(stderr,
_("Disk %s doesn't contain a valid "
"partition table\n"), device);
@@ -3082,14 +3080,14 @@ main(int argc, char **argv) {
gpt_warning(disk_device);
get_boot(fdisk);
- if (osf_label) {
+ if (disklabel == OSF_LABEL) {
/* OSF label, and no DOS label */
printf(_("Detected an OSF/1 disklabel on %s, entering "
"disklabel mode.\n"),
disk_device);
bselect();
- osf_label = 0;
/* If we return we may want to make an empty DOS label? */
+ disklabel = DOS_LABEL;
}
while (1) {
@@ -3097,19 +3095,19 @@ main(int argc, char **argv) {
c = tolower(read_char(_("Command (m for help): ")));
switch (c) {
case 'a':
- if (dos_label)
+ if (disklabel == DOS_LABEL)
toggle_active(get_partition(1, partitions));
- else if (sun_label)
+ else if (disklabel == SUN_LABEL)
toggle_sunflags(get_partition(1, partitions),
SUN_FLAG_UNMNT);
- else if (sgi_label)
+ else if (disklabel == SGI_LABEL)
sgi_set_bootpartition(
get_partition(1, partitions));
else
unknown_command(c);
break;
case 'b':
- if (sgi_label) {
+ if (disklabel == SGI_LABEL) {
printf(_("\nThe current boot file is: %s\n"),
sgi_get_bootfile());
if (read_chars(_("Please enter the name of the "
@@ -3121,12 +3119,12 @@ main(int argc, char **argv) {
bselect();
break;
case 'c':
- if (dos_label)
+ if (disklabel == DOS_LABEL)
toggle_dos_compatibility_flag();
- else if (sun_label)
+ else if (disklabel == SUN_LABEL)
toggle_sunflags(get_partition(1, partitions),
SUN_FLAG_RONLY);
- else if (sgi_label)
+ else if (disklabel == SGI_LABEL)
sgi_set_swappartition(
get_partition(1, partitions));
else
@@ -3137,7 +3135,7 @@ main(int argc, char **argv) {
let the user select a partition, since
get_existing_partition() only works for Linux-like
partition tables */
- if (!sgi_label) {
+ if (disklabel != SGI_LABEL) {
j = get_existing_partition(1, partitions);
} else {
j = get_partition(1, partitions);
@@ -3146,7 +3144,7 @@ main(int argc, char **argv) {
delete_partition(j);
break;
case 'i':
- if (sgi_label)
+ if (disklabel == SGI_LABEL)
create_sgiinfo();
else
unknown_command(c);
@@ -3185,7 +3183,7 @@ main(int argc, char **argv) {
write_table(); /* does not return */
break;
case 'x':
- if (sgi_label) {
+ if (disklabel == SGI_LABEL) {
fprintf(stderr,
_("\n\tSorry, no experts menu for SGI "
"partition tables available.\n\n"));