return pakfire_repo_ref(pkg->repo);
}
-static int pakfire_package_dump_add_line(char** str, const char* key, const char* val) {
- if (val)
- return asprintf(str, "%s%-15s: %s\n", (*str) ? *str : "", key ? key : "", val);
+static int pakfire_package_dump_add_line(char*** s, const char* key, const char* val) {
+ // Do nothing if there is no value
+ if (!val)
+ return 0;
- return 0;
+ // Replace empty keys with an empty string
+ if (!key)
+ key = "";
+
+ // Append a new line
+ return pakfire_strings_appendf(s, "%-15s: %s\n", key, val);
}
-static int pakfire_package_dump_add_lines(char** str, const char* key, char** lines) {
+static int pakfire_package_dump_add_lines(char*** s, const char* key, char** lines) {
int r = 0;
for (; *lines; lines++) {
- r = pakfire_package_dump_add_line(str, key, *lines);
+ r = pakfire_package_dump_add_line(s, key, *lines);
if (r < 0)
break;
return r;
}
-static int pakfire_package_dump_add_long_line(char** str, const char* key, const char* val) {
+static int pakfire_package_dump_add_long_line(char*** s, const char* key, const char* val) {
char* p = NULL;
int r = 0;
const char* line = strtok_r(buffer, "\n", &p);
while (line) {
- r = pakfire_package_dump_add_line(str, key, line);
+ r = pakfire_package_dump_add_line(s, key, line);
if (r < 0)
break;
return r;
}
-static int pakfire_package_dump_add_line_date(char** str, const char* key, time_t date) {
+static int pakfire_package_dump_add_line_date(char*** s, const char* key, time_t date) {
char buffer[1024];
int r;
if (r < 0)
return r;
- return pakfire_package_dump_add_line(str, key, buffer);
+ return pakfire_package_dump_add_line(s, key, buffer);
}
-static int pakfire_package_dump_add_line_hex(char** str,
+static int pakfire_package_dump_add_line_hex(char*** s,
const char* key, const unsigned char* buffer, const size_t length) {
int r;
if (!hex)
return -errno;
- r = pakfire_package_dump_add_line(str, key, hex);
+ r = pakfire_package_dump_add_line(s, key, hex);
free(hex);
return r;
}
-static int pakfire_package_dump_add_line_size(char** str, const char* key, size_t size) {
+static int pakfire_package_dump_add_line_size(char*** s, const char* key, size_t size) {
char buffer[128];
// Format size in human-readable format
if (r < 0)
return r;
- return pakfire_package_dump_add_line(str, key, buffer);
+ return pakfire_package_dump_add_line(s, key, buffer);
}
static int pakfire_sort_dependencies(const void* p1, const void* p2) {
enum pakfire_hash_type hash = PAKFIRE_HASH_UNDEFINED;
const unsigned char* checksum = NULL;
size_t checksum_length = 0;
- char* string = NULL;
+ char* result = NULL;
+ char** s = NULL;
int r;
// Name
const char* name = pakfire_package_get_string(pkg, PAKFIRE_PKG_NAME);
if (name) {
- r = pakfire_package_dump_add_line(&string, _("Name"), name);
+ r = pakfire_package_dump_add_line(&s, _("Name"), name);
if (r < 0)
goto ERROR;
}
// EVR
const char* evr = pakfire_package_get_string(pkg, PAKFIRE_PKG_EVR);
if (evr) {
- r = pakfire_package_dump_add_line(&string, _("Version"), evr);
+ r = pakfire_package_dump_add_line(&s, _("Version"), evr);
if (r < 0)
goto ERROR;
}
// Arch
const char* arch = pakfire_package_get_string(pkg, PAKFIRE_PKG_ARCH);
if (arch) {
- r = pakfire_package_dump_add_line(&string, _("Arch"), arch);
+ r = pakfire_package_dump_add_line(&s, _("Arch"), arch);
if (r < 0)
goto ERROR;
}
// Size
size_t size = pakfire_package_get_size(pkg);
if (size) {
- r = pakfire_package_dump_add_line_size(&string, _("Size"), size);
+ r = pakfire_package_dump_add_line_size(&s, _("Size"), size);
if (r < 0)
goto ERROR;
}
if (pakfire_package_is_installed(pkg)) {
unsigned long long installsize = pakfire_package_get_num(pkg, PAKFIRE_PKG_INSTALLSIZE, 0);
if (installsize) {
- r = pakfire_package_dump_add_line_size(&string, _("Installed Size"), installsize);
+ r = pakfire_package_dump_add_line_size(&s, _("Installed Size"), installsize);
if (r < 0)
goto ERROR;
}
} else {
size_t downloadsize = pakfire_package_get_num(pkg, PAKFIRE_PKG_DOWNLOADSIZE, 0);
if (downloadsize) {
- r = pakfire_package_dump_add_line_size(&string, _("Download Size"), downloadsize);
+ r = pakfire_package_dump_add_line_size(&s, _("Download Size"), downloadsize);
if (r < 0)
goto ERROR;
}
if (!pakfire_repo_name_equals(repo, PAKFIRE_REPO_DUMMY)) {
const char* repo_name = pakfire_repo_get_name(repo);
- r = pakfire_package_dump_add_line(&string, _("Repo"), repo_name);
+ r = pakfire_package_dump_add_line(&s, _("Repo"), repo_name);
if (r < 0)
goto ERROR;
}
// Summary
const char* summary = pakfire_package_get_string(pkg, PAKFIRE_PKG_SUMMARY);
if (summary) {
- r = pakfire_package_dump_add_line(&string, _("Summary"), summary);
+ r = pakfire_package_dump_add_line(&s, _("Summary"), summary);
if (r < 0)
goto ERROR;
}
// Description
const char* description = pakfire_package_get_string(pkg, PAKFIRE_PKG_DESCRIPTION);
if (description) {
- r = pakfire_package_dump_add_long_line(&string, _("Description"), description);
+ r = pakfire_package_dump_add_long_line(&s, _("Description"), description);
if (r < 0)
goto ERROR;
}
// Groups
char** groups = pakfire_package_get_strings(pkg, PAKFIRE_PKG_GROUPS);
if (groups) {
- r = pakfire_package_dump_add_lines(&string, _("Groups"), groups);
+ r = pakfire_package_dump_add_lines(&s, _("Groups"), groups);
if (r < 0)
goto ERROR;
// URL
const char* url = pakfire_package_get_string(pkg, PAKFIRE_PKG_URL);
if (url) {
- pakfire_package_dump_add_line(&string, _("URL"), url);
+ pakfire_package_dump_add_line(&s, _("URL"), url);
if (r < 0)
goto ERROR;
}
// License
const char* license = pakfire_package_get_string(pkg, PAKFIRE_PKG_LICENSE);
if (license) {
- r = pakfire_package_dump_add_line(&string, _("License"), license);
+ r = pakfire_package_dump_add_line(&s, _("License"), license);
if (r < 0)
goto ERROR;
}
// Install Time
time_t install_time = pakfire_package_get_num(pkg, PAKFIRE_PKG_INSTALLTIME, 0);
if (install_time) {
- r = pakfire_package_dump_add_line_date(&string, _("Install Time"), install_time);
+ r = pakfire_package_dump_add_line_date(&s, _("Install Time"), install_time);
if (r < 0)
goto ERROR;
}
// Distribution
const char* distro = pakfire_package_get_string(pkg, PAKFIRE_PKG_DISTRO);
if (distro) {
- r = pakfire_package_dump_add_line(&string, _("Distribution"), distro);
+ r = pakfire_package_dump_add_line(&s, _("Distribution"), distro);
if (r < 0)
goto ERROR;
}
// Packager
const char* packager = pakfire_package_get_string(pkg, PAKFIRE_PKG_PACKAGER);
if (packager) {
- r = pakfire_package_dump_add_line(&string, _("Packager"), packager);
+ r = pakfire_package_dump_add_line(&s, _("Packager"), packager);
if (r < 0)
goto ERROR;
}
// Vendor
const char* vendor = pakfire_package_get_string(pkg, PAKFIRE_PKG_VENDOR);
if (vendor) {
- r = pakfire_package_dump_add_line(&string, _("Vendor"), vendor);
+ r = pakfire_package_dump_add_line(&s, _("Vendor"), vendor);
if (r < 0)
goto ERROR;
}
// UUID
const char* uuid = pakfire_package_get_string(pkg, PAKFIRE_PKG_UUID);
if (uuid) {
- r = pakfire_package_dump_add_line(&string, _("UUID"), uuid);
+ r = pakfire_package_dump_add_line(&s, _("UUID"), uuid);
if (r < 0)
goto ERROR;
}
// Build ID
const char* build_id = pakfire_package_get_string(pkg, PAKFIRE_PKG_BUILD_ID);
if (build_id) {
- r = pakfire_package_dump_add_line(&string, _("Build ID"), build_id);
+ r = pakfire_package_dump_add_line(&s, _("Build ID"), build_id);
if (r < 0)
goto ERROR;
}
// Build Arches
char** build_arches = pakfire_package_get_strings(pkg, PAKFIRE_PKG_BUILD_ARCHES);
if (build_arches) {
- r = pakfire_package_dump_add_lines(&string, _("Build Arch"), build_arches);
+ r = pakfire_package_dump_add_lines(&s, _("Build Arch"), build_arches);
if (r < 0)
goto ERROR;
switch (hash) {
case PAKFIRE_HASH_SHA2_512:
- r = pakfire_package_dump_add_line_hex(&string,
+ r = pakfire_package_dump_add_line_hex(&s,
_("SHA2-512 Checksum"), checksum, checksum_length);
if (r < 0)
goto ERROR;
break;
case PAKFIRE_HASH_SHA2_256:
- r = pakfire_package_dump_add_line_hex(&string,
+ r = pakfire_package_dump_add_line_hex(&s,
_("SHA2-256 Checksum"), checksum, checksum_length);
if (r < 0)
goto ERROR;
// Source package
const char* source_package = pakfire_package_get_string(pkg, PAKFIRE_PKG_SOURCE_PKG);
if (source_package) {
- r = pakfire_package_dump_add_line(&string, _("Source Package"), source_package);
+ r = pakfire_package_dump_add_line(&s, _("Source Package"), source_package);
if (r < 0)
goto ERROR;
}
// Build time
time_t build_time = pakfire_package_get_num(pkg, PAKFIRE_PKG_BUILD_TIME, 0);
if (build_time) {
- r = pakfire_package_dump_add_line_date(&string, _("Build Time"), build_time);
+ r = pakfire_package_dump_add_line_date(&s, _("Build Time"), build_time);
if (r < 0)
goto ERROR;
}
// Build host
const char* build_host = pakfire_package_get_string(pkg, PAKFIRE_PKG_BUILD_HOST);
if (build_host) {
- r = pakfire_package_dump_add_line(&string, _("Build Host"), build_host);
+ r = pakfire_package_dump_add_line(&s, _("Build Host"), build_host);
if (r < 0)
goto ERROR;
}
}
// Write it to the console
- r = pakfire_package_dump_add_lines(&string, name, deps);
+ r = pakfire_package_dump_add_lines(&s, name, deps);
if (r < 0)
goto ERROR;
const char* path = pakfire_file_get_path(file);
if (path) {
- r = pakfire_package_dump_add_line(&string, prefix, path);
+ r = pakfire_package_dump_add_line(&s, prefix, path);
if (r < 0)
goto ERROR;
}
pakfire_filelist_unref(filelist);
}
- return string;
+ // Join everything together
+ result = pakfire_string_join((const char**)s, "");
ERROR:
- if (string)
- free(string);
+ if (s)
+ pakfire_strings_free(s);
- return NULL;
+ return result;
}
int pakfire_package_get_archive(pakfire_package* pkg, pakfire_archive** archive) {