]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
fdisk: Fix bad invalid flag 0x00000 warning message
authorFrancesco Cosoleto <cosoleto@gmail.com>
Thu, 15 Dec 2011 19:02:47 +0000 (20:02 +0100)
committerKarel Zak <kzak@redhat.com>
Fri, 16 Dec 2011 13:04:09 +0000 (14:04 +0100)
This splits check_dos_label() and dos_init() off from get_boot() and gets
rid of the invalid flag 0x00000 warning message due to a check for MBR
signs in zeroized buffer:

memset(MBRbuffer, 0, 512);

if (what == create_empty_dos)
goto got_dos_table;
[...]
got_dos_table:
if (!valid_part_table_flag(MBRbuffer)) {
[...]
if (!valid_part_table_flag(pe->sectorbuffer))
fprintf(stderr, _("Warning: invalid flag 0x%04x of partition "
[...]

Signed-off-by: Francesco Cosoleto <cosoleto@gmail.com>
fdisk/fdisk.c
fdisk/fdisk.h

index acf0e673d8f3f91633da02e8f417ae096d0f2f58..800ed02752a6ed6834b6f5101dd08c0dde26d16b 100644 (file)
@@ -288,7 +288,7 @@ unsigned long grain = DEFAULT_SECTOR_SIZE,
              alignment_offset;
 int has_topology;
 
-enum labeltype disklabel = DOS_LABEL;  /* Current disklabel */
+enum labeltype disklabel;      /* Current disklabel */
 
 jmp_buf listingbuf;
 
@@ -850,6 +850,30 @@ dos_set_mbr_id(void) {
        dos_print_mbr_id();
 }
 
+static void dos_init(void)
+{
+       int i;
+
+       disklabel = DOS_LABEL;
+       partitions = 4;
+       ext_index = 0;
+       extended_offset = 0;
+
+       for (i = 0; i < 4; i++) {
+               struct pte *pe = &ptes[i];
+
+               pe->part_table = pt_offset(MBRbuffer, i);
+               pe->ext_pointer = NULL;
+               pe->offset = 0;
+               pe->sectorbuffer = MBRbuffer;
+               pe->changed = 0;
+       }
+
+       warn_geometry();
+       warn_limits();
+       warn_alignment();
+}
+
 static void
 create_doslabel(void) {
        unsigned int id = get_random_id();
@@ -857,19 +881,17 @@ create_doslabel(void) {
        fprintf(stderr, _("Building a new DOS disklabel with disk identifier 0x%08x.\n"), id);
        sun_nolabel();  /* otherwise always recognised as sun */
        sgi_nolabel();  /* otherwise always recognised as sgi */
-       disklabel = DOS_LABEL;
-       partitions = 4;
 
-       /* Zero out the MBR buffer */
-       extended_offset = 0;
+       dos_init();
+       zeroize_mbr_buffer();
+
        set_all_unchanged();
        set_changed(0);
-       get_boot(create_empty_dos);
 
        /* Generate an MBR ID for this disk */
        dos_write_mbr_id(MBRbuffer, id);
 
-       /* Mark it bootable (unfortunately required) */
+       /* Put MBR signature */
        write_part_table_flag(MBRbuffer);
 }
 
@@ -1084,6 +1106,42 @@ void zeroize_mbr_buffer(void)
                memset(MBRbuffer, 0, MAX_SECTOR_SIZE);
 }
 
+static int check_dos_label(void)
+{
+       int i;
+
+       if (!valid_part_table_flag(MBRbuffer))
+               return 0;
+
+       dos_init();
+
+       for (i = 0; i < 4; i++) {
+               struct pte *pe = &ptes[i];
+
+               if (IS_EXTENDED (pe->part_table->sys_ind)) {
+                       if (partitions != 4)
+                               fprintf(stderr, _("Ignoring extra extended "
+                                       "partition %d\n"), i + 1);
+                       else
+                               read_extended(i);
+               }
+       }
+
+       for (i = 3; i < partitions; i++) {
+               struct pte *pe = &ptes[i];
+
+               if (!valid_part_table_flag(pe->sectorbuffer)) {
+                       fprintf(stderr,
+                               _("Warning: invalid flag 0x%04x of partition "
+                               "table %d will be corrected by w(rite)\n"),
+                               part_table_flag(pe->sectorbuffer), i + 1);
+                       pe->changed = 1;
+               }
+       }
+
+       return 1;
+}
+
 /*
  * Read MBR.  Returns:
  *   -1: no 0xaa55 flag present (possibly entire disk BSD)
@@ -1092,27 +1150,10 @@ void zeroize_mbr_buffer(void)
  */
 static int
 get_boot(enum action what) {
-       int i;
-
-       partitions = 4;
-       ext_index = 0;
-       extended_offset = 0;
-
-       for (i = 0; i < 4; i++) {
-               struct pte *pe = &ptes[i];
-
-               pe->part_table = pt_offset(MBRbuffer, i);
-               pe->ext_pointer = NULL;
-               pe->offset = 0;
-               pe->sectorbuffer = MBRbuffer;
-               pe->changed = (what == create_empty_dos);
-       }
 
+       disklabel = ANY_LABEL;
        memset(MBRbuffer, 0, 512);
 
-       if (what == create_empty_dos)
-               goto got_dos_table;             /* skip reading disk */
-
        if (what != try_only) {
                if ((fd = open(disk_device, O_RDWR)) < 0) {
                        if ((fd = open(disk_device, O_RDONLY)) < 0)
@@ -1133,17 +1174,9 @@ get_boot(enum action what) {
 
        update_units();
 
-       if (check_sun_label())
-               return 0;
-
-       if (check_sgi_label())
-               return 0;
-
-       if (check_aix_label())
-               return 0;
-
-       if (check_mac_label())
-               return 0;
+       if (!check_dos_label())
+               if (check_sun_label() || check_sgi_label() || check_aix_label() || check_mac_label())
+                       return 0;
 
        if (check_osf_label()) {
                if (!valid_part_table_flag(MBRbuffer)) {
@@ -1152,61 +1185,21 @@ get_boot(enum action what) {
                }
                printf(_("This disk has both DOS and BSD magic.\n"
                         "Give the 'b' command to go to BSD mode.\n"));
+               return 0;
        }
 
-got_dos_table:
+       if (disklabel == ANY_LABEL) {
+               if (what == try_only)
+                       return -1;
 
-       if (!valid_part_table_flag(MBRbuffer)) {
-               switch(what) {
-               case fdisk:
-                       fprintf(stderr,
-                               _("Device contains neither a valid DOS "
-                                 "partition table, nor Sun, SGI or OSF "
-                                 "disklabel\n"));
+               fprintf(stderr,
+                       _("Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel\n"));
 #ifdef __sparc__
-                       create_sunlabel();
+               create_sunlabel();
 #else
-                       create_doslabel();
+               create_doslabel();
 #endif
-                       return 0;
-               case try_only:
-                       return -1;
-               case create_empty_dos:
-                       break;
-               default:
-                       fprintf(stderr, _("Internal error\n"));
-                       exit(1);
-               }
-       }
-
-       for (i = 0; i < 4; i++) {
-               struct pte *pe = &ptes[i];
-
-               if (IS_EXTENDED (pe->part_table->sys_ind)) {
-                       if (partitions != 4)
-                               fprintf(stderr, _("Ignoring extra extended "
-                                       "partition %d\n"), i + 1);
-                       else
-                               read_extended(i);
-               }
-       }
-
-       for (i = 3; i < partitions; i++) {
-               struct pte *pe = &ptes[i];
-
-               if (!valid_part_table_flag(pe->sectorbuffer)) {
-                       fprintf(stderr,
-                               _("Warning: invalid flag 0x%04x of partition "
-                               "table %d will be corrected by w(rite)\n"),
-                               part_table_flag(pe->sectorbuffer), i + 1);
-                       pe->changed = 1;
-               }
        }
-
-       warn_geometry();
-       warn_limits();
-       warn_alignment();
-
        return 0;
 }
 
index 66418806f42692547b18d6ae8681bc5f9098ca1d..84be09c8626783d2bf94c82ade1f1057ba1be410 100644 (file)
@@ -54,7 +54,7 @@ enum failure {ioctl_error,
        unable_to_open, unable_to_read, unable_to_seek,
        unable_to_write};
 
-enum action {fdisk, try_only, create_empty_dos};
+enum action {fdisk, try_only};
 
 struct geom {
        unsigned int heads;