]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libfdisk: add fdisk_get_devmodel() and fdisk_get_devno()
authorKarel Zak <kzak@redhat.com>
Thu, 30 Aug 2018 12:01:46 +0000 (14:01 +0200)
committerKarel Zak <kzak@redhat.com>
Thu, 30 Aug 2018 12:01:46 +0000 (14:01 +0200)
Signed-off-by: Karel Zak <kzak@redhat.com>
libfdisk/docs/libfdisk-sections.txt
libfdisk/src/context.c
libfdisk/src/fdiskP.h
libfdisk/src/libfdisk.h.in
libfdisk/src/libfdisk.sym

index ecc37caf4f7bb6f1b40cd2b97faa540c7882ead8..4b9d92e18489c81d1cd57c1c70c80237810a8c0d 100644 (file)
@@ -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
index 779a9a889c2971fd8a57daa8054b91a322de9560..ad5f99de49e7f34574b0a2bec59bd7c841cfc5cf 100644 (file)
@@ -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
index bf2f60e083f101245c7f8dfd5a704ae1defb7c45..19c1c79536fcbfe978622db73f51fc5d6e3203da 100644 (file)
@@ -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/<name>/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 */
index 0f8ecd96f0ad87257e1b91ea20341355789cbafe..6f5188d3f91caf0ef2edba580f234e5f7458a625 100644 (file)
@@ -28,6 +28,7 @@ extern "C" {
 #include <stdio.h>
 #include <stdarg.h>
 #include <stdint.h>
+#include <sys/types.h>
 
 /**
  * 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);
index c9f35bebb8b4d98b945d923e738240ed2c1dba64..8f80d7964e995adff36536254fd6ca4e1f74034c 100644 (file)
@@ -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;