From d2ff3349e261109e18d20cff1a236d3ac573ad58 Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Wed, 2 Mar 2011 00:31:57 -0500 Subject: [PATCH] upkg: Add support for controlling which package is acted upon. Instead of using the last -f option, allow the user to specify one or more packages explicitly. This will eventually be extended to allow specifying individual objects. --- doc/man/upkg.1 | 9 +++++ src/upkg.c | 94 +++++++++++++++++++++++++++++++------------------- 2 files changed, 68 insertions(+), 35 deletions(-) diff --git a/doc/man/upkg.1 b/doc/man/upkg.1 index 9354020..3bc15d0 100644 --- a/doc/man/upkg.1 +++ b/doc/man/upkg.1 @@ -9,6 +9,7 @@ .Op Fl i Ns | Ns Fl x .Op Fl v .Op Fl f Ar package +.Op Ar object ... .Sh OPTIONS .Bl -tag -width indent .It Fl i , -info @@ -26,4 +27,12 @@ packages. Print a version message and exit. .It Fl H , -help Print a help message and exit. +.It Ar object +Specifies the object(s) upon which +.Nm +shall operate. If no object is specified, +.Nm +will use the last package specified by the +.Fl f +option. .El diff --git a/src/upkg.c b/src/upkg.c index 19f1449..a82ab2c 100644 --- a/src/upkg.c +++ b/src/upkg.c @@ -19,6 +19,8 @@ #include #include #include +#include +#include #include #include @@ -64,7 +66,7 @@ There is NO WARRANTY, to the extent permitted by law." void print_usage(FILE *f) { - fprintf(f, "Usage: %s [options]\n", progname); + fprintf(f, "Usage: %s [options] [object ...]\n", progname); } void print_help(void) @@ -218,7 +220,7 @@ int package_info(struct upkg *pkg) if (verbose >= 1) print_upkg_exports(pkg); printf("Imports: %lu\n", pkg->import_count); - return EXIT_SUCCESS; + return 0; } static int export(struct upkg *pkg, GObject *obj, unsigned idx) @@ -262,13 +264,13 @@ int package_export(struct upkg *pkg) const char *class, *package; GObject *obj; GType type; - int rc = EXIT_SUCCESS; + int ret = 0; for (unsigned i = 0; i < pkg->export_count; i++) { class = upkg_export_class(pkg, i, &package); if (!class) { fprintf(stderr, "error getting class information.\n"); - return EXIT_FAILURE; + return -1; } type = u_object_module_get_class(package, class); @@ -277,21 +279,61 @@ int package_export(struct upkg *pkg) obj = g_object_new(type, NULL); if (U_OBJECT_IS_EXPORTABLE(obj)) { if (export(pkg, obj, i) != 0) { - rc = EXIT_FAILURE; + ret = -1; } } g_object_unref(obj); } - return rc; + return ret; } -int main(int argc, char **argv) +static int process_object(int mode, const char *objname) { GTypeModule *pkg; + int ret = 0; + + pkg = u_pkg_open(objname); + if (!pkg || !g_type_module_use(pkg)) { + fprintf(stderr, "%s: %s: failed to open package.\n", + progname, objname); + goto out; + } + + if (!U_PKG(pkg)->pkg) { + if (u_pkg_is_native(pkg)) { + fprintf(stderr, "%s: %s: not a UObject package.\n", + progname, objname); + } else { + fprintf(stderr, "%s: %s: package not found.\n", + progname, objname); + } + + goto out_unuse; + } + + switch (mode) { + case MODE_INFO: + ret = package_info(U_PKG(pkg)->pkg); + break; + case MODE_EXPORT: + ret = package_export(U_PKG(pkg)->pkg); + break; + default: + abort(); + } + +out_unuse: + g_type_module_unuse(pkg); +out: + return ret; +} + +int main(int argc, char **argv) +{ const char *pkgname = NULL; unsigned mode = MODE_INFO; - int opt, rc = EXIT_FAILURE; + int opt, rc; if (argc > 0) progname = argv[0]; @@ -330,40 +372,22 @@ int main(int argc, char **argv) } } - if (!pkgname) { + if (!pkgname && !argv[optind]) { print_usage(stderr); return EXIT_FAILURE; } - pkg = u_pkg_open(pkgname); - if (!pkg || !g_type_module_use(pkg)) { - fprintf(stderr, "%s: %s: failed to open package.\n", - progname, pkgname); - return EXIT_FAILURE; - } - - if (!U_PKG(pkg)->pkg) { - if (u_pkg_is_native(pkg)) { - fprintf(stderr, "%s: %s: not a UObject package.\n", - progname, pkgname); - } else { - fprintf(stderr, "%s: %s: package not found.\n", - progname, pkgname); + rc = EXIT_SUCCESS; + if (argv[optind]) { + for (int i = optind; i < argc; i++) { + if (process_object(mode, argv[i]) != 0) + rc = EXIT_FAILURE; } - - return EXIT_FAILURE; + } else { + if (process_object(mode, pkgname) != 0) + rc = EXIT_FAILURE; } - switch (mode) { - case MODE_INFO: - rc = package_info(U_PKG(pkg)->pkg); - break; - case MODE_EXPORT: - rc = package_export(U_PKG(pkg)->pkg); - break; - } - - g_type_module_unuse(pkg); u_object_module_exit(); u_pkg_vfs_exit(); return rc; -- 2.43.0