[virt-tools-list] [libosinfo 1/3] Every driver file in DB must provide MD5 checksum
Zeeshan Ali (Khattak)
zeeshanak at gnome.org
Wed Dec 12 01:21:28 UTC 2012
From: "Zeeshan Ali (Khattak)" <zeeshanak at gnome.org>
---
data/schemas/libosinfo.rng | 9 +++++++++
osinfo/osinfo_device_driver.c | 18 ++++++++++++++++++
osinfo/osinfo_device_driver_private.h | 3 +++
osinfo/osinfo_loader.c | 11 ++++++++---
4 files changed, 38 insertions(+), 3 deletions(-)
diff --git a/data/schemas/libosinfo.rng b/data/schemas/libosinfo.rng
index 51b0c20..819790a 100644
--- a/data/schemas/libosinfo.rng
+++ b/data/schemas/libosinfo.rng
@@ -415,6 +415,9 @@
</optional>
<zeroOrMore>
<element name='file'>
+ <attribute name="md5">
+ <ref name='md5'/>
+ </attribute>
<text/>
</element>
</zeroOrMore>
@@ -636,4 +639,10 @@
<param name="pattern">dos|unix</param>
</data>
</define>
+
+ <define name='md5'>
+ <data type="string">
+ <param name="pattern">[0-9a-fA-F]{32}</param>
+ </data>
+ </define>
</grammar>
diff --git a/osinfo/osinfo_device_driver.c b/osinfo/osinfo_device_driver.c
index 9a7e5e2..6b81170 100644
--- a/osinfo/osinfo_device_driver.c
+++ b/osinfo/osinfo_device_driver.c
@@ -50,6 +50,8 @@ G_DEFINE_TYPE (OsinfoDeviceDriver, osinfo_device_driver, OSINFO_TYPE_ENTITY);
struct _OsinfoDeviceDriverPrivate
{
OsinfoDeviceList *devices;
+
+ GHashTable *checksums;
};
static void
@@ -58,6 +60,7 @@ osinfo_device_driver_finalize (GObject *object)
OsinfoDeviceDriver *driver = OSINFO_DEVICE_DRIVER (object);
g_object_unref(driver->priv->devices);
+ g_hash_table_unref(driver->priv->checksums);
/* Chain up to the parent class */
G_OBJECT_CLASS (osinfo_device_driver_parent_class)->finalize (object);
@@ -80,6 +83,8 @@ osinfo_device_driver_init (OsinfoDeviceDriver *driver)
driver->priv = priv = OSINFO_DEVICE_DRIVER_GET_PRIVATE(driver);
priv->devices = osinfo_devicelist_new ();
+ driver->priv->checksums = g_hash_table_new_full(g_str_hash, g_str_equal,
+ g_free, g_free);
}
OsinfoDeviceDriver *osinfo_device_driver_new(const gchar *id)
@@ -172,6 +177,19 @@ void osinfo_device_driver_add_device(OsinfoDeviceDriver *driver,
OSINFO_ENTITY(device));
}
+void osinfo_device_driver_add_file(OsinfoDeviceDriver *driver,
+ const gchar *name,
+ const gchar *checksum)
+{
+ g_hash_table_replace(driver->priv->checksums,
+ g_strdup(name),
+ g_strdup(checksum));
+
+ osinfo_entity_add_param(OSINFO_ENTITY(driver),
+ OSINFO_DEVICE_DRIVER_PROP_FILE,
+ name);
+}
+
/*
* Local variables:
* indent-tabs-mode: nil
diff --git a/osinfo/osinfo_device_driver_private.h b/osinfo/osinfo_device_driver_private.h
index d49ffa1..6e54c61 100644
--- a/osinfo/osinfo_device_driver_private.h
+++ b/osinfo/osinfo_device_driver_private.h
@@ -29,6 +29,9 @@
OsinfoDeviceDriver *osinfo_device_driver_new(const gchar *id);
void osinfo_device_driver_add_device(OsinfoDeviceDriver *driver,
OsinfoDevice *device);
+void osinfo_device_driver_add_file(OsinfoDeviceDriver *driver,
+ const gchar *name,
+ const gchar *checksum);
#endif /* __OSINFO_DEVICE_DRIVER_PRIVATE_H__ */
diff --git a/osinfo/osinfo_loader.c b/osinfo/osinfo_loader.c
index 18325f6..f230395 100644
--- a/osinfo/osinfo_loader.c
+++ b/osinfo/osinfo_loader.c
@@ -971,9 +971,14 @@ static OsinfoDeviceDriver *osinfo_loader_driver(OsinfoLoader *loader,
nodes[i]->children->type == XML_TEXT_NODE &&
(strcmp((const gchar *)nodes[i]->name,
OSINFO_DEVICE_DRIVER_PROP_FILE) == 0)) {
- osinfo_entity_add_param(OSINFO_ENTITY(driver),
- (const gchar *)nodes[i]->name,
- (const gchar *)nodes[i]->children->content);
+ xmlChar *checksum = xmlGetProp(nodes[i], BAD_CAST "md5");
+ if (checksum == NULL)
+ continue; // Checksum is a must!
+
+ osinfo_device_driver_add_file(driver,
+ (const gchar *)nodes[i]->children->content,
+ (const gchar *)checksum);
+ xmlFree(checksum);
} else if (strcmp((const gchar *)nodes[i]->name,
OSINFO_DEVICE_DRIVER_PROP_DEVICE) == 0) {
xmlChar *device_id = xmlGetProp(nodes[i], BAD_CAST "id");
--
1.8.0.1
More information about the virt-tools-list
mailing list