diff --git a/bin/xbps-bin/defs.h b/bin/xbps-bin/defs.h index 41f9c915..a6fe8669 100644 --- a/bin/xbps-bin/defs.h +++ b/bin/xbps-bin/defs.h @@ -26,9 +26,9 @@ #ifndef _XBPS_BIN_DEFS_H_ #define _XBPS_BIN_DEFS_H_ -void xbps_exec_transaction(const char *, bool, bool); -void xbps_autoremove_pkgs(void); -void xbps_remove_installed_pkg(const char *, bool); +int xbps_exec_transaction(const char *, bool, bool); +int xbps_autoremove_pkgs(void); +int xbps_remove_installed_pkg(const char *, bool); int xbps_check_pkg_integrity(const char *); int xbps_check_pkg_integrity_all(void); int xbps_show_pkg_deps(const char *); diff --git a/bin/xbps-bin/install.c b/bin/xbps-bin/install.c index cdd0f9f8..da0cc696 100644 --- a/bin/xbps-bin/install.c +++ b/bin/xbps-bin/install.c @@ -39,7 +39,6 @@ struct transaction { bool force; }; -static void cleanup(int); static int exec_transaction(struct transaction *); static void show_missing_deps(prop_dictionary_t, const char *); static int show_missing_dep_cb(prop_object_t, void *, bool *); @@ -206,7 +205,7 @@ show_transaction_sizes(prop_object_iterator_t iter) return 0; } -void +int xbps_exec_transaction(const char *pkgname, bool force, bool update) { struct transaction *trans; @@ -225,10 +224,10 @@ xbps_exec_transaction(const char *pkgname, bool force, bool update) if ((rv = xbps_find_new_packages()) != 0) { if (rv == ENOENT) { printf("No packages currently registered.\n"); - cleanup(0); + return 0; } else if (rv == ENOPKG) { printf("All packages are up-to-date.\n"); - cleanup(0); + return 0; } goto out; } @@ -246,21 +245,21 @@ xbps_exec_transaction(const char *pkgname, bool force, bool update) printf("Package '%s' is up to date.\n", pkgname); prop_object_release(pkgd); - cleanup(rv); + return rv; } else if (rv == ENOENT) { printf("Package '%s' not found in " "repository pool.\n", pkgname); prop_object_release(pkgd); - cleanup(rv); + return rv; } else if (rv != 0) { prop_object_release(pkgd); - cleanup(rv); + return rv; } prop_object_release(pkgd); } else { printf("Package '%s' not installed.\n", pkgname); - cleanup(rv); + return rv; } } else { /* @@ -271,16 +270,16 @@ xbps_exec_transaction(const char *pkgname, bool force, bool update) printf("Package '%s' is already installed.\n", pkgname); prop_object_release(pkgd); - cleanup(rv); + return rv; } rv = xbps_prepare_pkg(pkgname); if (rv != 0 && rv == EAGAIN) { printf("Unable to locate '%s' in " "repository pool.\n", pkgname); - cleanup(rv); + return rv; } else if (rv != 0 && rv != ENOENT) { printf("Unexpected error: %s", strerror(rv)); - cleanup(rv); + return rv; } } } @@ -337,7 +336,7 @@ out2: out1: free(trans); out: - cleanup(rv); + return rv; } static int @@ -544,11 +543,3 @@ exec_transaction(struct transaction *trans) return 0; } - -static void -cleanup(int rv) -{ - xbps_release_repolist_data(); - xbps_release_regpkgdb_dict(); - exit(rv == 0 ? EXIT_SUCCESS : EXIT_FAILURE); -} diff --git a/bin/xbps-bin/main.c b/bin/xbps-bin/main.c index 78d34f3e..32b5a339 100644 --- a/bin/xbps-bin/main.c +++ b/bin/xbps-bin/main.c @@ -168,21 +168,21 @@ main(int argc, char **argv) if (argc != 2) usage(); - xbps_exec_transaction(argv[1], force, false); + rv = xbps_exec_transaction(argv[1], force, false); } else if (strcasecmp(argv[0], "update") == 0) { /* Update an installed package. */ if (argc != 2) usage(); - xbps_exec_transaction(argv[1], force, true); + rv = xbps_exec_transaction(argv[1], force, true); } else if (strcasecmp(argv[0], "remove") == 0) { /* Removes a binary package. */ if (argc != 2) usage(); - xbps_remove_installed_pkg(argv[1], force); + rv = xbps_remove_installed_pkg(argv[1], force); } else if (strcasecmp(argv[0], "show") == 0) { /* Shows info about an installed binary package. */ @@ -192,7 +192,7 @@ main(int argc, char **argv) rv = show_pkg_info_from_metadir(argv[1]); if (rv != 0) { printf("Package %s not installed.\n", argv[1]); - exit(EXIT_FAILURE); + goto out; } } else if (strcasecmp(argv[0], "show-files") == 0) { @@ -203,7 +203,7 @@ main(int argc, char **argv) rv = show_pkg_files_from_metadir(argv[1]); if (rv != 0) { printf("Package %s not installed.\n", argv[1]); - exit(EXIT_FAILURE); + goto out; } } else if (strcasecmp(argv[0], "check") == 0) { @@ -223,7 +223,7 @@ main(int argc, char **argv) if (argc != 1) usage(); - xbps_exec_transaction("all", force, true); + rv = xbps_exec_transaction("all", force, true); } else if (strcasecmp(argv[0], "autoremove") == 0) { /* @@ -234,7 +234,7 @@ main(int argc, char **argv) if (argc != 1) usage(); - xbps_autoremove_pkgs(); + rv = xbps_autoremove_pkgs(); } else if (strcasecmp(argv[0], "purge") == 0) { /* diff --git a/bin/xbps-bin/remove.c b/bin/xbps-bin/remove.c index 6ea2e529..f9efcde3 100644 --- a/bin/xbps-bin/remove.c +++ b/bin/xbps-bin/remove.c @@ -33,7 +33,7 @@ #include "defs.h" #include "../xbps-repo/util.h" -void +int xbps_autoremove_pkgs(void) { prop_array_t orphans; @@ -52,15 +52,18 @@ xbps_autoremove_pkgs(void) orphans = xbps_find_orphan_packages(); if (orphans == NULL) - exit(EXIT_FAILURE); + return errno; + if (orphans != NULL && prop_array_count(orphans) == 0) { printf("There are not orphaned packages currently.\n"); - exit(EXIT_SUCCESS); + goto out; } iter = prop_array_iterator(orphans); - if (iter == NULL) + if (iter == NULL) { + rv = errno; goto out; + } printf("The following packages were installed automatically\n" "(as dependencies) and aren't needed anymore:\n\n"); @@ -99,13 +102,11 @@ out2: prop_object_iterator_release(iter); out: prop_object_release(orphans); - if (rv != 0) - exit(EXIT_FAILURE); - exit(EXIT_SUCCESS); + return rv; } -void +int xbps_remove_installed_pkg(const char *pkgname, bool force) { prop_array_t reqby; @@ -119,7 +120,7 @@ xbps_remove_installed_pkg(const char *pkgname, bool force) dict = xbps_find_pkg_installed_from_plist(pkgname); if (dict == NULL) { printf("Package %s is not installed.\n", pkgname); - goto out; + return 0; } prop_dictionary_get_cstring_nocopy(dict, "version", &version); @@ -133,7 +134,7 @@ xbps_remove_installed_pkg(const char *pkgname, bool force) if (!force) { if (!xbps_noyes("Do you want to remove %s?", pkgname)) { printf("Cancelling!\n"); - goto out; + return 0; } } printf("Forcing %s-%s for deletion!\n", pkgname, version); @@ -141,7 +142,7 @@ xbps_remove_installed_pkg(const char *pkgname, bool force) if (!force) { if (!xbps_noyes("Do you want to remove %s?", pkgname)) { printf("Cancelling!\n"); - goto out; + return 0; } } } @@ -150,13 +151,8 @@ xbps_remove_installed_pkg(const char *pkgname, bool force) if ((rv = xbps_remove_pkg(pkgname, version, false)) != 0) { printf("Unable to remove %s-%s (%s).\n", pkgname, version, strerror(errno)); - goto out; + return rv; } -out: - xbps_release_regpkgdb_dict(); - if (rv != 0) - exit(EXIT_FAILURE); - - exit(EXIT_SUCCESS); + return 0; }