[git commit] fdisk: code shrink
Denys Vlasenko
vda.linux at googlemail.com
Wed Feb 4 11:03:33 UTC 2026
commit: https://git.busybox.net/busybox/commit/?id=72fbc81224351fd883c84967f5685ee016d791db
branch: https://git.busybox.net/busybox/log/?h=master
function old new delta
new_partition 1054 1066 +12
list_table 1366 1370 +4
update_units 32 35 +3
list_disk_geometry 68 71 +3
get_geometry 535 538 +3
fdisk_fatal 38 41 +3
warn_cylinders 42 44 +2
xbsd_print_disklabel 836 834 -2
create_doslabel 110 108 -2
change_units 49 45 -4
xbsd_new_part 477 456 -21
add_partition 1278 1246 -32
.rodata 107059 107008 -51
fdisk_main 4775 4618 -157
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 7/7 up/down: 30/-269) Total: -239 bytes
Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
util-linux/fdisk.c | 178 +++++++++++++++++--------------------------------
util-linux/fdisk_gpt.c | 8 +--
util-linux/fdisk_osf.c | 8 +--
util-linux/fdisk_sgi.c | 4 +-
util-linux/fdisk_sun.c | 4 +-
5 files changed, 75 insertions(+), 127 deletions(-)
diff --git a/util-linux/fdisk.c b/util-linux/fdisk.c
index 470194af9..6611d3954 100644
--- a/util-linux/fdisk.c
+++ b/util-linux/fdisk.c
@@ -114,15 +114,25 @@
#endif
#include <assert.h> /* assert */
#include <sys/mount.h>
+#include "libbb.h"
+#include "unicode.h"
#if !defined(BLKSSZGET)
# define BLKSSZGET _IO(0x12, 104)
#endif
#if !defined(BLKGETSIZE64)
# define BLKGETSIZE64 _IOR(0x12,114,size_t)
#endif
-#include "libbb.h"
-#include "unicode.h"
-#define HDIO_GETGEO 0x0301 /* get device geometry */
+
+/* Get device geometry in this struct: */
+#define HDIO_GETGEO 0x0301
+struct hd_geometry {
+ unsigned char heads;
+ unsigned char sectors;
+ unsigned short cylinders;
+ unsigned long start;
+};
+
+typedef unsigned long long ullong;
#if BB_LITTLE_ENDIAN
# define inline_if_little_endian ALWAYS_INLINE
@@ -155,19 +165,8 @@
#define LINUX_LVM 0x8e
#define LINUX_RAID 0xfd
-enum {
- OPT_b = 1 << 0,
- OPT_C = 1 << 1,
- OPT_H = 1 << 2,
- OPT_l = 1 << 3,
- OPT_S = 1 << 4,
- OPT_u = 1 << 5,
- OPT_s = (1 << 6) * ENABLE_FEATURE_FDISK_BLKSIZE,
-};
-
-typedef unsigned long long ullong;
/* Used for sector numbers. Partition formats we know
- * do not support more than 2^32 sectors
+ * (except GPT!) do not support more than 2^32 sectors.
*/
typedef uint32_t sector_t;
#if UINT_MAX == 0xffffffff
@@ -180,12 +179,19 @@ typedef uint32_t sector_t;
# error Cant detect sizeof(uint32_t)
#endif
-struct hd_geometry {
- unsigned char heads;
- unsigned char sectors;
- unsigned short cylinders;
- unsigned long start;
+enum {
+ OPT_b = 1 << 0,
+ OPT_C = 1 << 1,
+ OPT_H = 1 << 2,
+ OPT_l = 1 << 3,
+ OPT_S = 1 << 4,
+ OPT_u = 1 << 5,
+ OPT_s = (1 << 6) * ENABLE_FEATURE_FDISK_BLKSIZE,
};
+#define USER_SET_SECTOR_SIZE (option_mask32 & OPT_b)
+#define NOWARN_OPT_ls (!ENABLE_FEATURE_FDISK_WRITABLE || (option_mask32 & (OPT_l|OPT_s)))
+#define DISPLAY_IN_CYL_UNITS (!(option_mask32 & OPT_u))
+#define TOGGLE_DISPLAY_IN_CYL_UNITS (option_mask32 ^= OPT_u)
/* TODO: just #if ENABLE_FEATURE_FDISK_WRITABLE */
/* (currently fdisk_sun/sgi.c do not have proper WRITABLE #ifs) */
@@ -421,7 +427,7 @@ enum {
};
#if ENABLE_FEATURE_GPT_LABEL
- struct gpt_header;
+struct gpt_header;
#endif
/* Globals */
@@ -434,19 +440,12 @@ struct globals {
unsigned sector_size; // = DEFAULT_SECTOR_SIZE;
unsigned sector_offset; // = 1;
unsigned g_heads, g_sectors, g_cylinders;
- smallint user_set_sector_size;
smallint /* enum label_type */ current_label_type;
- smallint display_in_cyl_units;
#if ENABLE_FEATURE_OSF_LABEL
smallint possibly_osf_label;
#endif
- smallint listing; /* no aborts for fdisk -l */
smallint dos_compatible_flag; // = 1;
-#if ENABLE_FEATURE_FDISK_WRITABLE
- //int dos_changed;
- smallint nowarn; /* no warnings for fdisk -l/-s */
-#endif
#if ENABLE_FEATURE_SUN_LABEL
smallint sun_other_endian;
smallint sun_scsi_disk;
@@ -486,17 +485,13 @@ struct globals {
#define g_partitions (G.g_partitions )
#define units_per_sector (G.units_per_sector )
#define sector_size (G.sector_size )
-#define user_set_sector_size (G.user_set_sector_size)
#define sector_offset (G.sector_offset )
#define g_heads (G.g_heads )
#define g_sectors (G.g_sectors )
#define g_cylinders (G.g_cylinders )
#define current_label_type (G.current_label_type )
-#define display_in_cyl_units (G.display_in_cyl_units)
#define possibly_osf_label (G.possibly_osf_label )
-#define listing (G.listing )
#define dos_compatible_flag (G.dos_compatible_flag )
-#define nowarn (G.nowarn )
#define ext_index (G.ext_index )
#define user_cylinders (G.user_cylinders )
#define user_heads (G.user_heads )
@@ -592,7 +587,7 @@ static sector_t bb_getsize_in_sectors(int fd)
#define IS_EXTENDED(i) \
((i) == EXTENDED || (i) == WIN98_EXTENDED || (i) == LINUX_EXTENDED)
-#define cround(n) (display_in_cyl_units ? ((n)/units_per_sector)+1 : (n))
+#define cround(n) (DISPLAY_IN_CYL_UNITS ? ((n)/units_per_sector)+1 : (n))
#define scround(x) (((x)+units_per_sector-1)/units_per_sector)
@@ -657,7 +652,7 @@ get_part_table(int i)
static ALWAYS_INLINE const char *
str_units(void)
{
- return display_in_cyl_units ? "cylinder" : "sector";
+ return DISPLAY_IN_CYL_UNITS ? "cylinder" : "sector";
}
static int
@@ -668,7 +663,9 @@ valid_part_table_flag(const char *mbuffer)
static void fdisk_fatal(const char *why)
{
- if (listing) {
+ if (!ENABLE_FEATURE_FDISK_WRITABLE /* this assumes -l */
+ || (option_mask32 & OPT_l)
+ ) {
close_dev_fd();
longjmp(listingbuf, 1);
}
@@ -937,24 +934,6 @@ get_partition_start_from_dev_start(const struct pte *pe)
}
#if ENABLE_FEATURE_FDISK_WRITABLE
-/*
- * Avoid warning about DOS partitions when no DOS partition was changed.
- * Here a heuristic "is probably dos partition".
- * We might also do the opposite and warn in all cases except
- * for "is probably nondos partition".
- */
-#ifdef UNUSED
-static int
-is_dos_partition(int t)
-{
- return (t == 1 || t == 4 || t == 6 ||
- t == 0x0b || t == 0x0c || t == 0x0e ||
- t == 0x11 || t == 0x12 || t == 0x14 || t == 0x16 ||
- t == 0x1b || t == 0x1c || t == 0x1e || t == 0x24 ||
- t == 0xc1 || t == 0xc4 || t == 0xc6);
-}
-#endif
-
static void
menu(void)
{
@@ -1023,70 +1002,44 @@ menu(void)
}
#endif /* FEATURE_FDISK_WRITABLE */
-
#if ENABLE_FEATURE_FDISK_ADVANCED
static void
xmenu(void)
{
puts("Command Action");
+ puts("c\tchange number of cylinders");
+ puts("h\tchange number of heads");
+ puts("s\tchange number of sectors/track");
if (LABEL_IS_SUN) {
puts("a\tchange number of alternate cylinders"); /*sun*/
- puts("c\tchange number of cylinders");
- puts("d\tprint the raw data in the partition table");
+ puts("y\tchange number of physical cylinders"); /*sun*/
puts("e\tchange number of extra sectors per cylinder");/*sun*/
- puts("h\tchange number of heads");
puts("i\tchange interleave factor"); /*sun*/
puts("o\tchange rotation speed (rpm)"); /*sun*/
- puts("p\tprint the partition table");
- puts("q\tquit without saving changes");
- puts("r\treturn to main menu");
- puts("s\tchange number of sectors/track");
- puts("v\tverify the partition table");
- puts("w\twrite table to disk and exit");
- puts("y\tchange number of physical cylinders"); /*sun*/
} else if (LABEL_IS_SGI) {
puts("b\tmove beginning of data in a partition"); /* !sun */
- puts("c\tchange number of cylinders");
- puts("d\tprint the raw data in the partition table");
- puts("e\tlist extended partitions"); /* !sun */
puts("g\tcreate an IRIX (SGI) partition table");/* sgi */
- puts("h\tchange number of heads");
- puts("p\tprint the partition table");
- puts("q\tquit without saving changes");
- puts("r\treturn to main menu");
- puts("s\tchange number of sectors/track");
- puts("v\tverify the partition table");
- puts("w\twrite table to disk and exit");
+ puts("e\tlist extended partitions"); /* !sun */
} else if (LABEL_IS_AIX) {
puts("b\tmove beginning of data in a partition"); /* !sun */
- puts("c\tchange number of cylinders");
- puts("d\tprint the raw data in the partition table");
+# if ENABLE_FEATURE_SGI_LABEL
+ puts("g\tcreate an IRIX (SGI) partition table");
+# endif
puts("e\tlist extended partitions"); /* !sun */
- puts("g\tcreate an IRIX (SGI) partition table");/* sgi */
- puts("h\tchange number of heads");
- puts("p\tprint the partition table");
- puts("q\tquit without saving changes");
- puts("r\treturn to main menu");
- puts("s\tchange number of sectors/track");
- puts("v\tverify the partition table");
- puts("w\twrite table to disk and exit");
} else {
+ puts("f\tfix partition order"); /* !sun, !aix, !sgi */
puts("b\tmove beginning of data in a partition"); /* !sun */
- puts("c\tchange number of cylinders");
- puts("d\tprint the raw data in the partition table");
+# if ENABLE_FEATURE_SGI_LABEL
+ puts("g\tcreate an IRIX (SGI) partition table");
+# endif
puts("e\tlist extended partitions"); /* !sun */
- puts("f\tfix partition order"); /* !sun, !aix, !sgi */
-#if ENABLE_FEATURE_SGI_LABEL
- puts("g\tcreate an IRIX (SGI) partition table");/* sgi */
-#endif
- puts("h\tchange number of heads");
- puts("p\tprint the partition table");
- puts("q\tquit without saving changes");
- puts("r\treturn to main menu");
- puts("s\tchange number of sectors/track");
- puts("v\tverify the partition table");
- puts("w\twrite table to disk and exit");
}
+ puts("d\tprint the raw data in the partition table");
+ puts("p\tprint the partition table");
+ puts("v\tverify the partition table");
+ puts("w\twrite table to disk and exit");
+ puts("q\tquit without saving changes");
+ puts("r\treturn to main menu");
}
#endif /* ADVANCED mode */
@@ -1245,7 +1198,7 @@ update_units(void)
{
int cyl_units = g_heads * g_sectors;
- if (display_in_cyl_units && cyl_units)
+ if (DISPLAY_IN_CYL_UNITS && cyl_units)
units_per_sector = cyl_units;
else
units_per_sector = 1; /* in sectors */
@@ -1255,7 +1208,7 @@ update_units(void)
static void
warn_cylinders(void)
{
- if (LABEL_IS_DOS && g_cylinders > 1024 && !nowarn)
+ if (LABEL_IS_DOS && g_cylinders > 1024 && !NOWARN_OPT_ls)
printf("\n"
"The number of cylinders for this disk is set to %u.\n"
"There is nothing wrong with that, but this is larger than 1024,\n"
@@ -1384,7 +1337,7 @@ create_doslabel(void)
static void
get_sectorsize(void)
{
- if (!user_set_sector_size) {
+ if (!USER_SET_SECTOR_SIZE) {
int arg;
if (ioctl(dev_fd, BLKSSZGET, &arg) == 0 && arg >= 512)
sector_size = arg;
@@ -1839,7 +1792,7 @@ get_nonexisting_partition(void)
static void
change_units(void)
{
- display_in_cyl_units = !display_in_cyl_units;
+ TOGGLE_DISPLAY_IN_CYL_UNITS;
update_units();
printf("Changing display/entry units to %ss\n",
str_units());
@@ -2540,7 +2493,7 @@ add_partition(int n, int sys)
fill_bounds(first, last);
if (n < 4) {
start = sector_offset;
- if (display_in_cyl_units || !total_number_of_sectors)
+ if (DISPLAY_IN_CYL_UNITS || !total_number_of_sectors)
limit = (sector_t) g_heads * g_sectors * g_cylinders - 1;
else
limit = total_number_of_sectors - 1;
@@ -2553,7 +2506,7 @@ add_partition(int n, int sys)
start = extended_offset + sector_offset;
limit = get_start_sect(q) + get_nr_sects(q) - 1;
}
- if (display_in_cyl_units)
+ if (DISPLAY_IN_CYL_UNITS)
for (i = 0; i < g_partitions; i++)
first[i] = (cround(first[i]) - 1) * units_per_sector;
@@ -2581,7 +2534,7 @@ add_partition(int n, int sys)
saved_start = start;
start = read_int(cround(saved_start), cround(saved_start), cround(limit), 0, mesg);
- if (display_in_cyl_units) {
+ if (DISPLAY_IN_CYL_UNITS) {
start = (start - 1) * units_per_sector;
if (start < saved_start)
start = saved_start;
@@ -2622,7 +2575,7 @@ add_partition(int n, int sys)
str_units()
);
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;
if (stop >limit)
stop = limit;
@@ -3112,7 +3065,7 @@ int fdisk_main(int argc UNUSED_PARAM, char **argv)
close_dev_fd(); /* needed: fd 3 must not stay closed */
opt = getopt32(argv, "^" "b:+C:+H:+lS:+u"IF_FEATURE_FDISK_BLKSIZE("s")"\0"
- /* among -s and -l, the last one takes preference */
+ /* among -s and -l, the last one takes precedence */
IF_FEATURE_FDISK_BLKSIZE("s-l:l-s"),
§or_size, &user_cylinders, &user_heads, &user_sectors);
argv += optind;
@@ -3122,7 +3075,6 @@ int fdisk_main(int argc UNUSED_PARAM, char **argv)
if (opt & OPT_s) {
int j;
- nowarn = 1;
if (!argv[0])
bb_show_usage();
for (j = 0; argv[j]; j++) {
@@ -3141,7 +3093,7 @@ int fdisk_main(int argc UNUSED_PARAM, char **argv)
}
#endif
- if (opt & OPT_b) {
+ //if (opt & OPT_b) {
/* Ugly: this sector size is really per device,
* so cannot be combined with multiple disks,
* and the same goes for the C/H/S options.
@@ -3152,22 +3104,18 @@ int fdisk_main(int argc UNUSED_PARAM, char **argv)
) {
bb_show_usage();
}
- sector_offset = 2;
- user_set_sector_size = 1;
- }
+ //}
if (user_heads <= 0 || user_heads >= 256)
user_heads = 0;
if (user_sectors <= 0 || user_sectors >= 64)
user_sectors = 0;
- if (opt & OPT_u)
- display_in_cyl_units = 0;
+ //if (opt & OPT_u)
+ // DISPLAY_IN_CYL_UNITS = 0;
#if ENABLE_FEATURE_FDISK_WRITABLE
if (opt & OPT_l) {
- nowarn = 1;
#endif
if (*argv) {
- listing = 1;
do {
open_list_and_close(*argv, 1);
} while (*++argv);
diff --git a/util-linux/fdisk_gpt.c b/util-linux/fdisk_gpt.c
index 251c9e202..c085af79c 100644
--- a/util-linux/fdisk_gpt.c
+++ b/util-linux/fdisk_gpt.c
@@ -178,7 +178,7 @@ check_gpt_label(void)
G.gpt_hdr->hdr_crc32 = 0;
if (gpt_crc32(G.gpt_hdr, SWAP_LE32(G.gpt_hdr->hdr_size)) != crc) {
/* FIXME: read the backup table */
- puts("\nwarning: GPT header CRC is invalid\n");
+ puts("\nwarning: GPT header CRC is invalid");
}
G.gpt_n_parts = SWAP_LE32(G.gpt_hdr->n_parts);
@@ -187,7 +187,7 @@ check_gpt_label(void)
|| G.gpt_part_entry_len > GPT_MAX_PART_ENTRY_LEN
|| SWAP_LE32(G.gpt_hdr->hdr_size) > sector_size
) {
- puts("\nwarning: can't parse GPT disklabel\n");
+ puts("\nwarning: can't parse GPT disklabel");
current_label_type = LABEL_DOS;
return 0;
}
@@ -201,10 +201,10 @@ check_gpt_label(void)
if (gpt_crc32(G.gpt_part_array, part_array_len) != G.gpt_hdr->part_array_crc32) {
/* FIXME: read the backup table */
- puts("\nwarning: GPT array CRC is invalid\n");
+ puts("\nwarning: GPT array CRC is invalid");
}
- puts("Found valid GPT with protective MBR; using GPT\n");
+ puts("Found valid GPT with protective MBR; using GPT");
current_label_type = LABEL_GPT;
return 1;
diff --git a/util-linux/fdisk_osf.c b/util-linux/fdisk_osf.c
index 5d6b4cbcf..f34390e01 100644
--- a/util-linux/fdisk_osf.c
+++ b/util-linux/fdisk_osf.c
@@ -280,7 +280,7 @@ static struct bsd_globals *bsd_globals_ptr;
/* Code */
#define bsd_cround(n) \
- (display_in_cyl_units ? ((n)/xbsd_dlabel.d_secpercyl) + 1 : (n))
+ (DISPLAY_IN_CYL_UNITS ? ((n)/xbsd_dlabel.d_secpercyl) + 1 : (n))
/*
* Test whether the whole disk has BSD disk label magic.
@@ -472,7 +472,7 @@ xbsd_new_part(void)
begin = read_int(bsd_cround(begin), bsd_cround(begin), bsd_cround(end),
0, mesg);
- if (display_in_cyl_units)
+ if (DISPLAY_IN_CYL_UNITS)
begin = (begin - 1) * xbsd_dlabel.d_secpercyl;
snprintf(mesg, sizeof(mesg), "Last %s or +size or +sizeM or +sizeK",
@@ -480,7 +480,7 @@ xbsd_new_part(void)
end = read_int(bsd_cround(begin), bsd_cround(end), bsd_cround(end),
bsd_cround(begin), mesg);
- if (display_in_cyl_units)
+ if (DISPLAY_IN_CYL_UNITS)
end = end * xbsd_dlabel.d_secpercyl - 1;
xbsd_dlabel.d_partitions[i].p_size = end - begin + 1;
@@ -541,7 +541,7 @@ xbsd_print_disklabel(int show_all)
pp = lp->d_partitions;
for (i = 0; i < lp->d_npartitions; i++, pp++) {
if (pp->p_size) {
- if (display_in_cyl_units && lp->d_secpercyl) {
+ if (DISPLAY_IN_CYL_UNITS && lp->d_secpercyl) {
printf(" %c: %8lu%c %8lu%c %8lu%c ",
'a' + i,
(unsigned long) pp->p_offset / lp->d_secpercyl + 1,
diff --git a/util-linux/fdisk_sgi.c b/util-linux/fdisk_sgi.c
index 656cb02fc..000178049 100644
--- a/util-linux/fdisk_sgi.c
+++ b/util-linux/fdisk_sgi.c
@@ -735,7 +735,7 @@ sgi_add_partition(int n, int sys)
first = read_int(scround(first), scround(first), scround(last)-1,
0, mesg);
}
- if (display_in_cyl_units)
+ if (DISPLAY_IN_CYL_UNITS)
first *= units_per_sector;
else
first = first; /* align to cylinder if you know how ... */
@@ -749,7 +749,7 @@ sgi_add_partition(int n, int sys)
snprintf(mesg, sizeof(mesg), " Last %s", str_units());
last = read_int(scround(first), scround(last)-1, scround(last)-1,
scround(first), mesg)+1;
- if (display_in_cyl_units)
+ if (DISPLAY_IN_CYL_UNITS)
last *= units_per_sector;
else
last = last; /* align to cylinder if You know how ... */
diff --git a/util-linux/fdisk_sun.c b/util-linux/fdisk_sun.c
index e9b9ffd11..aab0a9825 100644
--- a/util-linux/fdisk_sun.c
+++ b/util-linux/fdisk_sun.c
@@ -504,7 +504,7 @@ add_sun_partition(int n, int sys)
else
first = read_int(scround(start), scround(stop)+1,
scround(stop), 0, mesg);
- if (display_in_cyl_units) {
+ if (DISPLAY_IN_CYL_UNITS) {
first *= units_per_sector;
} else {
/* Starting sector has to be properly aligned */
@@ -562,7 +562,7 @@ and is of type 'Whole disk'\n");
else
last = read_int(scround(first), scround(stop), scround(stop),
scround(first), mesg);
- if (display_in_cyl_units)
+ if (DISPLAY_IN_CYL_UNITS)
last *= units_per_sector;
if (n == 2 && !first) {
if (last >= stop2) {
More information about the busybox-cvs
mailing list