[Libguestfs] [PATCH v4 1/9] lib/osinfo.c: Extract xml processing into a callback
Cedric Bosdonnat
cbosdonnat at suse.com
Thu Mar 9 10:44:36 UTC 2017
On Wed, 2017-03-08 at 18:45 +0100, Pino Toscano wrote:
> On Tuesday, 7 March 2017 15:26:57 CET Cédric Bosdonnat wrote:
> > In order to further reuse the osinfo database parsing in OCAML, this
> > commit extracts the XML processing for the distro ISOs and places it
> > into a newly created callback.
> >
> > This will later help other code to traverse the osinfo DB files and
> > let them extract what they need from them.
> > ---
>
> Mostly LGTM, just a couple of style issues.
>
> > lib/osinfo.c | 85 +++++++++++++++++++++++++++++++-----------------------------
> > 1 file changed, 44 insertions(+), 41 deletions(-)
> >
> > diff --git a/lib/osinfo.c b/lib/osinfo.c
> > index ea2a7659a..121fac1ba 100644
> > --- a/lib/osinfo.c
> > +++ b/lib/osinfo.c
> > @@ -52,6 +52,7 @@
> > #include <string.h>
> > #include <unistd.h>
> > #include <dirent.h>
> > +#include <errno.h>
> > #include <assert.h>
> > #include <sys/types.h>
> > #include <libintl.h>
> > @@ -71,10 +72,14 @@ gl_lock_define_initialized (static, osinfo_db_lock);
> > static ssize_t osinfo_db_size = 0; /* 0 = unread, -1 = error, >= 1 = #records */
> > static struct osinfo *osinfo_db = NULL;
> >
> > -static int read_osinfo_db (guestfs_h *g);
> > -static void free_osinfo_db_entry (struct osinfo *);
> > -
> > #define XMLSTREQ(a,b) (xmlStrEqual((a),(b)) == 1)
> > +typedef int (*read_osinfo_db_callback) (guestfs_h *g, const char *path, void *opaque);
> > +
> > +static int
> > +read_osinfo_db (guestfs_h *g,
> > + read_osinfo_db_callback callback, void *opaque);
>
> Forward declarations in a single line please. (Actual implementations
> are fine as wrapped.)
>
> > +static int read_osinfo_db_xml (guestfs_h *g, const char *pathname, void *data);
>
> This forward declaration could stay where it was before (i.e. below).
>
> > +static void free_osinfo_db_entry (struct osinfo *);
> >
> > /* Given one or more fields from the header of a CD/DVD/ISO, look up
> > * the media in the libosinfo database and return our best guess for
> > @@ -87,14 +92,24 @@ static void free_osinfo_db_entry (struct osinfo *);
> > */
> > int
> > guestfs_int_osinfo_map (guestfs_h *g, const struct guestfs_isoinfo *isoinfo,
> > - const struct osinfo **osinfo_ret)
> > + const struct osinfo **osinfo_ret)
>
> Extra indentation change.
No, just tabs replaced by spaces
All other changes are already made in my local copy.
--
Cedric
> > {
> > size_t i;
> >
> > /* We only need to lock the database when reading it for the first time. */
> > gl_lock_lock (osinfo_db_lock);
> > if (osinfo_db_size == 0) {
> > - if (read_osinfo_db (g) == -1) {
> > + if (read_osinfo_db (g, read_osinfo_db_xml, NULL) == -1) {
> > + /* Fatal error: free any database entries which have been read, and
> > + * mark the database as having a permanent error.
> > + */
> > + if (osinfo_db_size > 0) {
> > + for (i = 0; i < (size_t) osinfo_db_size; ++i)
> > + free_osinfo_db_entry (&osinfo_db[i]);
> > + }
> > + free (osinfo_db);
> > + osinfo_db = NULL;
> > + osinfo_db_size = -1;
> > gl_lock_unlock (osinfo_db_lock);
> > return -1;
> > }
> > @@ -156,19 +171,18 @@ guestfs_int_osinfo_map (guestfs_h *g, const struct guestfs_isoinfo *isoinfo,
> > * Try to use the shared osinfo database layout (and location) first:
> > * https://gitlab.com/libosinfo/libosinfo/blob/master/docs/database-layout.txt
> > */
> > -static int read_osinfo_db_xml (guestfs_h *g, const char *filename);
> > -
> > -static int read_osinfo_db_flat (guestfs_h *g, const char *directory);
> > -static int read_osinfo_db_three_levels (guestfs_h *g, const char *directory);
> > -static int read_osinfo_db_directory (guestfs_h *g, const char *directory);
> > +static int read_osinfo_db_flat (guestfs_h *g, const char *directory,
> > + read_osinfo_db_callback callback, void *opaque);
> > +static int read_osinfo_db_three_levels (guestfs_h *g, const char *directory,
> > + read_osinfo_db_callback callback, void *opaque);
> > +static int read_osinfo_db_directory (guestfs_h *g, const char *directory,
> > + read_osinfo_db_callback callback, void *opaque);
>
> Ditto (wrapping).
>
> Thanks,
> _______________________________________________
> Libguestfs mailing list
> Libguestfs at redhat.com
> https://www.redhat.com/mailman/listinfo/libguestfs
More information about the Libguestfs
mailing list