From fb998feacf2d4204fb31f7ad5eb9acffa16af988 Mon Sep 17 00:00:00 2001 From: Juan RP Date: Tue, 17 Feb 2009 00:08:03 +0100 Subject: [PATCH] xbps-bin: add -v flag, used when installing/removing currently. --HG-- extra : convert_revision : d543b52213bf3d35b17ef29ff74a879bc4342cef --- bin/xbps-bin/main.c | 16 ++++++++++------ include/install.h | 9 ++++----- include/remove.h | 2 +- include/xbps_api.h | 3 +++ lib/depends.c | 10 ++++++---- lib/install.c | 35 +++++++++++++++++++---------------- lib/remove.c | 29 +++++++++++++++++------------ lib/unpack.c | 42 +++++++++++++++++++++++------------------- 8 files changed, 83 insertions(+), 63 deletions(-) diff --git a/bin/xbps-bin/main.c b/bin/xbps-bin/main.c index 5ac6f48876a..774f431528b 100644 --- a/bin/xbps-bin/main.c +++ b/bin/xbps-bin/main.c @@ -52,6 +52,7 @@ usage(void) " show\t\n" " Options shared by all actions:\n" " -r\t\t\n" + " -v\t\t\n" "\n" " Examples:\n" " $ xbps-bin install klibc\n" @@ -110,15 +111,18 @@ main(int argc, char **argv) { prop_dictionary_t dict; char *plist, *root = NULL; - int c, rv = 0; + int c, flags = 0, rv = 0; - while ((c = getopt(argc, argv, "r:")) != -1) { + while ((c = getopt(argc, argv, "r:v")) != -1) { switch (c) { case 'r': /* To specify the root directory */ root = optarg; xbps_set_rootdir(root); break; + case 'v': + flags |= XBPS_UNPACK_VERBOSE; + break; case '?': default: usage(); @@ -164,8 +168,8 @@ main(int argc, char **argv) /* Install into root directory by default. */ if (strcasecmp(argv[0], "install") == 0) { - rv = xbps_install_binary_pkg(argv[1], root); - if (rv) { + rv = xbps_install_binary_pkg(argv[1], root, flags); + if (rv != 0 && rv != EEXIST) { dict = xbps_get_pkg_deps_dictionary(); if (dict == NULL && errno == ENOENT) printf("Unable to locate %s in " @@ -177,8 +181,8 @@ main(int argc, char **argv) } printf("Package %s installed successfully.\n", argv[1]); } else { - rv = xbps_remove_binary_pkg(argv[1], root); - if (rv) { + rv = xbps_remove_binary_pkg(argv[1], root, flags); + if (rv != 0) { if (errno == ENOENT) printf("Package %s is not installed.\n", argv[1]); diff --git a/include/install.h b/include/install.h index 1f5856c039c..9b943b56c77 100644 --- a/include/install.h +++ b/include/install.h @@ -27,15 +27,14 @@ #define _XBPS_INSTALL_H_ /* From lib/install.c, lib/depends.c and lib/unpack.c */ -int xbps_install_pkg_deps(prop_dictionary_t, const char *); -int xbps_install_binary_pkg(const char *, const char *); +int xbps_install_pkg_deps(prop_dictionary_t, const char *, int); +int xbps_install_binary_pkg(const char *, const char *, int); int xbps_install_binary_pkg_fini(prop_dictionary_t, prop_dictionary_t, - const char *); + const char *, int); int xbps_register_pkg(prop_dictionary_t, const char *, const char *, const char *, bool); int xbps_unpack_binary_pkg(prop_dictionary_t, prop_dictionary_t, - const char *, - void (*cb_print)(prop_dictionary_t)); + const char *, int); int xbps_update_pkg_requiredby(prop_array_t, prop_dictionary_t); int xbps_find_deps_in_pkg(prop_dictionary_t); diff --git a/include/remove.h b/include/remove.h index 60442f405f9..358a45fa687 100644 --- a/include/remove.h +++ b/include/remove.h @@ -27,7 +27,7 @@ #define _XBPS_REMOVE_H_ /* From lib/remove.c */ -int xbps_remove_binary_pkg(const char *, const char *); +int xbps_remove_binary_pkg(const char *, const char *, int); int xbps_unregister_pkg(const char *); #endif /* !_XBPS_REMOVE_H_ */ diff --git a/include/xbps_api.h b/include/xbps_api.h index 6c6095d8711..45baefd3d72 100644 --- a/include/xbps_api.h +++ b/include/xbps_api.h @@ -50,6 +50,9 @@ /* Filename of the package properties plist file. */ #define XBPS_PKGPROPS "props.plist" +/* Unpack flags */ +#define XBPS_UNPACK_VERBOSE 0x00000001 + #include "cmpver.h" #include "fexec.h" #include "humanize_number.h" diff --git a/lib/depends.c b/lib/depends.c index f3d7ba5cf79..80bd1b38e3a 100644 --- a/lib/depends.c +++ b/lib/depends.c @@ -301,6 +301,10 @@ xbps_find_deps_in_pkg(prop_dictionary_t pkg) assert(pkg != NULL); + pkg_rdeps = prop_dictionary_get(pkg, "run_depends"); + if (pkg_rdeps == NULL) + return 0; + /* * Get the dictionary with the list of registered repositories. */ @@ -330,8 +334,6 @@ xbps_find_deps_in_pkg(prop_dictionary_t pkg) return ENOMEM; } - pkg_rdeps = prop_dictionary_get(pkg, "run_depends"); - /* * Iterate over the repository pool and find out if we have * all available binary packages. @@ -589,7 +591,7 @@ find_pkg_deps_from_repo(prop_dictionary_t repo, prop_dictionary_t pkg, } int -xbps_install_pkg_deps(prop_dictionary_t pkg, const char *destdir) +xbps_install_pkg_deps(prop_dictionary_t pkg, const char *destdir, int flags) { prop_array_t required, missing; prop_object_t obj; @@ -623,7 +625,7 @@ xbps_install_pkg_deps(prop_dictionary_t pkg, const char *destdir) * Install all required dependencies, previously sorted. */ while ((obj = prop_object_iterator_next(iter)) != NULL) { - rv = xbps_install_binary_pkg_fini(NULL, obj, destdir); + rv = xbps_install_binary_pkg_fini(NULL, obj, destdir, flags); if (rv != 0) break; } diff --git a/lib/install.c b/lib/install.c index 588929cd465..12500e0231d 100644 --- a/lib/install.c +++ b/lib/install.c @@ -37,13 +37,14 @@ struct cbargs { const char *destdir; const char *pkgname; + int flags; }; static int install_binpkg_repo_cb(prop_object_t, void *, bool *); int xbps_install_binary_pkg_fini(prop_dictionary_t repo, prop_dictionary_t pkg, - const char *destdir) + const char *destdir, int flags) { const char *pkgname, *version, *desc; int rv = 0; @@ -65,23 +66,22 @@ xbps_install_binary_pkg_fini(prop_dictionary_t repo, prop_dictionary_t pkg, (void)fflush(stdout); - rv = xbps_unpack_binary_pkg(repo, pkg, destdir, NULL); + rv = xbps_unpack_binary_pkg(repo, pkg, destdir, flags); if (rv == 0) { rv = xbps_register_pkg(pkg, pkgname, version, desc, automatic); - if (rv == EEXIST) - rv = 0; + if (rv != 0) { + printf("failed!\n"); + return rv; + } } - if (rv == 0) - printf("done.\n"); - else - printf("failed!\n"); + printf("done.\n"); - return rv; + return 0; } int -xbps_install_binary_pkg(const char *pkgname, const char *destdir) +xbps_install_binary_pkg(const char *pkgname, const char *destdir, int flags) { struct cbargs cb; int rv = 0; @@ -95,14 +95,15 @@ xbps_install_binary_pkg(const char *pkgname, const char *destdir) cb.pkgname = pkgname; cb.destdir = destdir; + cb.flags = flags; /* * Iterate over the repository pool and find out if we have * all available binary packages. */ rv = xbps_callback_array_iter_in_repolist(install_binpkg_repo_cb, (void *)&cb); - if (rv == 0 && errno == ENOENT) - rv = errno; + if (rv == 0 && errno == EAGAIN) + return ENOENT; return rv; } @@ -135,7 +136,7 @@ install_binpkg_repo_cb(prop_object_t obj, void *arg, bool *cbloop_done) pkgrd = xbps_find_pkg_in_dict(repod, "packages", pkgname); if (pkgrd == NULL) { prop_object_release(repod); - errno = ENOENT; + errno = EAGAIN; return 0; } @@ -144,7 +145,8 @@ install_binpkg_repo_cb(prop_object_t obj, void *arg, bool *cbloop_done) */ if (!xbps_pkg_has_rundeps(pkgrd)) { /* pkg has no deps, just install it. */ - rv = xbps_install_binary_pkg_fini(repod, pkgrd, destdir); + rv = xbps_install_binary_pkg_fini(repod, pkgrd, destdir, + cb->flags); prop_object_release(repod); return rv; } @@ -164,8 +166,9 @@ install_binpkg_repo_cb(prop_object_t obj, void *arg, bool *cbloop_done) /* * Install all required dependencies and the package itself. */ - if ((rv = xbps_install_pkg_deps(pkgrd, destdir)) == 0) { - rv = xbps_install_binary_pkg_fini(repod, pkgrd, destdir); + if ((rv = xbps_install_pkg_deps(pkgrd, destdir, cb->flags)) == 0) { + rv = xbps_install_binary_pkg_fini(repod, pkgrd, destdir, + cb->flags); prop_object_release(repod); if (rv == 0) *cbloop_done = true; diff --git a/lib/remove.c b/lib/remove.c index 0016f490f0d..8a724ea7265 100644 --- a/lib/remove.c +++ b/lib/remove.c @@ -57,7 +57,7 @@ xbps_unregister_pkg(const char *pkgname) } static int -xbps_remove_binary_pkg_meta(const char *pkgname, const char *destdir) +xbps_remove_binary_pkg_meta(const char *pkgname, const char *destdir, int flags) { struct dirent *dp; DIR *dirp; @@ -88,8 +88,9 @@ xbps_remove_binary_pkg_meta(const char *pkgname, const char *destdir) } if ((rv = unlink(path)) == -1) { - printf("WARNING: can't remove %s (%s)\n", - pkgname, strerror(errno)); + if (flags & XBPS_UNPACK_VERBOSE) + printf("WARNING: can't remove %s (%s)\n", + pkgname, strerror(errno)); } (void)memset(&path, 0, sizeof(path)); } @@ -100,7 +101,7 @@ xbps_remove_binary_pkg_meta(const char *pkgname, const char *destdir) } int -xbps_remove_binary_pkg(const char *pkgname, const char *destdir) +xbps_remove_binary_pkg(const char *pkgname, const char *destdir, int flags) { FILE *flist; char path[PATH_MAX - 1], line[LINE_MAX - 1], *p, *buf; @@ -193,19 +194,23 @@ xbps_remove_binary_pkg(const char *pkgname, const char *destdir) rv = 0; goto next; } - printf("WARNING: can't remove directory" - " %s (%s)\n", path, strerror(errno)); + if (flags & XBPS_UNPACK_VERBOSE) + printf("WARNING: can't remove " + "directory %s (%s)\n", + path, strerror(errno)); goto next; } - printf("Removed directory: %s\n", path); + if (flags & XBPS_UNPACK_VERBOSE) + printf("Removed directory: %s\n", path); goto next; } - printf("WARNING: can't remove file %s (%s)\n", path, - strerror(errno)); + if (flags & XBPS_UNPACK_VERBOSE) + printf("WARNING: can't remove file %s (%s)\n", path, + strerror(errno)); goto next; } - - printf("Removed file: %s\n", path); + if (flags & XBPS_UNPACK_VERBOSE) + printf("Removed file: %s\n", path); next: free(p); p = NULL; @@ -226,7 +231,7 @@ next: out: free(buf); - rv = xbps_remove_binary_pkg_meta(pkgname, destdir); + rv = xbps_remove_binary_pkg_meta(pkgname, destdir, flags); return rv; } diff --git a/lib/unpack.c b/lib/unpack.c index 813f3d01163..44eaf353723 100644 --- a/lib/unpack.c +++ b/lib/unpack.c @@ -35,14 +35,14 @@ #include -static int unpack_archive_init(prop_dictionary_t, const char *, const char *); -static int unpack_archive_fini(struct archive *, const char *, +static int unpack_archive_init(prop_dictionary_t, const char *, + const char *, int); +static int unpack_archive_fini(struct archive *, const char *, int, prop_dictionary_t); int xbps_unpack_binary_pkg(prop_dictionary_t repo, prop_dictionary_t pkg, - const char *destdir, - void (*cb_print)(prop_dictionary_t)) + const char *destdir, int flags) { prop_string_t filename, repoloc, arch; char *binfile, *path; @@ -72,10 +72,7 @@ xbps_unpack_binary_pkg(prop_dictionary_t repo, prop_dictionary_t pkg, } free(path); - if (cb_print) - (*cb_print)(pkg); - - rv = unpack_archive_init(pkg, destdir, binfile); + rv = unpack_archive_init(pkg, destdir, binfile, flags); free(binfile); return rv; } @@ -83,7 +80,7 @@ xbps_unpack_binary_pkg(prop_dictionary_t repo, prop_dictionary_t pkg, static int unpack_archive_init(prop_dictionary_t pkg, const char *destdir, - const char *binfile) + const char *binfile, int flags) { struct archive *ar; int pkg_fd, rv; @@ -111,7 +108,7 @@ unpack_archive_init(prop_dictionary_t pkg, const char *destdir, return rv; } - rv = unpack_archive_fini(ar, destdir, pkg); + rv = unpack_archive_fini(ar, destdir, flags, pkg); /* * If installation of package was successful, make sure the package * is really on storage (if possible). @@ -139,7 +136,7 @@ unpack_archive_init(prop_dictionary_t pkg, const char *destdir, * the consumer. */ static int -unpack_archive_fini(struct archive *ar, const char *destdir, +unpack_archive_fini(struct archive *ar, const char *destdir, int flags, prop_dictionary_t pkg) { struct archive_entry *entry; @@ -148,7 +145,7 @@ unpack_archive_fini(struct archive *ar, const char *destdir, const char *prepost = "./XBPS_PREPOST_INSTALL"; const char *pkgname, *version; char *buf, *path; - int rv = 0, flags = 0; + int rv = 0, lflags = 0; bool actgt = false; assert(ar != NULL); @@ -158,9 +155,9 @@ unpack_archive_fini(struct archive *ar, const char *destdir, prop_dictionary_get_cstring_nocopy(pkg, "version", &version); if (getuid() == 0) - flags = FEXTRACT_FLAGS; + lflags = FEXTRACT_FLAGS; else - flags = EXTRACT_FLAGS; + lflags = EXTRACT_FLAGS; /* * This length is '.%s/metadata/%s/prepost-inst' not @@ -205,7 +202,7 @@ unpack_archive_fini(struct archive *ar, const char *destdir, archive_entry_set_pathname(entry, buf); - rv = archive_read_extract(ar, entry, flags); + rv = archive_read_extract(ar, entry, lflags); if (rv != 0 && rv != EEXIST) break; @@ -223,18 +220,25 @@ unpack_archive_fini(struct archive *ar, const char *destdir, /* * Extract all data from the archive now. */ - rv = archive_read_extract(ar, entry, flags); + rv = archive_read_extract(ar, entry, lflags); if (rv != 0 && rv != EEXIST) { printf("\ncouldn't unpack %s (%s), exiting!\n", archive_entry_pathname(entry), strerror(errno)); (void)fflush(stdout); break; } else if (rv == EEXIST) { - printf("\nignoring existent component %s.\n", - archive_entry_pathname(entry)); - (void)fflush(stdout); + if (flags & XBPS_UNPACK_VERBOSE) { + printf("\nignoring existent component %s.\n", + archive_entry_pathname(entry)); + (void)fflush(stdout); + } continue; } + + if (flags & XBPS_UNPACK_VERBOSE) { + printf(" %s\n", archive_entry_pathname(entry)); + (void)fflush(stdout); + } } if (rv == 0 && actgt) {