Signed-off-by: Fabiano FidĂȘncio <fidencio(a)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 0d0bdd9..289a85d 100644
--- a/tools/osinfo-db-import.c
+++ b/tools/osinfo-db-import.c
@@ -135,6 +135,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 the \"%s\" file: %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)
@@ -145,6 +194,8 @@ static int osinfo_db_import_extract(GFile *target,
int r;
GFile *file = NULL;
GError *err = NULL;
+ gchar *source_file = NULL;
+ const gchar *uri_schemes[] = {"ftp", "http", NULL};
arc = archive_read_new();
@@ -154,9 +205,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++) {
+ 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;
+ } 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;
}
@@ -166,7 +245,7 @@ static int osinfo_db_import_extract(GFile *target,
break;
if (r != ARCHIVE_OK) {
g_printerr("%s: cannot read next archive entry in %s: %s\n",
- argv0, source, archive_error_string(arc));
+ argv0, source_file, archive_error_string(arc));
goto cleanup;
}
@@ -180,7 +259,7 @@ static int osinfo_db_import_extract(GFile *target,
if (archive_read_close(arc) != ARCHIVE_OK) {
g_printerr("%s: cannot finish reading archive %s: %s\n",
- argv0, source, archive_error_string(arc));
+ argv0, source_file, archive_error_string(arc));
goto cleanup;
}
@@ -191,6 +270,7 @@ static int osinfo_db_import_extract(GFile *target,
g_error_free(err);
if (file)
g_object_unref(file);
+ g_free(source_file);
return ret;
}
--
2.19.1