[Libosinfo] [osinfo-db-tools PATCH v3 2/3] import: Learn how to deal with URLs
Fabiano Fidêncio
fidencio at redhat.com
Thu Dec 6 15:22:19 UTC 2018
On Thu, Dec 6, 2018 at 4:04 PM Daniel P. Berrangé <berrange at redhat.com> wrote:
>
> On Thu, Dec 06, 2018 at 04:01:44PM +0100, Fabiano Fidêncio wrote:
> > Signed-off-by: Fabiano Fidêncio <fidencio at redhat.com>
> > ---
> > tools/osinfo-db-import.c | 88 ++++++++++++++++++++++++++++++++++++++--
> > 1 file changed, 84 insertions(+), 4 deletions(-)
> >
> > diff --git a/tools/osinfo-db-import.c b/tools/osinfo-db-import.c
> > index 72f21ba..77ef0b9 100644
> > --- a/tools/osinfo-db-import.c
> > +++ b/tools/osinfo-db-import.c
> > @@ -134,6 +134,55 @@ static GFile *osinfo_db_import_get_file(GFile *target,
> > return g_file_resolve_relative_path(target, tmp);
> > }
> >
> > +static int
> > +osinfo_db_import_download_file(const gchar *url,
> > + gchar **source_file)
> > +{
> > + GFile *in = NULL;
> > + GFile *out = NULL;
> > + GError *err = NULL;
> > + gchar *filename = NULL;
> > + GFileCopyFlags flags = G_FILE_COPY_OVERWRITE | G_FILE_COPY_BACKUP;
> > + int ret = -1;
> > +
> > + in = g_file_new_for_uri(url);
> > + if (in == NULL)
> > + return -1;
> > +
> > + filename = g_file_get_basename(in);
> > + if (filename == NULL)
> > + goto cleanup;
> > +
> > + *source_file = g_strdup_printf("%s/%s", g_get_user_cache_dir(), filename);
> > + if (*source_file == NULL)
> > + goto cleanup;
> > +
> > + out = g_file_new_for_path(*source_file);
> > + if (out == NULL)
> > + goto cleanup;
> > +
> > + if (!g_file_copy(in, out, flags, NULL, NULL, NULL, &err)) {
> > + g_printerr("Could not download file \"%s\": %s\n",
> > + url, err->message);
> > + goto cleanup;
> > + }
> > +
> > + ret = 0;
> > +
> > + cleanup:
> > + g_free(filename);
> > + if (in != NULL)
> > + g_object_unref(in);
> > + if (out != NULL)
> > + g_object_unref(out);
> > + if (err != NULL)
> > + g_error_free(err);
> > + if (ret != 0)
> > + unlink(*source_file);
> > +
> > + return ret;
> > +}
> > +
> > static int osinfo_db_import_extract(GFile *target,
> > const char *source,
> > gboolean verbose)
> > @@ -143,6 +192,8 @@ static int osinfo_db_import_extract(GFile *target,
> > int ret = -1;
> > int r;
> > GFile *file = NULL;
> > + gchar *source_file = NULL;
> > + const gchar *uri_schemes[] = {"ftp", "http", NULL};
> >
> > arc = archive_read_new();
> >
> > @@ -152,9 +203,37 @@ static int osinfo_db_import_extract(GFile *target,
> > if (source != NULL && g_str_equal(source, "-"))
> > source = NULL;
> >
> > - if ((r = archive_read_open_filename(arc, source, 10240)) != ARCHIVE_OK) {
> > + if (source != NULL) {
> > + gboolean download_file = FALSE;
> > +
> > + file = g_file_new_for_uri(source);
> > + if (file == NULL)
> > + goto cleanup;
> > +
> > + /* The supported uri schemes here are "ftp", "http" and "https".
> > + * However, "https" is not set as part of the array as it matches with
> > + * "http". */
> > + for (gint i = 0; uri_schemes[i] != NULL; i++) {
>
> s/gint/gsize/ for array indexes
Which also reminds me to avoid declarations inside the for loop.
>
> > + if (g_file_has_uri_scheme(file, uri_schemes[i])) {
> > + download_file = TRUE;
> > + break;
> > + }
> > + }
> > +
> > + if (download_file) {
> > + if (osinfo_db_import_download_file(source, &source_file) < 0)
> > + goto cleanup;
>
> Something needs to delete the file that this call downloads locally....
>
> > + } else {
> > + source_file = g_strdup(source);
> > + }
> > +
> > + if (source_file == NULL)
> > + goto cleanup;
> > + }
> > +
> > + if ((r = archive_read_open_filename(arc, source_file, 10240)) != ARCHIVE_OK) {
> > g_printerr("%s: cannot open archive %s: %s\n",
> > - argv0, source, archive_error_string(arc));
> > + argv0, source_file, archive_error_string(arc));
> > goto cleanup;
> > }
> >
>
> > @@ -187,6 +266,7 @@ static int osinfo_db_import_extract(GFile *target,
> > archive_read_free(arc);
> > if (file)
> > g_object_unref(file);
> > + g_free(source_file);
>
> ie unlink before here
>
> > return ret;
> > }
>
Do you want a v4 because of those changes or can I go ahead with the
first 2 patches after doing the fixes locally?
More information about the Libosinfo
mailing list