Browse Source

libblkid-tiny: add functions for allocating & freeing probe struct

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>
Rafał Miłecki 4 years ago
parent
commit
b82c5c109c
4 changed files with 57 additions and 16 deletions
  1. 1 0
      CMakeLists.txt
  2. 3 0
      libblkid-tiny/libblkid-tiny.h
  3. 31 0
      libblkid-tiny/probe.c
  4. 22 16
      probe.c

+ 1 - 0
CMakeLists.txt

@@ -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

+ 3 - 0
libblkid-tiny/libblkid-tiny.h

@@ -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);
 

+ 31 - 0
libblkid-tiny/probe.c

@@ -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);
+}

+ 22 - 16
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;
 }