static int sun_list_disklabel(struct fdisk_context *cxt) { struct sun_disklabel *sunlabel; assert(cxt); assert(cxt->label); assert(fdisk_is_label(cxt, SUN)); sunlabel = self_disklabel(cxt); if (fdisk_is_details(cxt)) { fdisk_info(cxt, _("Label geometry: %d rpm, %d alternate and %d physical cylinders,\n" " %d extra sects/cyl, interleave %d:1"), be16_to_cpu(sunlabel->rpm), be16_to_cpu(sunlabel->acyl), be16_to_cpu(sunlabel->pcyl), be16_to_cpu(sunlabel->apc), be16_to_cpu(sunlabel->intrlv)); fdisk_info(cxt, _("Label ID: %s"), sunlabel->label_id); fdisk_info(cxt, _("Volume ID: %s"), *sunlabel->vtoc.volume_id ? sunlabel->vtoc.volume_id : _("<none>")); } return 0; }
/** * fdisk_label_get_fields_ids * @lb: label (or NULL for the current label) * @ids: returns allocated array with FDISK_FIELD_* IDs * @nids: returns number of items in fields * * This function returns the default fields for the label. * * Note that the set of the default fields depends on fdisk_enable_details() * function. If the details are enabled then this function usually returns more * fields. * * Returns 0 on success, otherwise, a corresponding error. */ int fdisk_label_get_fields_ids( struct fdisk_label *lb, struct fdisk_context *cxt, int **ids, size_t *nids) { size_t i, n; int *c; assert(cxt); if (!lb) lb = cxt->label; if (!lb) return -EINVAL; if (!lb->fields || !lb->nfields) return -ENOSYS; c = calloc(lb->nfields, sizeof(int)); if (!c) return -ENOMEM; for (n = 0, i = 0; i < lb->nfields; i++) { int id = lb->fields[i].id; if ((fdisk_is_details(cxt) && (lb->fields[i].flags & FDISK_FIELDFL_EYECANDY)) || (!fdisk_is_details(cxt) && (lb->fields[i].flags & FDISK_FIELDFL_DETAIL)) || (id == FDISK_FIELD_SECTORS && fdisk_use_cylinders(cxt)) || (id == FDISK_FIELD_CYLINDERS && !fdisk_use_cylinders(cxt))) continue; c[n++] = id; } if (ids) *ids = c; else free(c); if (nids) *nids = n; return 0; }
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); color_scheme_enable("header", UL_COLOR_BOLD); fdisk_info(cxt, _("Disk %s: %s, %ju bytes, %ju sectors"), fdisk_get_devname(cxt), strsz, bytes, (uintmax_t) fdisk_get_nsectors(cxt)); color_disable(); 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_is_details(cxt) && fdisk_get_disklabel_id(cxt, &id) == 0 && id) fdisk_info(cxt, _("Disk identifier: %s"), id); }
/** * fdisk_partition_to_string: * @pa: partition * @cxt: context * @id: field (FDISK_FIELD_*) * @data: returns string with allocated data * * Returns info about partition converted to printable string. * * For example * <informalexample> * <programlisting> * struct fdisk_parition *pa; * * fdisk_get_partition(cxt, 0, &pa); * fdisk_partition_to_string(pa, FDISK_FIELD_UUID, &data); * printf("first partition uuid: %s\n", data); * free(data); * fdisk_unref_partition(pa); * </programlisting> * </informalexample> * * returns UUID for the first partition. * * Returns: 0 on success, otherwise, a corresponding error. */ int fdisk_partition_to_string(struct fdisk_partition *pa, struct fdisk_context *cxt, int id, char **data) { char *p = NULL; int rc = 0; uint64_t x; if (!pa || !cxt || !data) return -EINVAL; switch (id) { case FDISK_FIELD_DEVICE: if (pa->freespace) p = strdup(_("Free space")); else if (fdisk_partition_has_partno(pa) && cxt->dev_path) { if (cxt->label->flags & FDISK_LABEL_FL_INCHARS_PARTNO) rc = asprintf(&p, "%c", (int) pa->partno + 'a'); else p = fdisk_partname(cxt->dev_path, pa->partno + 1); } break; case FDISK_FIELD_BOOT: p = fdisk_partition_is_bootable(pa) ? strdup("*") : NULL; break; case FDISK_FIELD_START: if (fdisk_partition_has_start(pa)) { x = fdisk_cround(cxt, pa->start); rc = pa->start_post ? asprintf(&p, "%ju%c", x, pa->start_post) : asprintf(&p, "%ju", x); } break; case FDISK_FIELD_END: if (fdisk_partition_has_end(pa)) { x = fdisk_cround(cxt, fdisk_partition_get_end(pa)); rc = pa->end_post ? asprintf(&p, "%ju%c", x, pa->end_post) : asprintf(&p, "%ju", x); } break; case FDISK_FIELD_SIZE: if (fdisk_partition_has_size(pa)) { uint64_t sz = pa->size * cxt->sector_size; 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; case FDISK_FIELD_CYLINDERS: rc = asprintf(&p, "%ju", (uintmax_t) fdisk_cround(cxt, fdisk_partition_has_size(pa) ? pa->size : 0)); break; case FDISK_FIELD_SECTORS: rc = asprintf(&p, "%ju", fdisk_partition_has_size(pa) ? (uintmax_t) pa->size : 0); break; case FDISK_FIELD_BSIZE: rc = asprintf(&p, "%ju", pa->bsize); break; case FDISK_FIELD_FSIZE: rc = asprintf(&p, "%ju", pa->fsize); break; case FDISK_FIELD_CPG: rc = asprintf(&p, "%ju", pa->cpg); break; case FDISK_FIELD_TYPE: p = pa->type && pa->type->name ? strdup(_(pa->type->name)) : NULL; break; case FDISK_FIELD_TYPEID: if (pa->type && fdisk_parttype_get_string(pa->type)) rc = asprintf(&p, "%s", fdisk_parttype_get_string(pa->type)); else if (pa->type) rc = asprintf(&p, "%x", fdisk_parttype_get_code(pa->type)); break; case FDISK_FIELD_UUID: p = pa->uuid && *pa->uuid? strdup(pa->uuid) : NULL; break; case FDISK_FIELD_NAME: p = pa->name && *pa->name ? strdup(pa->name) : NULL; break; case FDISK_FIELD_ATTR: p = pa->attrs && *pa->attrs ? strdup(pa->attrs) : NULL; break; case FDISK_FIELD_SADDR: p = pa->start_chs && *pa->start_chs ? strdup(pa->start_chs) : NULL; break; case FDISK_FIELD_EADDR: p = pa->end_chs && *pa->end_chs? strdup(pa->end_chs) : NULL; break; default: return -EINVAL; } if (rc < 0) { rc = -ENOMEM; free(p); p = NULL; } else if (rc > 0) rc = 0; *data = p; return rc; }