libblkid-tiny: add functions for allocating & freeing probe struct
authorRafał Miłecki <rafal@milecki.pl>
Sat, 14 Dec 2019 21:55:00 +0000 (22:55 +0100)
committerRafał Miłecki <rafal@milecki.pl>
Fri, 20 Dec 2019 06:43:15 +0000 (07:43 +0100)
This adds blkid_new_probe() and blkid_free_probe() which have to be used
in place of simple struct memory allocation. They will allow extending
probe struct by any extra initialization code and resources release.

Newly introduced probe.c file is based on original libblkid's code.

Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
CMakeLists.txt
libblkid-tiny/libblkid-tiny.h
libblkid-tiny/probe.c [new file with mode: 0644]
probe.c

index 7f13c4fd3eca9c54c9674472a74febd4bb55034f..a586577d07ee0d1588a30218baf4435d0153b03c 100644 (file)
@@ -22,6 +22,7 @@ ADD_LIBRARY(blkid-tiny SHARED
                libblkid-tiny/encode.c
                libblkid-tiny/libblkid-tiny.c
                libblkid-tiny/mkdev.c
+               libblkid-tiny/probe.c
                libblkid-tiny/ext.c
                libblkid-tiny/jffs2.c
                libblkid-tiny/vfat.c
index 419d5dbf1255c242e55291b34abf1175cc445af3..06ff94bf8a662c357ca4f2d7c5cd9e5bc19adab8 100644 (file)
@@ -60,6 +60,9 @@ struct blkid_struct_probe
        char    version[64];
 };
 
+struct blkid_struct_probe *blkid_new_probe(void);
+void blkid_free_probe(struct blkid_struct_probe *pr);
+
 extern int probe_block(char *block, struct blkid_struct_probe *pr);
 extern int mkblkdev(void);
 
diff --git a/libblkid-tiny/probe.c b/libblkid-tiny/probe.c
new file mode 100644 (file)
index 0000000..54e22dc
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Low-level libblkid probing API
+ *
+ * Copyright (C) 2008-2009 Karel Zak <kzak@redhat.com>
+ *
+ * This file may be redistributed under the terms of the
+ * GNU Lesser General Public License.
+ */
+
+#include <stdlib.h>
+
+#include "libblkid-tiny.h"
+
+struct blkid_struct_probe *blkid_new_probe(void)
+{
+       struct blkid_struct_probe *pr;
+
+       pr = calloc(1, sizeof(struct blkid_struct_probe));
+       if (!pr)
+               return NULL;
+
+       return pr;
+}
+
+void blkid_free_probe(struct blkid_struct_probe *pr)
+{
+       if (!pr)
+               return;
+
+       free(pr);
+}
diff --git a/probe.c b/probe.c
index 63d6f8c4ce945c7a7385935a929bb09d3788c18d..7d0e83133cf3e78ebd3ec0a5df904140d9768a16 100644 (file)
--- a/probe.c
+++ b/probe.c
@@ -21,34 +21,40 @@ static struct probe_info *
 probe_path_tiny(const char *path)
 {
        struct probe_info *info = NULL;
-       struct blkid_struct_probe pr = { };
+       struct blkid_struct_probe *pr;
        char *type, *dev, *uuid, *label, *version;
 
-       if (probe_block((char *)path, &pr) == 0 && pr.id && !pr.err) {
+       pr = blkid_new_probe();
+       if (!pr)
+               return NULL;
+
+       if (probe_block((char *)path, pr) == 0 && pr->id && !pr->err) {
                info = calloc_a(sizeof(*info),
-                               &type,    strlen(pr.id->name) + 1,
-                               &dev,     strlen(pr.dev)      + 1,
-                               &uuid,    strlen(pr.uuid)     + 1,
-                               &label,   strlen(pr.label)    + 1,
-                               &version, strlen(pr.version)  + 1);
+                               &type,    strlen(pr->id->name) + 1,
+                               &dev,     strlen(pr->dev)      + 1,
+                               &uuid,    strlen(pr->uuid)     + 1,
+                               &label,   strlen(pr->label)    + 1,
+                               &version, strlen(pr->version)  + 1);
 
                if (info) {
-                       info->type = strcpy(type, pr.id->name);
+                       info->type = strcpy(type, pr->id->name);
 
-                       if (pr.dev[0])
-                               info->dev = strcpy(dev, pr.dev);
+                       if (pr->dev[0])
+                               info->dev = strcpy(dev, pr->dev);
 
-                       if (pr.uuid[0])
-                               info->uuid = strcpy(uuid, pr.uuid);
+                       if (pr->uuid[0])
+                               info->uuid = strcpy(uuid, pr->uuid);
 
-                       if (pr.label[0])
-                               info->label = strcpy(label, pr.label);
+                       if (pr->label[0])
+                               info->label = strcpy(label, pr->label);
 
-                       if (pr.version[0])
-                               info->version = strcpy(version, pr.version);
+                       if (pr->version[0])
+                               info->version = strcpy(version, pr->version);
                }
        }
 
+       blkid_free_probe(pr);
+
        return info;
 }