Patch from Kent Robotti updating fdisk to version v2.11z
authorEric Andersen <andersen@codepoet.org>
Thu, 3 Jul 2003 10:02:32 +0000 (10:02 -0000)
committerEric Andersen <andersen@codepoet.org>
Thu, 3 Jul 2003 10:02:32 +0000 (10:02 -0000)
util-linux/fdisk.c

index 71fbe074e4872f4a1f19e513f981d66c8420768f..11da7717933ae16e976d5bc924aecf40587f5ce2 100644 (file)
@@ -19,7 +19,7 @@
  * Vladimir Oleynik <dzo@simtreas.ru> 2001,2002 Busybox port
  */
 
-#define UTIL_LINUX_VERSION "2.11w"
+#define UTIL_LINUX_VERSION "2.11z"
 
 #define PROC_PARTITIONS "/proc/partitions"
 
@@ -4316,41 +4316,50 @@ read_int(uint low, uint dflt, uint high, uint base, char *mesg)
                       && *line_ptr != '-' && *line_ptr != '+')
                        continue;
 
-               if (*line_ptr == '+' || *line_ptr == '-') {
-                       i = atoi(line_ptr+1);
-                       if (*line_ptr == '-')
-                               i = -i;
-                       while (isdigit(*++line_ptr))
-                               use_default = 0;
-                       switch (*line_ptr) {
-                               case 'c':
-                               case 'C':
+               if (*line_ptr == '+' || *line_ptr == '-') {
+                      int minus = (*line_ptr == '-');
+                      int absolute = 0;
+
+                      i = atoi(line_ptr+1);
+
+                      while (isdigit(*++line_ptr))
+                              use_default = 0;
+           
+                      switch (*line_ptr) {
+                              case 'c':
+                              case 'C':
                                        if (!display_in_cyl_units)
                                                i *= heads * sectors;
                                        break;
-                               case 'k':
-                               case 'K':
-                                       i *= 2;
-                                       i /= (sector_size / 512);
-                                       i /= units_per_sector;
-                                       break;
-                               case 'm':
-                               case 'M':
-                                       i *= 2048;
-                                       i /= (sector_size / 512);
-                                       i /= units_per_sector;
-                                       break;
-                               case 'g':
-                               case 'G':
-                                       i *= 2048000;
-                                       i /= (sector_size / 512);
-                                       i /= units_per_sector;
-                                       break;
-                               default:
-                                       break;
+                              case 'k':
+                              case 'K':
+                                      absolute = 1000;
+                                      break;
+                              case 'm':
+                              case 'M':
+                                      absolute = 1000000;
+                                      break;
+                              case 'g':
+                              case 'G':
+                                      absolute = 1000000000;
+                                      break;
+                              default:
+                                      break;
+                      }
+                      if (absolute) {
+                              unsigned long long bytes;
+                              unsigned long unit;
+
+                              bytes = (unsigned long long) i * absolute;
+                              unit = sector_size * units_per_sector;
+                              bytes += unit/2; /* round */
+                              bytes /= unit;
+                              i = bytes;
                        }
-                       i += base;
-               } else {
+                      if (minus)
+                              i = -i;
+                      i += base;
+               } else {
                        i = atoi(line_ptr);
                        while (isdigit(*line_ptr)) {
                                line_ptr++;
@@ -4701,7 +4710,7 @@ static void check_consistency(const struct partition *p, int partition) {
 
 /* Ending on cylinder boundary? */
        if (peh != (heads - 1) || pes != sectors) {
-               printf(_("Partition %i does not end on cylinder boundary:\n"),
+               printf(_("Partition %i does not end on cylinder boundary.\n"),
                        partition + 1);
 #if 0
                printf(_("     phys=(%d, %d, %d) "), pec, peh, pes);
@@ -5266,13 +5275,14 @@ new_partition(void) {
        }
 #endif
 
-       if (partitions >= MAXIMUM_PARTS) {
-               printf(_("The maximum number of partitions has been created\n"));
-               return;
-       }
-
        for (i = 0; i < 4; i++)
                free_primary += !ptes[i].part_table->sys_ind;
+
+       if (!free_primary && partitions >= MAXIMUM_PARTS) {
+               printf(_("The maximum number of partitions has been created\n"));
+               return;
+       }
+
        if (!free_primary) {
                if (extended_offset)
                        add_logical();