Fix segfault using the --verbosity option.
[oweals/opkg-lede.git] / src / opkg-cl.c
index f1c8f61853fd86ca17be47f7ea03efe2cc3c56b9..a09275f4adaa94c96d737c9d75385b03138ca807 100644 (file)
@@ -40,6 +40,7 @@ enum {
        ARGS_OPT_FORCE_REMOVAL_OF_ESSENTIAL_PACKAGES,
        ARGS_OPT_FORCE_SPACE,
        ARGS_OPT_NOACTION,
+       ARGS_OPT_DOWNLOAD_ONLY,
        ARGS_OPT_NODEPS,
        ARGS_OPT_AUTOREMOVE,
        ARGS_OPT_CACHE,
@@ -74,6 +75,7 @@ static struct option long_options[] = {
        {"force_removal_of_essential_packages", 0, 0,
                ARGS_OPT_FORCE_REMOVAL_OF_ESSENTIAL_PACKAGES},
        {"noaction", 0, 0, ARGS_OPT_NOACTION},
+       {"download-only", 0, 0, ARGS_OPT_DOWNLOAD_ONLY},
        {"nodeps", 0, 0, ARGS_OPT_NODEPS},
        {"offline", 1, 0, 'o'},
        {"offline-root", 1, 0, 'o'},
@@ -93,7 +95,7 @@ args_parse(int argc, char *argv[])
        int parse_err = 0;
 
        while (1) {
-               c = getopt_long_only(argc, argv, "Ad:f:no:p:t:vV:",
+               c = getopt_long_only(argc, argv, "Ad:f:no:p:t:vV::",
                                long_options, &option_index);
                if (c == -1)
                        break;
@@ -118,7 +120,9 @@ args_parse(int argc, char *argv[])
                        printf("opkg version %s\n", VERSION);
                        exit(0);
                case 'V':
-                       conf->verbosity = atoi(optarg);
+                       conf->verbosity = INFO;
+                       if (optarg != NULL)
+                               conf->verbosity = atoi(optarg);
                        break;
                case ARGS_OPT_AUTOREMOVE:
                        conf->autoremove = 1;
@@ -157,6 +161,9 @@ args_parse(int argc, char *argv[])
                case ARGS_OPT_NOACTION:
                        conf->noaction = 1;
                        break;
+        case ARGS_OPT_DOWNLOAD_ONLY:
+                       conf->download_only = 1;
+                       break;
                case ':':
                        parse_err = -1;
                        break;
@@ -209,8 +216,8 @@ usage()
 
        printf("\nOptions:\n");
        printf("\t-A                    Query all packages not just those installed\n"); 
-       printf("\t-V <level>            Set verbosity level to <level>.\n");
-       printf("\t--verbosity <level>   Verbosity levels:\n");
+       printf("\t-V[<level>]           Set verbosity level to <level>.\n");
+       printf("\t--verbosity[=<level>] Verbosity levels:\n");
        printf("\t                              0 errors only\n");
        printf("\t                              1 normal messages (default)\n");
        printf("\t                              2 informative messages\n");
@@ -228,14 +235,15 @@ usage()
        printf("\t--offline-root <dir>  offline installation of packages.\n");
 
        printf("\nForce Options:\n");
-       printf("\t--force-depends               Install/remove despite failed dependences\n");
+       printf("\t--force-depends               Install/remove despite failed dependencies\n");
        printf("\t--force-maintainer    Overwrite preexisting config files\n");
        printf("\t--force-reinstall     Reinstall package(s)\n");
        printf("\t--force-overwrite     Overwrite files from other package(s)\n");
        printf("\t--force-downgrade     Allow opkg to downgrade packages\n");
        printf("\t--force-space         Disable free space checks\n");
        printf("\t--noaction            No action -- test only\n");
-       printf("\t--nodeps              Do not follow dependences\n");
+       printf("\t--download-only       No action -- download only\n");
+       printf("\t--nodeps              Do not follow dependencies\n");
        printf("\t--force-removal-of-dependent-packages\n");
        printf("\t                      Remove package and all dependencies\n");
        printf("\t--autoremove          Remove packages that were installed\n");
@@ -258,16 +266,16 @@ usage()
 int
 main(int argc, char *argv[])
 {
-       int opts;
+       int opts, err = -1;
        char *cmd_name;
        opkg_cmd_t *cmd;
        int nocheckfordirorfile = 0;
         int noreadfeedsfile = 0;
 
+       conf->verbosity = NOTICE;
+
        opts = args_parse(argc, argv);
        if (opts == argc || opts < 0) {
-               fprintf (stderr, "%s: unknown sub-command %s\n", argv[0],
-                        cmd_name);
                fprintf(stderr, "opkg must have one sub-command argument\n");
                usage();
        }
@@ -299,7 +307,6 @@ main(int argc, char *argv[])
                usage();
        }
 
-       conf->verbosity = NOTICE;       
        conf->pfm = cmd->pfm;
 
        if (opkg_conf_init())
@@ -322,15 +329,8 @@ main(int argc, char *argv[])
                usage();
        }
 
-       if (opkg_cmd_exec(cmd, argc - opts, (const char **) (argv + opts)))
-               goto err2;
-
-       print_error_list();
-       free_error_list();
-
-       return 0;
+       err = opkg_cmd_exec(cmd, argc - opts, (const char **) (argv + opts));
 
-err2:
 #ifdef HAVE_CURL
        opkg_curl_cleanup();
 #endif
@@ -341,5 +341,5 @@ err0:
        print_error_list();
        free_error_list();
 
-       return -1;
+       return err;
 }