diff options
-rw-r--r-- | disk-utils/fdisk.c | 9 | ||||
-rw-r--r-- | disk-utils/sfdisk.c | 10 | ||||
-rw-r--r-- | libfdisk/docs/libfdisk-sections.txt | 2 | ||||
-rw-r--r-- | libfdisk/src/context.c | 29 | ||||
-rw-r--r-- | libfdisk/src/fdiskP.h | 2 | ||||
-rw-r--r-- | libfdisk/src/libfdisk.h.in | 6 | ||||
-rw-r--r-- | libfdisk/src/libfdisk.sym | 2 | ||||
-rw-r--r-- | libfdisk/src/partition.c | 23 |
8 files changed, 72 insertions, 11 deletions
diff --git a/disk-utils/fdisk.c b/disk-utils/fdisk.c index bc1a231e3..6f20a310f 100644 --- a/disk-utils/fdisk.c +++ b/disk-utils/fdisk.c @@ -648,6 +648,7 @@ static void __attribute__ ((__noreturn__)) usage(FILE *out) fputs(_(" -t, --type <type> recognize specified partition table type only\n"), out); fputs(_(" -u, --units[=<unit>] display units: 'cylinders' or 'sectors' (default)\n"), out); fputs(_(" -s, --getsz display device size in 512-byte sectors [DEPRECATED]\n"), out); + fputs(_(" --bytes print SIZE in bytes rather than in human readable format\n"), out); fputs(USAGE_SEPARATOR, out); fputs(_(" -C, --cylinders <number> specify the number of cylinders\n"), out); @@ -677,8 +678,11 @@ int main(int argc, char **argv) int colormode = UL_COLORMODE_UNDEF; struct fdisk_context *cxt; char *outarg = NULL; - + enum { + OPT_BYTES = CHAR_MAX + 1 + }; static const struct option longopts[] = { + { "bytes", no_argument, NULL, OPT_BYTES }, { "color", optional_argument, NULL, 'L' }, { "compatibility", optional_argument, NULL, 'c' }, { "cylinders", required_argument, NULL, 'C' }, @@ -798,6 +802,9 @@ int main(int argc, char **argv) return EXIT_SUCCESS; case 'h': usage(stdout); + case OPT_BYTES: + fdisk_set_size_unit(cxt, FDISK_SIZEUNIT_BYTES); + break; default: usage(stderr); } diff --git a/disk-utils/sfdisk.c b/disk-utils/sfdisk.c index 499dd8f64..d609c55a6 100644 --- a/disk-utils/sfdisk.c +++ b/disk-utils/sfdisk.c @@ -1335,6 +1335,7 @@ static void __attribute__ ((__noreturn__)) usage(FILE *out) fputs(USAGE_OPTIONS, out); fputs(_(" -A, --append append partitions to existing partition table\n"), out); + fputs(_(" --bytes print SIZE in bytes rather than in human readable format\n"), out); fputs(_(" -b, --backup backup partition table sectors (see -O)\n"), out); fputs(_(" -f, --force disable all consistency checking\n"), out); fputs(_(" -o, --output <list> output columns\n"), out); @@ -1378,6 +1379,7 @@ int main(int argc, char *argv[]) OPT_PARTLABEL, OPT_PARTTYPE, OPT_PARTATTRS, + OPT_BYTES }; static const struct option longopts[] = { @@ -1385,6 +1387,7 @@ int main(int argc, char *argv[]) { "append", no_argument, NULL, 'A' }, { "backup", no_argument, NULL, 'b' }, { "backup-file", required_argument, NULL, 'O' }, + { "bytes", no_argument, NULL, OPT_BYTES }, { "dump", no_argument, NULL, 'd' }, { "help", no_argument, NULL, 'h' }, { "force", no_argument, NULL, 'f' }, @@ -1422,6 +1425,8 @@ int main(int argc, char *argv[]) textdomain(PACKAGE); atexit(close_stdout); + sfdisk_init(sf); + while ((c = getopt_long(argc, argv, "aAbcdfghlLo:O:nN:qsTu:vVX:Y:", longopts, &longidx)) != -1) { switch(c) { @@ -1517,13 +1522,14 @@ int main(int argc, char *argv[]) case OPT_NOREREAD: sf->noreread = 1; break; - + case OPT_BYTES: + fdisk_set_size_unit(sf->cxt, FDISK_SIZEUNIT_BYTES); + break; default: usage(stderr); } } - sfdisk_init(sf); if (outarg) init_fields(NULL, outarg, NULL); diff --git a/libfdisk/docs/libfdisk-sections.txt b/libfdisk/docs/libfdisk-sections.txt index cd0f7238e..fdfeb8a4c 100644 --- a/libfdisk/docs/libfdisk-sections.txt +++ b/libfdisk/docs/libfdisk-sections.txt @@ -295,6 +295,7 @@ fdisk_get_optimal_iosize fdisk_get_parent fdisk_get_physector_size fdisk_get_sector_size +fdisk_get_size_unit FDISK_PLURAL FDISK_SINGULAR fdisk_get_unit @@ -309,6 +310,7 @@ fdisk_new_nested_context fdisk_ref_context fdisk_set_first_lba fdisk_set_last_lba +sdisk_set_size_unit fdisk_set_unit fdisk_unref_context fdisk_use_cylinders diff --git a/libfdisk/src/context.c b/libfdisk/src/context.c index 671c0ac7d..94a0fb659 100644 --- a/libfdisk/src/context.c +++ b/libfdisk/src/context.c @@ -923,6 +923,35 @@ fdisk_sector_t fdisk_set_last_lba(struct fdisk_context *cxt, fdisk_sector_t lba) return 0; } +/** + * fdisk_set_size_unit: + * @cxt: fdisk context + * @unit: FDISK_SIZEUNIT_* + * + * Sets unit for SIZE output field (see fdisk_partition_to_string()). + * + * Returns: 0 on success, <0 on error. + */ +int fdisk_set_size_unit(struct fdisk_context *cxt, int unit) +{ + assert(cxt); + cxt->sizeunit = unit; + return 0; +} + +/** + * fdisk_get_size_unit: + * @cxt: fdisk context + * + * Gets unit for SIZE output field (see fdisk_partition_to_string()). + * + * Returns: unit + */ +int fdisk_get_size_units(struct fdisk_context *cxt) +{ + assert(cxt); + return cxt->sizeunit; +} /** * fdisk_get_nsectors: diff --git a/libfdisk/src/fdiskP.h b/libfdisk/src/fdiskP.h index b169a9ffb..59ab0c339 100644 --- a/libfdisk/src/fdiskP.h +++ b/libfdisk/src/fdiskP.h @@ -351,6 +351,8 @@ struct fdisk_context { display_details : 1, /* expert display mode */ listonly : 1; /* list partition, nothing else */ + int sizeunit; /* SIZE fields, FDISK_SIZEUNIT_* */ + /* alignment */ unsigned long grain; /* alignment unit */ fdisk_sector_t first_lba; /* recommended begin of the first partition */ diff --git a/libfdisk/src/libfdisk.h.in b/libfdisk/src/libfdisk.h.in index d2d84f539..d15d64f1c 100644 --- a/libfdisk/src/libfdisk.h.in +++ b/libfdisk/src/libfdisk.h.in @@ -204,6 +204,12 @@ unsigned int fdisk_get_geom_heads(struct fdisk_context *cxt); fdisk_sector_t fdisk_get_geom_sectors(struct fdisk_context *cxt); fdisk_sector_t fdisk_get_geom_cylinders(struct fdisk_context *cxt); +enum { + FDISK_SIZEUNIT_HUMAN = 0, /* default, human readable {M,G,P,...} */ + FDISK_SIZEUNIT_BYTES /* bytes */ +}; +int fdisk_set_size_unit(struct fdisk_context *cxt, int unit); +int fdisk_get_size_unit(struct fdisk_context *cxt); /* parttype.c */ diff --git a/libfdisk/src/libfdisk.sym b/libfdisk/src/libfdisk.sym index e8dbfd501..d8c4f66e7 100644 --- a/libfdisk/src/libfdisk.sym +++ b/libfdisk/src/libfdisk.sym @@ -84,6 +84,7 @@ global: fdisk_get_physector_size; fdisk_get_script; fdisk_get_sector_size; + fdisk_get_size_unit; fdisk_get_unit; fdisk_get_units_per_sector; fdisk_gpt_is_hybrid; @@ -204,6 +205,7 @@ global: fdisk_set_partition; fdisk_set_partition_type; fdisk_set_script; + fdisk_set_size_unit; fdisk_set_unit; fdisk_sgi_create_info; fdisk_sgi_set_bootfile; diff --git a/libfdisk/src/partition.c b/libfdisk/src/partition.c index f6305c07d..ba9f597a3 100644 --- a/libfdisk/src/partition.c +++ b/libfdisk/src/partition.c @@ -699,14 +699,21 @@ int fdisk_partition_to_string(struct fdisk_partition *pa, if (fdisk_partition_has_size(pa)) { uint64_t sz = pa->size * cxt->sector_size; - if (fdisk_is_details(cxt)) { - rc = pa->size_post ? - asprintf(&p, "%ju%c", sz, pa->size_post) : - asprintf(&p, "%ju", sz); - } else { - p = size_to_human_string(SIZE_SUFFIX_1LETTER, sz); - if (!p) - rc = -ENOMEM; + switch (cxt->sizeunit) { + case FDISK_SIZEUNIT_BYTES: + rc = asprintf(&p, "%ju", sz); + break; + case FDISK_SIZEUNIT_HUMAN: + if (fdisk_is_details(cxt)) + rc = pa->size_post ? + asprintf(&p, "%ju%c", sz, pa->size_post) : + asprintf(&p, "%ju", sz); + else { + p = size_to_human_string(SIZE_SUFFIX_1LETTER, sz); + if (!p) + rc = -ENOMEM; + } + break; } } break; |