From ec5b63c5e4d719e07c48b0de0dc0b9f3b25d2cf8 Mon Sep 17 00:00:00 2001 From: Timo Teras Date: Thu, 16 Apr 2009 17:05:27 +0300 Subject: pkg: clean up writing of dependencies --- src/apk_io.h | 1 + src/apk_package.h | 4 +- src/apk_version.h | 1 + src/database.c | 20 ++++---- src/info.c | 11 +++-- src/io.c | 10 ++++ src/package.c | 142 +++++++++++++++++++++++------------------------------- src/version.c | 18 +++++++ 8 files changed, 108 insertions(+), 99 deletions(-) (limited to 'src') diff --git a/src/apk_io.h b/src/apk_io.h index a903277b003..a0d90495dcc 100644 --- a/src/apk_io.h +++ b/src/apk_io.h @@ -63,6 +63,7 @@ struct apk_bstream *apk_bstream_from_url(const char *url); struct apk_ostream *apk_ostream_to_fd(int fd); struct apk_ostream *apk_ostream_to_file(const char *file, mode_t mode); struct apk_ostream *apk_ostream_to_file_gz(const char *file, mode_t mode); +size_t apk_ostream_write_string(struct apk_ostream *ostream, const char *string); apk_blob_t apk_blob_from_istream(struct apk_istream *istream, size_t size); apk_blob_t apk_blob_from_file(const char *file); diff --git a/src/apk_package.h b/src/apk_package.h index a848315490b..1e815d35816 100644 --- a/src/apk_package.h +++ b/src/apk_package.h @@ -75,8 +75,6 @@ void apk_deps_del(struct apk_dependency_array **deps, void apk_deps_parse(struct apk_database *db, struct apk_dependency_array **depends, apk_blob_t blob); -int apk_deps_format(char *buf, int size, - struct apk_dependency_array *depends); int apk_deps_write(struct apk_dependency_array *deps, struct apk_ostream *os); int apk_script_type(const char *name); @@ -94,6 +92,6 @@ int apk_pkg_run_script(struct apk_package *pkg, int root_fd, unsigned int type); struct apk_package *apk_pkg_parse_index_entry(struct apk_database *db, apk_blob_t entry); -apk_blob_t apk_pkg_format_index_entry(struct apk_package *pkg, int size, char *buf); +int apk_pkg_write_index_entry(struct apk_package *pkg, struct apk_ostream *os); #endif diff --git a/src/apk_version.h b/src/apk_version.h index 76508643d9b..e7036b354a0 100644 --- a/src/apk_version.h +++ b/src/apk_version.h @@ -18,6 +18,7 @@ #define APK_VERSION_LESS 2 #define APK_VERSION_GREATER 4 +const char *apk_version_op_string(int result_mask); int apk_version_validate(apk_blob_t ver); int apk_version_compare(apk_blob_t a, apk_blob_t b); diff --git a/src/database.c b/src/database.c index 649555a628a..195f653caf1 100644 --- a/src/database.c +++ b/src/database.c @@ -489,13 +489,12 @@ static int apk_db_write_fdb(struct apk_database *db, struct apk_ostream *os) struct apk_db_file *file; struct hlist_node *c1, *c2; char buf[1024]; - apk_blob_t blob; - int n = 0; + int n = 0, r; list_for_each_entry(pkg, &db->installed.packages, installed_pkgs_list) { - blob = apk_pkg_format_index_entry(pkg, sizeof(buf), buf); - if (blob.ptr) - os->write(os, blob.ptr, blob.len - 1); + r = apk_pkg_write_index_entry(pkg, os); + if (r < 0) + return r; hlist_for_each_entry(diri, c1, &pkg->owned_dirs, pkg_dirs_list) { n += snprintf(&buf[n], sizeof(buf)-n, @@ -872,17 +871,16 @@ static int write_index_entry(apk_hash_item item, void *ctx) { struct index_write_ctx *iwctx = (struct index_write_ctx *) ctx; struct apk_package *pkg = (struct apk_package *) item; - char buf[1024]; - apk_blob_t blob; + int r; if (pkg->repos != 0) return 0; - blob = apk_pkg_format_index_entry(pkg, sizeof(buf), buf); - if (APK_BLOB_IS_NULL(blob)) - return 0; + r = apk_pkg_write_index_entry(pkg, iwctx->os); + if (r < 0) + return r; - if (iwctx->os->write(iwctx->os, blob.ptr, blob.len) != blob.len) + if (iwctx->os->write(iwctx->os, "\n", 1) != 1) return -1; iwctx->count++; diff --git a/src/info.c b/src/info.c index 4bc3ddb280a..7a4c519f637 100644 --- a/src/info.c +++ b/src/info.c @@ -10,6 +10,7 @@ */ #include +#include #include "apk_defines.h" #include "apk_applet.h" #include "apk_package.h" @@ -85,9 +86,13 @@ static int info_who_owns(struct info_ctx *ctx, struct apk_database *db, } } if (apk_verbosity < 1 && deps != NULL) { - char buf[512]; - apk_deps_format(buf, sizeof(buf), deps); - printf("%s\n", buf); + struct apk_ostream *os; + + os = apk_ostream_to_fd(STDOUT_FILENO); + apk_deps_write(deps, os); + os->write(os, "\n", 1); + os->close(os); + free(deps); } diff --git a/src/io.c b/src/io.c index 81ed289bc6d..e0a9c9be681 100644 --- a/src/io.c +++ b/src/io.c @@ -492,3 +492,13 @@ struct apk_ostream *apk_ostream_to_file(const char *file, mode_t mode) return apk_ostream_to_fd(fd); } +size_t apk_ostream_write_string(struct apk_ostream *os, const char *string) +{ + size_t len; + + len = strlen(string); + if (os->write(os, string, len) != len) + return -1; + + return len; +} diff --git a/src/package.c b/src/package.c index f74ca4d8362..029167d83c1 100644 --- a/src/package.c +++ b/src/package.c @@ -188,61 +188,9 @@ void apk_deps_parse(struct apk_database *db, apk_blob_for_each_segment(blob, " ", parse_depend, &ctx); } -static const char *mask2str(int mask) -{ - switch (mask) { - case APK_VERSION_LESS: - return "<"; - case APK_VERSION_LESS|APK_VERSION_EQUAL: - return "<="; - case APK_VERSION_EQUAL: - return "="; - case APK_VERSION_GREATER|APK_VERSION_EQUAL: - return ">="; - case APK_VERSION_GREATER: - return ">"; - default: - return "?"; - } -} - -int apk_deps_format(char *buf, int size, - struct apk_dependency_array *depends) -{ - int i, n = 0; - - if (depends == NULL) - return 0; - - for (i = 0; i < depends->num; i++) { - if (i && n < size) - buf[n++] = ' '; - switch (depends->item[i].result_mask) { - case APK_DEPMASK_CONFLICT: - n += snprintf(&buf[n], size-n, - "!%s", - depends->item[i].name->name); - break; - case APK_DEPMASK_REQUIRE: - n += snprintf(&buf[n], size-n, - "%s", - depends->item[i].name->name); - break; - default: - n += snprintf(&buf[n], size-n, - "%s%s%s", - depends->item[i].name->name, - mask2str(depends->item[i].result_mask), - depends->item[i].version); - break; - } - } - return n; -} - int apk_deps_write(struct apk_dependency_array *deps, struct apk_ostream *os) { - int i, len, n = 0; + int i, r, n = 0; if (deps == NULL) return 0; @@ -254,10 +202,29 @@ int apk_deps_write(struct apk_dependency_array *deps, struct apk_ostream *os) n += 1; } - len = strlen(deps->item[i].name->name); - if (os->write(os, deps->item[i].name->name, len) != len) - return -1; - n += len; + if (deps->item[i].result_mask == APK_DEPMASK_CONFLICT) { + if (os->write(os, "!", 1) != 1) + return -1; + n += 1; + } + + r = apk_ostream_write_string(os, deps->item[i].name->name); + if (r < 0) + return r; + n += r; + + if (deps->item[i].result_mask != APK_DEPMASK_CONFLICT && + deps->item[i].result_mask != APK_DEPMASK_REQUIRE) { + r = apk_ostream_write_string(os, apk_version_op_string(deps->item[i].result_mask)); + if (r < 0) + return r; + n += r; + + r = apk_ostream_write_string(os, deps->item[i].version); + if (r < 0) + return r; + n += r; + } } return n; @@ -654,34 +621,45 @@ struct apk_package *apk_pkg_parse_index_entry(struct apk_database *db, apk_blob_ return ctx.pkg; } -apk_blob_t apk_pkg_format_index_entry(struct apk_package *info, int size, - char *buf) +int apk_pkg_write_index_entry(struct apk_package *info, + struct apk_ostream *os) { - int n = 0; - - n += snprintf(&buf[n], size-n, - "P:%s\n" - "V:%s\n" - "S:%zu\n" - "I:%zu\n" - "T:%s\n" - "U:%s\n" - "L:%s\n", - info->name->name, info->version, - info->size, info->installed_size, - info->description, info->url, info->license); + char buf[512]; + int n, r, t = 0; + + n = snprintf(buf, sizeof(buf), + "P:%s\n" + "V:%s\n" + "S:%zu\n" + "I:%zu\n" + "T:%s\n" + "U:%s\n" + "L:%s\n", + info->name->name, info->version, + info->size, info->installed_size, + info->description, info->url, info->license); + if (os->write(os, buf, n) != n) + return -1; + t += n; if (info->depends != NULL) { - n += snprintf(&buf[n], size-n, "D:"); - n += apk_deps_format(&buf[n], size-n, info->depends); - if (n < size) - buf[n++] = '\n'; + if (os->write(os, "D:", 2) != 2) + return -1; + r = apk_deps_write(info->depends, os); + if (r < 0) + return r; + if (os->write(os, "\n", 1) != 1) + return -1; + t += r + 3; } - n += snprintf(&buf[n], size-n, "C:"); - n += apk_hexdump_format(size-n, &buf[n], - APK_BLOB_BUF(info->csum)); - n += snprintf(&buf[n], size-n, - "\n\n"); - return APK_BLOB_PTR_LEN(buf, n); + n = snprintf(buf, sizeof(buf), "C:"); + n += apk_hexdump_format(sizeof(buf)-n, &buf[n], APK_BLOB_BUF(info->csum)); + n += snprintf(&buf[n], sizeof(buf)-n, "\n"); + + if (os->write(os, buf, n) != n) + return -1; + t += n; + + return n; } diff --git a/src/version.c b/src/version.c index 45a9edefde0..57437aa789a 100644 --- a/src/version.c +++ b/src/version.c @@ -128,6 +128,24 @@ static int get_token(int *type, apk_blob_t *blob) return v; } +const char *apk_version_op_string(int mask) +{ + switch (mask) { + case APK_VERSION_LESS: + return "<"; + case APK_VERSION_LESS|APK_VERSION_EQUAL: + return "<="; + case APK_VERSION_EQUAL: + return "="; + case APK_VERSION_GREATER|APK_VERSION_EQUAL: + return ">="; + case APK_VERSION_GREATER: + return ">"; + default: + return "?"; + } +} + int apk_version_validate(apk_blob_t ver) { int t = TOKEN_DIGIT; -- cgit v1.2.3