From 745801e44ab01eef759b99372e5792d0eadf19ab Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Thu, 30 Aug 2018 14:01:46 +0200 Subject: libfdisk: add fdisk_get_devmodel() and fdisk_get_devno() Signed-off-by: Karel Zak --- libfdisk/docs/libfdisk-sections.txt | 2 ++ libfdisk/src/context.c | 50 +++++++++++++++++++++++++++++++++++++ libfdisk/src/fdiskP.h | 2 ++ libfdisk/src/libfdisk.h.in | 5 ++++ libfdisk/src/libfdisk.sym | 2 ++ 5 files changed, 61 insertions(+) (limited to 'libfdisk') diff --git a/libfdisk/docs/libfdisk-sections.txt b/libfdisk/docs/libfdisk-sections.txt index ecc37caf4..4b9d92e18 100644 --- a/libfdisk/docs/libfdisk-sections.txt +++ b/libfdisk/docs/libfdisk-sections.txt @@ -300,7 +300,9 @@ fdisk_disable_dialogs fdisk_get_alignment_offset fdisk_get_collision fdisk_get_devfd +fdisk_get_devmodel fdisk_get_devname +fdisk_get_devno fdisk_get_disklabel_item fdisk_get_first_lba fdisk_get_geom_cylinders diff --git a/libfdisk/src/context.c b/libfdisk/src/context.c index 779a9a889..ad5f99de4 100644 --- a/libfdisk/src/context.c +++ b/libfdisk/src/context.c @@ -112,6 +112,10 @@ static int init_nested_from_parent(struct fdisk_context *cxt, int isnew) cxt->protect_bootbits = parent->protect_bootbits; } + free(cxt->dev_model); + cxt->dev_model = NULL; + cxt->dev_model_probed = 0; + free(cxt->dev_path); cxt->dev_path = NULL; @@ -541,6 +545,10 @@ static void reset_context(struct fdisk_context *cxt) free(cxt->dev_path); cxt->dev_path = NULL; + free(cxt->dev_model); + cxt->dev_model = NULL; + cxt->dev_model_probed = 0; + free(cxt->collision); cxt->collision = NULL; @@ -1325,6 +1333,48 @@ const char *fdisk_get_devname(struct fdisk_context *cxt) return cxt->dev_path; } +/** + * fdisk_get_devno: + * @cxt: context + * + * Returns: device number or zero for non-block devices + */ +dev_t fdisk_get_devno(struct fdisk_context *cxt) +{ + assert(cxt); + return S_ISBLK(cxt->dev_st.st_mode) ? cxt->dev_st.st_rdev : 0; +} + +/** + * fdisk_get_devmodel: + * @cxt: context + * + * Returns: device model string or NULL. + */ +const char *fdisk_get_devmodel(struct fdisk_context *cxt) +{ +#ifdef __linux__ + assert(cxt); + + if (cxt->dev_model_probed) + return cxt->dev_model; + + if (fdisk_get_devno(cxt)) { + struct path_cxt *pc = ul_new_sysfs_path(fdisk_get_devno(cxt), NULL, NULL); + + if (pc) { + ul_path_read_string(pc, &cxt->dev_model, "device/model"); + ul_unref_path(pc); + } + } + cxt->dev_model_probed = 1; + return cxt->dev_model; +#else + return NULL; +#endif + +} + /** * fdisk_get_devfd: * @cxt: context diff --git a/libfdisk/src/fdiskP.h b/libfdisk/src/fdiskP.h index bf2f60e08..19c1c7953 100644 --- a/libfdisk/src/fdiskP.h +++ b/libfdisk/src/fdiskP.h @@ -365,6 +365,7 @@ struct fdisk_ask { struct fdisk_context { int dev_fd; /* device descriptor */ char *dev_path; /* device path */ + char *dev_model; /* on linux /sys/block//device/model or NULL */ struct stat dev_st; /* stat(2) result */ int refcount; @@ -387,6 +388,7 @@ struct fdisk_context { protect_bootbits : 1, /* don't zeroize first sector */ pt_collision : 1, /* another PT detected by libblkid */ no_disalogs : 1, /* disable dialog-driven partititoning */ + dev_model_probed : 1, /* tried to read from sys */ listonly : 1; /* list partition, nothing else */ char *collision; /* name of already existing FS/PT */ diff --git a/libfdisk/src/libfdisk.h.in b/libfdisk/src/libfdisk.h.in index 0f8ecd96f..6f5188d3f 100644 --- a/libfdisk/src/libfdisk.h.in +++ b/libfdisk/src/libfdisk.h.in @@ -28,6 +28,7 @@ extern "C" { #include #include #include +#include /** * LIBFDISK_VERSION: @@ -231,8 +232,12 @@ fdisk_sector_t fdisk_set_first_lba(struct fdisk_context *cxt, fdisk_sector_t lba fdisk_sector_t fdisk_get_last_lba(struct fdisk_context *cxt); fdisk_sector_t fdisk_set_last_lba(struct fdisk_context *cxt, fdisk_sector_t lba); fdisk_sector_t fdisk_get_nsectors(struct fdisk_context *cxt); + const char *fdisk_get_devname(struct fdisk_context *cxt); int fdisk_get_devfd(struct fdisk_context *cxt); +dev_t fdisk_get_devno(struct fdisk_context *cxt); +const char *fdisk_get_devmodel(struct fdisk_context *cxt); + unsigned int fdisk_get_geom_heads(struct fdisk_context *cxt); fdisk_sector_t fdisk_get_geom_sectors(struct fdisk_context *cxt); diff --git a/libfdisk/src/libfdisk.sym b/libfdisk/src/libfdisk.sym index c9f35bebb..8f80d7964 100644 --- a/libfdisk/src/libfdisk.sym +++ b/libfdisk/src/libfdisk.sym @@ -300,4 +300,6 @@ FDISK_2.32 { FDISK_2.33 { fdisk_ask_number_is_wrap_negative; + fdisk_get_devmodel; + fdisk_get_devno; } FDISK_2.32; -- cgit v1.2.3-55-g7522