summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--parse.c36
-rw-r--r--parse.h2
-rw-r--r--pkg.c23
3 files changed, 46 insertions, 15 deletions
diff --git a/parse.c b/parse.c
index 5596810..4da6702 100644
--- a/parse.c
+++ b/parse.c
@@ -1145,3 +1145,39 @@ parse_package_file (const char *key, const char *path,
return pkg;
}
+
+/* Parse a package variable. When the value appears to be quoted,
+ * unquote it so it can be more easily used in a shell. Otherwise,
+ * return the raw value.
+ */
+char *
+parse_package_variable (Package *pkg, const char *variable)
+{
+ char *value;
+ char *unquoted;
+ GError *error = NULL;
+
+ value = package_get_var (pkg, variable);
+ if (!value)
+ return NULL;
+
+ if (*value != '"' && *value != '\'')
+ /* Not quoted, return raw value */
+ return value;
+
+ /* Maybe too naive, but assume a fully quoted variable */
+ unquoted = g_shell_unquote (value, &error);
+ if (unquoted)
+ {
+ g_free (value);
+ return unquoted;
+ }
+ else
+ {
+ /* Note the issue, but just return the raw value */
+ debug_spew ("Couldn't unquote value of \"%s\": %s\n",
+ variable, error ? error->message : "unknown");
+ g_clear_error (&error);
+ return value;
+ }
+}
diff --git a/parse.h b/parse.h
index 4ec84aa..db1bf86 100644
--- a/parse.h
+++ b/parse.h
@@ -29,6 +29,8 @@ Package *parse_package_file (const char *key, const char *path,
GList *parse_module_list (Package *pkg, const char *str, const char *path);
+char *parse_package_variable (Package *pkg, const char *variable);
+
#endif
diff --git a/pkg.c b/pkg.c
index cbe50d8..0d82c41 100644
--- a/pkg.c
+++ b/pkg.c
@@ -1070,40 +1070,33 @@ package_get_var (Package *pkg,
}
char *
-packages_get_var (GList *pkgs,
+packages_get_var (GList *pkgs,
const char *varname)
{
GList *tmp;
GString *str;
- char *retval;
-
- str = g_string_new ("");
-
+
+ str = g_string_new (NULL);
+
tmp = pkgs;
while (tmp != NULL)
{
Package *pkg = tmp->data;
char *var;
- var = package_get_var (pkg, varname);
-
+ var = parse_package_variable (pkg, varname);
if (var)
{
+ if (str->len > 0)
+ g_string_append_c (str, ' ');
g_string_append (str, var);
- g_string_append_c (str, ' ');
g_free (var);
}
tmp = g_list_next (tmp);
}
- /* chop last space */
- if (str->len > 0)
- str->str[str->len - 1] = '\0';
- retval = str->str;
- g_string_free (str, FALSE);
-
- return retval;
+ return g_string_free (str, FALSE);
}
int