#include "strutils.h"
#include "closestream.h"
#include "colors.h"
+#include "blkdev.h"
#include "libfdisk.h"
#include "fdisk-list.h"
ACT_CHANGE_ID,
ACT_DUMP,
ACT_LIST,
- ACT_LIST_SIZES,
ACT_LIST_TYPES,
+ ACT_SHOW_SIZE,
ACT_VERIFY
};
return rc;
}
-/* --list backend */
static int command_list_partitions(struct sfdisk *sf, int argc, char **argv)
{
- int i;
-
fdisk_enable_listonly(sf->cxt, 1);
if (argc) {
- int ct = 0;
+ int i, ct = 0;
for (i = 0; i < argc; i++) {
if (ct)
return 0;
}
+static int rdonly_open(const char *dev, int silent)
+{
+ int fd = open(dev, O_RDONLY);
+ if (fd < 0) {
+ if (!silent)
+ warn(_("cannot open: %s"), dev);
+ return -errno;
+ }
+ return fd;
+}
+
+static int get_size(const char *dev, int silent, uintmax_t *sz)
+{
+ int fd, rc = 0;
+
+ fd = rdonly_open(dev, silent);
+ if (fd < 0)
+ return -errno;
+
+ if (blkdev_get_sectors(fd, (unsigned long long *) sz) == -1) {
+ if (!silent)
+ warn(_("Cannot get size of %s"), dev);
+ rc = -errno;
+ }
+
+ close(fd);
+ return rc;
+}
+
+static int command_show_size(struct sfdisk *sf __attribute__((__unused__)),
+ int argc, char **argv)
+{
+ uintmax_t sz;
+
+ if (argc) {
+ int i;
+ for (i = 0; i < argc; i++) {
+ if (get_size(argv[i], 0, &sz) == 0)
+ printf("%ju\n", sz / 2);
+ }
+ } else {
+ FILE *f = NULL;
+ uintmax_t total = 0;
+ char *dev;
+
+ while ((dev = next_proc_partition(&f))) {
+ if (get_size(dev, 1, &sz) == 0) {
+ printf("%s: %9ju\n", dev, sz / 2);
+ total += sz / 2;
+ }
+ free(dev);
+ }
+ if (total)
+ printf(_("total: %ju blocks\n"), total);
+ }
+
+ return 0;
+}
+
static int command_dump(struct sfdisk *sf, int argc, char **argv)
{
const char *devname = NULL;
{ "list", no_argument, NULL, 'l' },
{ "dump", no_argument, NULL, 'd' },
{ "help", no_argument, NULL, 'h' },
+ { "show-size", no_argument, NULL, 's' },
{ "version", no_argument, NULL, 'v' },
{ NULL, 0, 0, 0 },
};
textdomain(PACKAGE);
atexit(close_stdout);
- while((c = getopt_long(argc, argv, "dhlv", longopts, NULL)) != -1) {
+ while ((c = getopt_long(argc, argv, "dhlsv", longopts, NULL)) != -1) {
switch(c) {
case 'h':
usage(stdout);
case 'd':
sf->act = ACT_DUMP;
break;
+ case 's':
+ sf->act = ACT_SHOW_SIZE;
+ break;
case 'v':
printf(_("%s from %s\n"), program_invocation_short_name,
PACKAGE_STRING);
case ACT_DUMP:
rc = command_dump(sf, argc - optind, argv + optind);
break;
+
+ case ACT_SHOW_SIZE:
+ rc = command_show_size(sf, argc - optind, argv + optind);
+ break;
}
sfdisk_deinit(sf);