fdisk: sync up with some util-linux 2.31 behavior

= display default is no longer in cylinders
= +sizeC is no longer supported
= add +sizeT suffix - terabytes are here
= K,M,G,T and k,m,g,t suffixes all are binary, not decimal
= +sizeM results in last sector +(size * 1Mbyte - 1), not +(size * 1Mbyte)
= fix comparison to "YES" answer for sgi/sun

function                                             old     new   delta
read_int                                             492     519     +27
fdisk_main                                          2644    2640      -4
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/1 up/down: 27/-4)              Total: 23 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2018-07-25 13:45:36 +02:00
parent 163e637ffb
commit c104549b48
3 changed files with 46 additions and 48 deletions

View File

@ -426,7 +426,7 @@ struct globals {
unsigned sector_offset; // = 1; unsigned sector_offset; // = 1;
unsigned g_heads, g_sectors, g_cylinders; unsigned g_heads, g_sectors, g_cylinders;
smallint /* enum label_type */ current_label_type; smallint /* enum label_type */ current_label_type;
smallint display_in_cyl_units; // = 1; smallint display_in_cyl_units;
#if ENABLE_FEATURE_OSF_LABEL #if ENABLE_FEATURE_OSF_LABEL
smallint possibly_osf_label; smallint possibly_osf_label;
#endif #endif
@ -488,7 +488,6 @@ struct globals {
sector_size = DEFAULT_SECTOR_SIZE; \ sector_size = DEFAULT_SECTOR_SIZE; \
sector_offset = 1; \ sector_offset = 1; \
g_partitions = 4; \ g_partitions = 4; \
display_in_cyl_units = 1; \
units_per_sector = 1; \ units_per_sector = 1; \
dos_compatible_flag = 1; \ dos_compatible_flag = 1; \
} while (0) } while (0)
@ -639,25 +638,6 @@ seek_sector(sector_t secno)
} }
#if ENABLE_FEATURE_FDISK_WRITABLE #if ENABLE_FEATURE_FDISK_WRITABLE
/* Read line; return 0 or first printable char */
static int
read_line(const char *prompt)
{
int sz;
sz = read_line_input(NULL, prompt, line_buffer, sizeof(line_buffer));
if (sz <= 0)
exit(EXIT_SUCCESS); /* Ctrl-D or Ctrl-C */
if (line_buffer[sz-1] == '\n')
line_buffer[--sz] = '\0';
line_ptr = line_buffer;
while (*line_ptr != '\0' && (unsigned char)*line_ptr <= ' ')
line_ptr++;
return *line_ptr;
}
static void static void
set_all_unchanged(void) set_all_unchanged(void)
{ {
@ -680,6 +660,25 @@ write_part_table_flag(char *b)
b[511] = 0xaa; b[511] = 0xaa;
} }
/* Read line; return 0 or first printable non-space char */
static int
read_line(const char *prompt)
{
int sz;
sz = read_line_input(NULL, prompt, line_buffer, sizeof(line_buffer));
if (sz <= 0)
exit(EXIT_SUCCESS); /* Ctrl-D or Ctrl-C */
if (line_buffer[sz-1] == '\n')
line_buffer[--sz] = '\0';
line_ptr = line_buffer;
while (*line_ptr != '\0' && (unsigned char)*line_ptr <= ' ')
line_ptr++;
return *line_ptr;
}
static char static char
read_nonempty(const char *mesg) read_nonempty(const char *mesg)
{ {
@ -1614,7 +1613,7 @@ read_int(sector_t low, sector_t dflt, sector_t high, sector_t base, const char *
if (*line_ptr == '+' || *line_ptr == '-') { if (*line_ptr == '+' || *line_ptr == '-') {
int minus = (*line_ptr == '-'); int minus = (*line_ptr == '-');
int absolute = 0; unsigned scale_shift;
if (sizeof(value) <= sizeof(long)) if (sizeof(value) <= sizeof(long))
value = strtoul(line_ptr + 1, NULL, 10); value = strtoul(line_ptr + 1, NULL, 10);
@ -1622,48 +1621,46 @@ read_int(sector_t low, sector_t dflt, sector_t high, sector_t base, const char *
value = strtoull(line_ptr + 1, NULL, 10); value = strtoull(line_ptr + 1, NULL, 10);
/* (1) if 2nd char is digit, use_default = 0. /* (1) if 2nd char is digit, use_default = 0.
* (2) move line_ptr to first non-digit. */ * (2) move line_ptr to first non-digit.
*/
while (isdigit(*++line_ptr)) while (isdigit(*++line_ptr))
use_default = 0; use_default = 0;
switch (*line_ptr) { scale_shift = 0;
case 'c': switch (*line_ptr | 0x20) {
case 'C':
if (!display_in_cyl_units)
value *= g_heads * g_sectors;
break;
case 'K':
absolute = 1024;
break;
case 'k': case 'k':
absolute = 1000; scale_shift = 10; /* 1024 */
break; break;
case 'm': case 'm':
case 'M': scale_shift = 20; /* 1024*1024 */
absolute = 1000000;
break; break;
case 'g': case 'g':
case 'G': scale_shift = 30; /* 1024*1024*1024 */
absolute = 1000000000; break;
case 't':
scale_shift = 40; /* 1024*1024*1024*1024 */
break; break;
default: default:
break; break;
} }
if (absolute) { if (scale_shift) {
ullong bytes; ullong bytes;
unsigned long unit; unsigned long unit;
bytes = (ullong) value * absolute; bytes = (ullong) value << scale_shift;
unit = sector_size * units_per_sector; unit = sector_size * units_per_sector;
bytes += unit/2; /* round */ bytes += unit/2; /* round */
bytes /= unit; bytes /= unit;
value = bytes; value = (bytes != 0 ? bytes - 1 : 0);
} }
if (minus) if (minus)
value = -value; value = -value;
value += base; value += base;
} else { } else {
value = atoi(line_ptr); if (sizeof(value) <= sizeof(long))
value = strtoul(line_ptr, NULL, 10);
else
value = strtoull(line_ptr, NULL, 10);
while (isdigit(*line_ptr)) { while (isdigit(*line_ptr)) {
line_ptr++; line_ptr++;
use_default = 0; use_default = 0;
@ -2529,8 +2526,9 @@ add_partition(int n, int sys)
stop = limit; stop = limit;
} else { } else {
snprintf(mesg, sizeof(mesg), snprintf(mesg, sizeof(mesg),
"Last %s or +size or +sizeM or +sizeK", "Last %s or +size{,K,M,G,T}",
str_units(SINGULAR)); str_units(SINGULAR)
);
stop = read_int(cround(start), cround(limit), cround(limit), cround(start), mesg); stop = read_int(cround(start), cround(limit), cround(limit), cround(start), mesg);
if (display_in_cyl_units) { if (display_in_cyl_units) {
stop = stop * units_per_sector - 1; stop = stop * units_per_sector - 1;
@ -2614,9 +2612,9 @@ new_partition(void)
} else { } else {
char c, line[80]; char c, line[80];
snprintf(line, sizeof(line), snprintf(line, sizeof(line),
"Command action\n" "Partition type\n"
" %s\n" " p primary partition (1-4)\n"
" p primary partition (1-4)\n", " %s\n",
(extended_offset ? (extended_offset ?
"l logical (5 or over)" : "e extended")); "l logical (5 or over)" : "e extended"));
while (1) { while (1) {

View File

@ -623,7 +623,7 @@ sgi_change_sysid(int i, int sys)
"retrieve from its directory standalone tools like sash and fx.\n" "retrieve from its directory standalone tools like sash and fx.\n"
"Only the \"SGI volume\" entire disk section may violate this.\n" "Only the \"SGI volume\" entire disk section may violate this.\n"
"Type YES if you are sure about tagging this partition differently.\n"); "Type YES if you are sure about tagging this partition differently.\n");
if (strcmp(line_ptr, "YES\n") != 0) if (strcmp(line_ptr, "YES") != 0)
return; return;
} }
sgilabel->partitions[i].id = SGI_SSWAP32(sys); sgilabel->partitions[i].id = SGI_SSWAP32(sys);

View File

@ -606,7 +606,7 @@ sun_change_sysid(int i, int sys)
"there may destroy your partition table and bootblock.\n" "there may destroy your partition table and bootblock.\n"
"Type YES if you're very sure you would like that partition\n" "Type YES if you're very sure you would like that partition\n"
"tagged with 82 (Linux swap): "); "tagged with 82 (Linux swap): ");
if (strcmp(line_ptr, "YES\n")) if (strcmp(line_ptr, "YES") != 0)
return; return;
} }
switch (sys) { switch (sys) {