From fdb006e8b5f525ebab5a0766c9005402eee194e2 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Thu, 4 Sep 2014 12:07:44 +0200 Subject: fdisk: move --list functionality to separated file Signed-off-by: Karel Zak --- disk-utils/fdisk.c | 220 +---------------------------------------------------- 1 file changed, 2 insertions(+), 218 deletions(-) (limited to 'disk-utils/fdisk.c') diff --git a/disk-utils/fdisk.c b/disk-utils/fdisk.c index c61e26399..212a79dfb 100644 --- a/disk-utils/fdisk.c +++ b/disk-utils/fdisk.c @@ -30,13 +30,14 @@ #include "rpmatch.h" #include "blkdev.h" #include "mbsalign.h" -#include "fdisk.h" #include "pathnames.h" #include "canonicalize.h" #include "strutils.h" #include "closestream.h" #include "sysfs.h" +#include "fdisk.h" + #include "pt-sun.h" /* to toggle flags */ #ifdef HAVE_LINUX_COMPILER_H @@ -515,156 +516,6 @@ void change_partition_type(struct fdisk_context *cxt) fdisk_unref_partition(pa); } -void list_disk_geometry(struct fdisk_context *cxt) -{ - char *id = NULL; - struct fdisk_label *lb = fdisk_get_label(cxt, NULL); - uint64_t bytes = fdisk_get_nsectors(cxt) * fdisk_get_sector_size(cxt); - char *strsz = size_to_human_string(SIZE_SUFFIX_SPACE - | SIZE_SUFFIX_3LETTER, bytes); - - fdisk_info(cxt, _("Disk %s: %s, %ju bytes, %ju sectors"), - fdisk_get_devname(cxt), strsz, - bytes, (uintmax_t) fdisk_get_nsectors(cxt)); - free(strsz); - - if (lb && (fdisk_label_require_geometry(lb) || fdisk_use_cylinders(cxt))) - fdisk_info(cxt, _("Geometry: %d heads, %llu sectors/track, %llu cylinders"), - fdisk_get_geom_heads(cxt), - fdisk_get_geom_sectors(cxt), - fdisk_get_geom_cylinders(cxt)); - - fdisk_info(cxt, _("Units: %s of %d * %ld = %ld bytes"), - fdisk_get_unit(cxt, FDISK_PLURAL), - fdisk_get_units_per_sector(cxt), - fdisk_get_sector_size(cxt), - fdisk_get_units_per_sector(cxt) * fdisk_get_sector_size(cxt)); - - fdisk_info(cxt, _("Sector size (logical/physical): %lu bytes / %lu bytes"), - fdisk_get_sector_size(cxt), - fdisk_get_physector_size(cxt)); - fdisk_info(cxt, _("I/O size (minimum/optimal): %lu bytes / %lu bytes"), - fdisk_get_minimal_iosize(cxt), - fdisk_get_optimal_iosize(cxt)); - if (fdisk_get_alignment_offset(cxt)) - fdisk_info(cxt, _("Alignment offset: %lu bytes"), - fdisk_get_alignment_offset(cxt)); - if (fdisk_has_label(cxt)) - fdisk_info(cxt, _("Disklabel type: %s"), - fdisk_label_get_name(lb)); - - if (fdisk_get_disklabel_id(cxt, &id) == 0 && id) - fdisk_info(cxt, _("Disk identifier: %s"), id); -} - -void list_disklabel(struct fdisk_context *cxt) -{ - struct fdisk_table *tb = NULL; - struct fdisk_partition *pa = NULL; - struct fdisk_iter *itr = NULL; - struct fdisk_label *lb; - struct libscols_table *out = NULL; - const char *bold = NULL; - int *ids = NULL; /* IDs of fdisk_fields */ - size_t nids = 0, i; - - /* print label specific stuff by libfdisk FDISK_ASK_INFO API */ - fdisk_list_disklabel(cxt); - - /* get partitions and generate output */ - if (fdisk_get_partitions(cxt, &tb) || fdisk_table_get_nents(tb) <= 0) - goto done; - - if (fdisk_label_get_fields_ids(NULL, cxt, &ids, &nids)) - goto done; - - itr = fdisk_new_iter(FDISK_ITER_FORWARD); - if (!itr) { - fdisk_warn(cxt, _("faild to allocate iterator")); - goto done; - } - - out = scols_new_table(); - if (!out) { - fdisk_warn(cxt, _("faild to allocate output table")); - goto done; - } - - if (colors_wanted()) { - scols_table_enable_colors(out, 1); - bold = color_scheme_get_sequence("header", UL_COLOR_BOLD); - } - - lb = fdisk_get_label(cxt, NULL); - assert(lb); - - /* define output table columns */ - for (i = 0; i < nids; i++) { - int fl = 0; - struct libscols_column *co; - const struct fdisk_field *field = - fdisk_label_get_field(lb, ids[i]); - if (!field) - goto done; - if (fdisk_field_is_number(field)) - fl |= SCOLS_FL_RIGHT; - if (fdisk_field_get_id(field) == FDISK_FIELD_TYPE) - fl |= SCOLS_FL_TRUNC; - - co = scols_table_new_column(out, - fdisk_field_get_name(field), - fdisk_field_get_width(field), fl); - if (!co) - goto done; - - /* set colum header color */ - if (bold) - scols_cell_set_color(scols_column_get_header(co), bold); - } - - /* fill-in output table */ - while (fdisk_table_next_partition(tb, itr, &pa) == 0) { - struct libscols_line *ln = scols_table_new_line(out, NULL); - - if (!ln) { - fdisk_warn(cxt, _("faild to allocate output line")); - goto done; - } - - for (i = 0; i < nids; i++) { - char *data = NULL; - - if (fdisk_partition_to_string(pa, cxt, ids[i], &data)) - continue; - scols_line_refer_data(ln, i, data); - } - } - - /* print */ - if (!scols_table_is_empty(out)) { - fputc('\n', stdout); - scols_print_table(out); - } - - - fputc('\n', stdout); - - /* print warnings */ - while (itr && fdisk_table_next_partition(tb, itr, &pa) == 0) { - if (!fdisk_lba_is_phy_aligned(cxt, fdisk_partition_get_start(pa))) - fdisk_warnx(cxt, _("Partition %zu does not start on physical sector boundary."), - fdisk_partition_get_partno(pa) + 1); - } - - if (fdisk_table_wrong_order(tb)) - fdisk_info(cxt, _("Partition table entries are not in disk order.")); -done: - free(ids); - scols_unref_table(out); - fdisk_unref_table(tb); - fdisk_free_iter(itr); -} - static size_t skip_empty(const unsigned char *buf, size_t i, size_t sz) { size_t next; @@ -753,73 +604,6 @@ void dump_disklabel(struct fdisk_context *cxt) dump_blkdev(cxt, name, offset, size, all); } -static int is_ide_cdrom_or_tape(char *device) -{ - int fd, ret; - - if ((fd = open(device, O_RDONLY)) < 0) - return 0; - ret = blkdev_is_cdrom(fd); - - close(fd); - return ret; -} - -static void print_device_pt(struct fdisk_context *cxt, char *device, int warnme) -{ - if (fdisk_assign_device(cxt, device, 1) != 0) { /* read-only */ - if (warnme || errno == EACCES) - warn(_("cannot open %s"), device); - return; - } - - list_disk_geometry(cxt); - - if (fdisk_has_label(cxt)) - list_disklabel(cxt); -} - -static void print_all_devices_pt(struct fdisk_context *cxt) -{ - FILE *f; - char line[128 + 1]; - - f = fopen(_PATH_PROC_PARTITIONS, "r"); - if (!f) { - warn(_("cannot open %s"), _PATH_PROC_PARTITIONS); - return; - } - - DBG(MISC, ul_debug("reading "_PATH_PROC_PARTITIONS)); - - while (fgets(line, sizeof(line), f)) { - char buf[PATH_MAX], *cn; - dev_t devno; - - if (sscanf(line, " %*d %*d %*d %128[^\n ]", buf) != 1) - continue; - - devno = sysfs_devname_to_devno(buf, NULL); - if (devno <= 0) - continue; - - if (sysfs_devno_is_lvm_private(devno) || - sysfs_devno_is_wholedisk(devno) <= 0) - continue; - - if (!sysfs_devno_to_devpath(devno, buf, sizeof(buf))) - continue; - - cn = canonicalize_path(buf); - if (!cn) - continue; - if (!is_ide_cdrom_or_tape(cn)) - print_device_pt(cxt, cn, 0); - free(cn); - } - fclose(f); -} - static sector_t get_dev_blocks(char *dev) { int fd, ret; -- cgit v1.2.3-55-g7522