Pino Toscano
2017-Feb-23 17:55 UTC
[Libguestfs] [PATCH 1/3] inspect: add source and summary to internal add_application
This way source and summary can be specified for any package read from
the guest.
---
lib/inspect-apps.c | 17 ++++++++++-------
1 file changed, 10 insertions(+), 7 deletions(-)
diff --git a/lib/inspect-apps.c b/lib/inspect-apps.c
index 1216c52..eabe565 100644
--- a/lib/inspect-apps.c
+++ b/lib/inspect-apps.c
@@ -51,7 +51,7 @@ static struct guestfs_application2_list *list_applications_deb
(guestfs_h *g, st
static struct guestfs_application2_list *list_applications_pacman (guestfs_h
*g, struct inspect_fs *fs);
static struct guestfs_application2_list *list_applications_apk (guestfs_h *g,
struct inspect_fs *fs);
static struct guestfs_application2_list *list_applications_windows (guestfs_h
*g, struct inspect_fs *fs);
-static void add_application (guestfs_h *g, struct guestfs_application2_list *,
const char *name, const char *display_name, int32_t epoch, const char *version,
const char *release, const char *arch, const char *install_path, const char
*publisher, const char *url, const char *description);
+static void add_application (guestfs_h *g, struct guestfs_application2_list *,
const char *name, const char *display_name, int32_t epoch, const char *version,
const char *release, const char *arch, const char *install_path, const char
*publisher, const char *url, const char *source, const char *summary, const char
*description);
static void sort_applications (struct guestfs_application2_list *);
/* The deprecated guestfs_inspect_list_applications call, which is now
@@ -369,7 +369,7 @@ read_package (guestfs_h *g,
/* Add the application and what we know. */
if (version && release)
add_application (g, data->apps, entry->name, "", epoch,
version, release,
- arch ? arch : "", "", "",
"", "");
+ arch ? arch : "", "", "",
"", "", "", "");
return 0;
}
@@ -504,7 +504,7 @@ list_applications_deb (guestfs_h *g, struct inspect_fs *fs)
else if (STREQ (line, "")) {
if (installed_flag && name && version && (epoch
>= 0))
add_application (g, apps, name, "", epoch, version, release ?
: "",
- arch ? : "", "", "",
"", "");
+ arch ? : "", "", "",
"", "", "", "");
free (name);
free (version);
free (release);
@@ -634,7 +634,7 @@ list_applications_pacman (guestfs_h *g, struct inspect_fs
*fs)
if ((epoch >= 0) && (ver[0] != '\0') && (rel[0]
!= '\0'))
add_application (g, apps, name, "", epoch, ver, rel, arch,
"", "",
- url ? : "", desc ? : "");
+ url ? : "", "", "", desc ?
: "");
after_add_application:
key = NULL;
@@ -708,7 +708,8 @@ list_applications_apk (guestfs_h *g, struct inspect_fs *fs)
case '\0':
if (name && version && (epoch >= 0))
add_application (g, apps, name, "", epoch, version, release ?
: "",
- arch ? : "", "", "", url
? : "", description ? : "");
+ arch ? : "", "", "", url
? : "", "", "",
+ description ? : "");
free (name);
free (version);
free (release);
@@ -880,6 +881,7 @@ list_applications_windows_from_path (guestfs_h *g,
install_path ? : "",
publisher ? : "",
url ? : "",
+ "", "",
comments ? : "");
}
}
@@ -892,6 +894,7 @@ add_application (guestfs_h *g, struct
guestfs_application2_list *apps,
const char *version, const char *release, const char *arch,
const char *install_path,
const char *publisher, const char *url,
+ const char *source, const char *summary,
const char *description)
{
apps->len++;
@@ -911,8 +914,8 @@ add_application (guestfs_h *g, struct
guestfs_application2_list *apps,
/* XXX The next two are not yet implemented for any package
* format, but we could easily support them for rpm and deb.
*/
- apps->val[apps->len-1].app2_source_package = safe_strdup (g,
"");
- apps->val[apps->len-1].app2_summary = safe_strdup (g, "");
+ apps->val[apps->len-1].app2_source_package = safe_strdup (g, source);
+ apps->val[apps->len-1].app2_summary = safe_strdup (g, summary);
apps->val[apps->len-1].app2_description = safe_strdup (g, description);
/* XXX Reserved for future use. */
apps->val[apps->len-1].app2_spare1 = safe_strdup (g, "");
--
2.9.3
Pino Toscano
2017-Feb-23 17:55 UTC
[Libguestfs] [PATCH 2/3] inspect: read more fields for Debian packages
In particular, read the URL, the source name, and both the summary and
the description. For the long description, add a small system to read
continuation lines.
---
lib/inspect-apps.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 59 insertions(+), 6 deletions(-)
diff --git a/lib/inspect-apps.c b/lib/inspect-apps.c
index eabe565..b7adaa2 100644
--- a/lib/inspect-apps.c
+++ b/lib/inspect-apps.c
@@ -437,7 +437,11 @@ list_applications_deb (guestfs_h *g, struct inspect_fs *fs)
size_t len;
int32_t epoch = 0;
CLEANUP_FREE char *name = NULL, *version = NULL, *release = NULL, *arch =
NULL;
+ CLEANUP_FREE char *url = NULL, *source = NULL, *summary = NULL;
+ CLEANUP_FREE char *description = NULL;
int installed_flag = 0;
+ char **continuation_field = NULL;
+ size_t continuation_field_len = 0;
status = guestfs_int_download_to_tmp (g, fs,
"/var/lib/dpkg/status", "status",
MAX_PKG_DB_SIZE);
@@ -457,10 +461,6 @@ list_applications_deb (guestfs_h *g, struct inspect_fs *fs)
/* Read the temporary file. Each package entry is separated by
* a blank line.
- * XXX Strictly speaking this is in mailbox header format, so it
- * would be possible for fields to spread across multiple lines,
- * although for the short fields that we are concerned about this is
- * unlikely and not seen in practice.
*/
while (fgets (line, sizeof line, fp) != NULL) {
len = strlen (line);
@@ -469,6 +469,35 @@ list_applications_deb (guestfs_h *g, struct inspect_fs *fs)
len--;
}
+ /* Handling of continuation lines, which must be done before
+ * checking for other headers.
+ */
+ if (line[0] == ' ' && continuation_field) {
+ /* This is a continuation line, and this is the first line of
+ * the field.
+ */
+ if (*continuation_field == NULL) {
+ *continuation_field = safe_strdup (g, &line[1]);
+ continuation_field_len = len - 1;
+ }
+ else {
+ /* Not the first line, so append to the existing buffer
+ * (with a new line before).
+ */
+ size_t new_len = continuation_field_len + 1 + (len - 1);
+ *continuation_field = safe_realloc (g, *continuation_field,
+ new_len + 1);
+ (*continuation_field)[continuation_field_len] = '\n';
+ strcpy (*continuation_field + continuation_field_len + 1,
&line[1]);
+ continuation_field_len = new_len;
+ }
+ }
+ else {
+ /* Not a continuation line, or not interested in it -- reset. */
+ continuation_field = NULL;
+ continuation_field = 0;
+ }
+
if (STRPREFIX (line, "Package: ")) {
free (name);
name = safe_strdup (g, &line[9]);
@@ -501,15 +530,39 @@ list_applications_deb (guestfs_h *g, struct inspect_fs
*fs)
free (arch);
arch = safe_strdup (g, &line[14]);
}
+ else if (STRPREFIX (line, "Homepage: ")) {
+ free (url);
+ url = safe_strdup (g, &line[10]);
+ }
+ else if (STRPREFIX (line, "Source: ")) {
+ /* A 'Source' entry may be both 'foo' and 'foo
(1.0)', so make sure
+ * to read only the name in the latter case.
+ */
+ char *space_pos = strchr (&line[8], ' ');
+ if (space_pos)
+ *space_pos = '\0';
+ free (source);
+ source = safe_strdup (g, &line[8]);
+ }
+ else if (STRPREFIX (line, "Description: ")) {
+ free (summary);
+ summary = safe_strdup (g, &line[13]);
+ continuation_field = &description;
+ }
else if (STREQ (line, "")) {
if (installed_flag && name && version && (epoch
>= 0))
add_application (g, apps, name, "", epoch, version, release ?
: "",
- arch ? : "", "", "",
"", "", "", "");
+ arch ? : "", "", "", url
? : "", source ? : "",
+ summary ? : "", description ? :
"");
free (name);
free (version);
free (release);
free (arch);
- name = version = release = arch = NULL;
+ free (url);
+ free (source);
+ free (summary);
+ free (description);
+ name = version = release = arch = url = source = summary = description =
NULL;
installed_flag = 0;
}
}
--
2.9.3
Pino Toscano
2017-Feb-23 17:55 UTC
[Libguestfs] [PATCH 3/3] inspect: read more fields for RPM packages
In particular, read the URL, and both the summary and the description.
---
lib/inspect-apps.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/lib/inspect-apps.c b/lib/inspect-apps.c
index b7adaa2..c324f3b 100644
--- a/lib/inspect-apps.c
+++ b/lib/inspect-apps.c
@@ -257,6 +257,9 @@ read_rpm_name (guestfs_h *g,
#define RPMTAG_RELEASE 1002
#define RPMTAG_EPOCH 1003
#define RPMTAG_ARCH 1022
+#define RPMTAG_URL 1020
+#define RPMTAG_SUMMARY 1004
+#define RPMTAG_DESCRIPTION 1005
static char *
get_rpm_header_tag (guestfs_h *g, const unsigned char *header_start,
@@ -329,7 +332,8 @@ read_package (guestfs_h *g,
struct read_package_data *data = datav;
struct rpm_name nkey, *entry;
CLEANUP_FREE char *version = NULL, *release = NULL,
- *epoch_str = NULL, *arch = NULL;
+ *epoch_str = NULL, *arch = NULL, *url = NULL, *summary = NULL,
+ *description = NULL;
int32_t epoch;
/* This function reads one (key, value) pair from the Packages
@@ -359,6 +363,9 @@ read_package (guestfs_h *g,
release = get_rpm_header_tag (g, value, valuelen, RPMTAG_RELEASE,
's');
epoch_str = get_rpm_header_tag (g, value, valuelen, RPMTAG_EPOCH,
'i');
arch = get_rpm_header_tag (g, value, valuelen, RPMTAG_ARCH, 's');
+ url = get_rpm_header_tag (g, value, valuelen, RPMTAG_URL, 's');
+ summary = get_rpm_header_tag (g, value, valuelen, RPMTAG_SUMMARY,
's');
+ description = get_rpm_header_tag (g, value, valuelen, RPMTAG_DESCRIPTION,
's');
/* The epoch is stored as big-endian integer. */
if (epoch_str)
@@ -369,7 +376,8 @@ read_package (guestfs_h *g,
/* Add the application and what we know. */
if (version && release)
add_application (g, data->apps, entry->name, "", epoch,
version, release,
- arch ? arch : "", "", "",
"", "", "", "");
+ arch ? arch : "", "", "",
url ? : "", "",
+ summary ? : "", description ? : "");
return 0;
}
--
2.9.3
Maybe Matching Threads
- [PATCH v2 1/3] inspect: add source and summary to internal add_application
- [PATCH v2 0/2] inspect: basic UTF-8 encoding for rpm
- [PATCH v3 0/2] inspect: basic UTF-8 encoding for rpm
- [PATCH for discussion] lib: update inspect_list_applications to return app_arch
- [PATCH 0/2] New inspect_list_applications2 API