[Libosinfo] [PATCH db-tools] osinfo-db-export: add ability to include a license file

Daniel P. Berrange berrange at redhat.com
Wed Oct 19 09:11:35 UTC 2016


Add a "--license FILE-NAME" option to osinfo-db-export
which will add that reference FILE-NAME to the generated
archive as a file called "LICENSE" in the top level.

Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
---
 tools/osinfo-db-export.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 77 insertions(+), 1 deletion(-)

diff --git a/tools/osinfo-db-export.c b/tools/osinfo-db-export.c
index a2aef2f..8b2d5fb 100644
--- a/tools/osinfo-db-export.c
+++ b/tools/osinfo-db-export.c
@@ -336,10 +336,72 @@ static int osinfo_db_export_create_version(const gchar *prefix,
     return ret;
 }
 
+static int osinfo_db_export_create_license(const gchar *prefix,
+                                           const gchar *license,
+                                           const gchar *target,
+                                           struct archive *arc,
+                                           gboolean verbose)
+{
+    int ret = -1;
+    struct archive_entry *entry = NULL;
+    gchar *entpath = NULL;
+    GFile *file = NULL;
+    GFileInfo *info = NULL;
+    GError *err = NULL;
+
+    file = g_file_new_for_path(license);
+
+    info = g_file_query_info(file,
+                             G_FILE_ATTRIBUTE_STANDARD_NAME
+                             ","
+                             G_FILE_ATTRIBUTE_STANDARD_SIZE,
+                             G_FILE_QUERY_INFO_NONE,
+                             NULL,
+                             &err);
+    if (!info) {
+        g_printerr("%s: cannot get file info %s: %s\n",
+                   argv0, license, err->message);
+        goto cleanup;
+    }
+
+    entpath = g_strdup_printf("%s/LICENSE", prefix);
+    entry = archive_entry_new();
+    archive_entry_set_pathname(entry, entpath);
+
+    archive_entry_set_atime(entry, entryts, 0);
+    archive_entry_set_ctime(entry, entryts, 0);
+    archive_entry_set_mtime(entry, entryts, 0);
+    archive_entry_set_birthtime(entry, entryts, 0);
+
+    if (verbose) {
+        g_print("%s: r %s\n", argv0, entpath);
+    }
+    archive_entry_set_filetype(entry, AE_IFREG);
+    archive_entry_set_perm(entry, 0644);
+    archive_entry_set_size(entry, g_file_info_get_size(info));
+
+    if (archive_write_header(arc, entry) != ARCHIVE_OK) {
+        g_printerr("%s: cannot write archive header %s: %s\n",
+                   argv0, target, archive_error_string(arc));
+        goto cleanup;
+    }
+
+    if (osinfo_db_export_create_reg(file, license, target, arc) < 0)
+        goto cleanup;
+
+    ret = 0;
+ cleanup:
+    archive_entry_free(entry);
+    if (err)
+        g_error_free(err);
+    return ret;
+}
+
 static int osinfo_db_export_create(const gchar *prefix,
                                    const gchar *version,
                                    GFile *source,
                                    const gchar *target,
+                                   const gchar *license,
                                    gboolean verbose)
 {
     struct archive *arc;
@@ -369,6 +431,11 @@ static int osinfo_db_export_create(const gchar *prefix,
         goto cleanup;
     }
 
+    if (license != NULL &&
+        osinfo_db_export_create_license(prefix, license, target, arc, verbose) < 0) {
+        goto cleanup;
+    }
+
     if (archive_write_close(arc) != ARCHIVE_OK) {
         g_printerr("%s: cannot finish writing archive %s: %s\n",
                    argv0, target, archive_error_string(arc));
@@ -415,6 +482,7 @@ gint main(gint argc, gchar **argv)
     const gchar *version = NULL;
     gchar *autoversion = NULL;
     gchar *prefix = NULL;
+    const gchar *license = NULL;
     int locs = 0;
     GFile *dir = NULL;
     const GOptionEntry entries[] = {
@@ -432,6 +500,8 @@ gint main(gint argc, gchar **argv)
         N_("Set version number of archive"), NULL, },
       { "root", 0, 0, G_OPTION_ARG_STRING, &root,
         N_("Installation root directory"), NULL, },
+      { "license", 0, 0, G_OPTION_ARG_STRING, &license,
+        N_("License file"), NULL, },
       { NULL, 0, 0, 0, NULL, NULL, NULL },
     };
     argv0 = argv[0];
@@ -483,7 +553,8 @@ gint main(gint argc, gchar **argv)
         archive = g_strdup_printf("%s.tar.xz", prefix);
     }
     dir = osinfo_db_get_path(root, user, local, system, custom);
-    if (osinfo_db_export_create(prefix, version, dir, archive, verbose) < 0)
+    if (osinfo_db_export_create(prefix, version, dir, archive,
+                                license, verbose) < 0)
         goto error;
 
     ret = EXIT_SUCCESS;
@@ -584,6 +655,11 @@ Set the version string for the files in the archive to
 B<VERSION>. If this argument is not given, the version
 will be set to the current date in the format B<YYYYMMDD>.
 
+=item B<--license=LICENSE-FILE>
+
+Add C<LICENSE-FILE> to the generated archive as an entry
+named "LICENSE".
+
 =item B<-v>, B<--verbose>
 
 Display verbose progress information when archiving files
-- 
2.7.4




More information about the Libosinfo mailing list