[Libosinfo] [osinfo-db-tools PATCH v5 2/3] import: Learn how to deal with URLs
Fabiano Fidêncio
fidencio at redhat.com
Mon Dec 17 10:09:02 UTC 2018
Signed-off-by: Fabiano Fidêncio <fidencio at redhat.com>
---
tools/osinfo-db-import.c | 75 +++++++++++++++++++++++++++++++++++++---
1 file changed, 71 insertions(+), 4 deletions(-)
diff --git a/tools/osinfo-db-import.c b/tools/osinfo-db-import.c
index 72f21ba..5643f5d 100644
--- a/tools/osinfo-db-import.c
+++ b/tools/osinfo-db-import.c
@@ -134,6 +134,50 @@ static GFile *osinfo_db_import_get_file(GFile *target,
return g_file_resolve_relative_path(target, tmp);
}
+static int
+osinfo_db_import_download_file(GFile *file,
+ gchar **source_file)
+{
+ GFile *out = NULL;
+ GError *err = NULL;
+ gchar *filename = NULL;
+ GFileCopyFlags flags = G_FILE_COPY_OVERWRITE | G_FILE_COPY_BACKUP;
+ int ret = -1;
+
+ filename = g_file_get_basename(file);
+ if (filename == NULL)
+ goto cleanup;
+
+ *source_file = g_build_filename(g_get_user_cache_dir(), filename, NULL);
+ if (*source_file == NULL)
+ goto cleanup;
+
+ out = g_file_new_for_path(*source_file);
+ if (out == NULL)
+ goto cleanup;
+
+ if (!g_file_copy(file, out, flags, NULL, NULL, NULL, &err)) {
+ gchar *path = g_file_get_path(file);
+ g_printerr("Could not download file \"%s\": %s\n",
+ path, err->message);
+ g_free(path);
+ goto cleanup;
+ }
+
+ ret = 0;
+
+ cleanup:
+ g_free(filename);
+ 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 +187,8 @@ static int osinfo_db_import_extract(GFile *target,
int ret = -1;
int r;
GFile *file = NULL;
+ gchar *source_file = NULL;
+ gboolean file_is_native = TRUE;
arc = archive_read_new();
@@ -152,9 +198,27 @@ 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) {
+ file = g_file_new_for_uri(source);
+ if (file == NULL)
+ goto cleanup;
+
+ file_is_native = g_file_is_native(file);
+ if (!file_is_native(file)) {
+ if (osinfo_db_import_download_file(file, &source_file) < 0)
+ goto cleanup;
+ } else {
+ source_file = g_strdup(source);
+ }
+ if (source_file == NULL)
+ goto cleanup;
+
+ g_clear_object(&file);
+ }
+
+ 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;
}
@@ -164,7 +228,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;
}
@@ -178,7 +242,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;
}
@@ -187,6 +251,9 @@ static int osinfo_db_import_extract(GFile *target,
archive_read_free(arc);
if (file)
g_object_unref(file);
+ if (!file_is_native)
+ unlink(source_file);
+ g_free(source_file);
return ret;
}
--
2.19.1
More information about the Libosinfo
mailing list