static gboolean asb_package_alpm_open (AsbPackage *pkg, const gchar *filename, GError **error) { AsbPackageAlpm *pkg_alpm = ASB_PACKAGE_ALPM (pkg); AsbPackageAlpmPrivate *priv = GET_PRIVATE (pkg_alpm); alpm_errno_t alpm_error; /* initialize the alpm library */ priv->handle = alpm_initialize ("/", "/tmp", &alpm_error); if (priv->handle == NULL) { g_set_error (error, ASB_PLUGIN_ERROR, ASB_PLUGIN_ERROR_FAILED, "libalpm initialization failed %s (%u) for %s", alpm_strerror (alpm_error), alpm_error, filename); return FALSE; } /* open the package */ if (alpm_pkg_load (priv->handle, filename, TRUE, 0, &priv->package) == -1) { g_set_error (error, ASB_PLUGIN_ERROR, ASB_PLUGIN_ERROR_FAILED, "Failed to load package %s : %s (%u)", filename, alpm_strerror (alpm_errno (priv->handle)), alpm_errno (priv->handle)); alpm_release (priv->handle); return FALSE; } asb_package_set_name (pkg, alpm_pkg_get_name (priv->package)); asb_package_set_url (pkg, alpm_pkg_get_url (priv->package)); asb_package_set_arch (pkg, alpm_pkg_get_arch (priv->package)); asb_package_alpm_ensure_version (pkg, error); return TRUE; }
/** * asb_package_deb_ensure_simple: **/ static gboolean asb_package_deb_ensure_simple (AsbPackage *pkg, GError **error) { const gchar *argv[4] = { "dpkg", "--field", "fn", NULL }; gchar *tmp; gchar **vr; guint i; guint j; _cleanup_free_ gchar *output = NULL; _cleanup_ptrarray_unref_ GPtrArray *deps = NULL; _cleanup_strv_free_ gchar **lines = NULL; /* spawn sync */ argv[2] = asb_package_get_filename (pkg); if (!g_spawn_sync (NULL, (gchar **) argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, &output, NULL, NULL, error)) return FALSE; /* parse output */ deps = g_ptr_array_new_with_free_func (g_free); lines = g_strsplit (output, "\n", -1); for (i = 0; lines[i] != NULL; i++) { if (g_str_has_prefix (lines[i], "Package: ")) { asb_package_set_name (pkg, lines[i] + 9); continue; } if (g_str_has_prefix (lines[i], "Source: ")) { asb_package_set_source (pkg, lines[i] + 8); continue; } if (g_str_has_prefix (lines[i], "Version: ")) { vr = g_strsplit (lines[i] + 9, "-", 2); tmp = g_strstr_len (vr[0], -1, ":"); if (tmp == NULL) { asb_package_set_version (pkg, vr[0]); } else { *tmp = '\0'; j = g_ascii_strtoll (vr[0], NULL, 10); asb_package_set_epoch (pkg, j); asb_package_set_version (pkg, tmp + 1); } asb_package_set_release (pkg, vr[1]); g_strfreev (vr); continue; } if (g_str_has_prefix (lines[i], "Depends: ")) { vr = g_strsplit (lines[i] + 9, ", ", -1); for (j = 0; vr[j] != NULL; j++) { tmp = g_strstr_len (vr[j], -1, " "); if (tmp != NULL) *tmp = '\0'; g_ptr_array_add (deps, vr[j]); } continue; } } g_ptr_array_add (deps, NULL); asb_package_set_deps (pkg, (gchar **) deps->pdata); return TRUE; }
/** * asb_package_deb_ensure_simple: **/ static gboolean asb_package_deb_ensure_simple (AsbPackage *pkg, GError **error) { const gchar *argv[4] = { "dpkg", "--field", "fn", NULL }; gchar *tmp; guint i; guint j; g_autofree gchar *output = NULL; g_auto(GStrv) lines = NULL; /* spawn sync */ argv[2] = asb_package_get_filename (pkg); if (!g_spawn_sync (NULL, (gchar **) argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, &output, NULL, NULL, error)) return FALSE; /* parse output */ lines = g_strsplit (output, "\n", -1); for (i = 0; lines[i] != NULL; i++) { if (g_str_has_prefix (lines[i], "Package: ")) { asb_package_set_name (pkg, lines[i] + 9); continue; } if (g_str_has_prefix (lines[i], "Source: ")) { asb_package_set_source (pkg, lines[i] + 8); continue; } if (g_str_has_prefix (lines[i], "Version: ")) { g_auto(GStrv) vr = NULL; vr = g_strsplit (lines[i] + 9, "-", 2); tmp = g_strstr_len (vr[0], -1, ":"); if (tmp == NULL) { asb_package_set_version (pkg, vr[0]); } else { *tmp = '\0'; j = g_ascii_strtoll (vr[0], NULL, 10); asb_package_set_epoch (pkg, j); asb_package_set_version (pkg, tmp + 1); } if (vr[1] != NULL) { asb_package_set_release (pkg, vr[1]); } else { /* packages don't actually have to have a * release value like rpm; in this case fake * something plausible */ asb_package_set_release (pkg, "0"); } continue; } if (g_str_has_prefix (lines[i], "Depends: ")) { g_auto(GStrv) vr = NULL; vr = g_strsplit (lines[i] + 9, ", ", -1); for (j = 0; vr[j] != NULL; j++) { tmp = g_strstr_len (vr[j], -1, " "); if (tmp != NULL) *tmp = '\0'; asb_package_add_dep (pkg, vr[j]); } continue; } } return TRUE; }