static void __parse_options(int argc, char *argv[]) { int next_option; const char *progname = basename(argv[0]); /* Set the default option values before parsing args */ __set_default_options(progname); /* A string listing valid short options letters */ const char* const short_options = "hl:m:np:T:U:v"; /* An array describing valid long options */ const struct option long_options[] = { { "help", 0, NULL, 'h' }, { "loglevel", 1, NULL, 'l' }, { "tracemask", 1, NULL, 'm' }, { "nofork", 0, NULL, 'n' }, { "pidfile", 1, NULL, 'p' }, { "tracefile", 1, NULL, 'T' }, { "run-as", 1, NULL, 'U' }, { "version", 0, NULL, 'v' }, { NULL, 0, NULL, 0 } /* Required at end of array */ }; do { next_option = getopt_long(argc, argv, short_options, long_options, NULL); switch(next_option) { case 'h': /* -h or --help */ __print_usage(progname, stdout, EXIT_SUCCESS); case 'l': /* -l or --loglevel */ __logmask = level2mask(optarg); break; case 'm': /* -m or --tracemask */ __tracemask = strtoul(optarg, NULL, 0); break; case 'n': /* -n or --nofork */ __nofork = 1; break; case 'p': /* -p or --pidfile */ snprintf(__pidfile, sizeof(__pidfile), PKGPIDDIR "/%s", optarg); break; case 'T': /* -T or --tracefile */ snprintf(__tracefile, sizeof(__tracefile), "%s", optarg); break; case 'U': /* -U or --run-as */ snprintf(__runas_username, sizeof(__runas_username), "%s", optarg); break; case 'v': /* -v or --version */ /* TODO */ break; case '?': /* The user specified an invalid option */ __print_usage(progname, stderr, EXIT_FAILURE); case EOF: /* Done with options. */ break; default: /* Something else: unexpected */ abort(); } } while (next_option != EOF); }
int main(int argc, char *argv[]) { optind = 1; int opt_idx = 0; int c = -1; int ret = -1; if (!__is_authorized()) { printf("You are not an authorized user!\n"); return -1; } if (argc == 1) __print_usage(); data.request = -1; memset(data.des_path, '\0', PKG_NAME_STRING_LEN_MAX); memset(data.pkg_path, '\0', PKG_NAME_STRING_LEN_MAX); memset(data.pkg_name, '\0', PKG_NAME_STRING_LEN_MAX); memset(data.pkg_type, '\0', PKG_TYPE_STRING_LEN_MAX); data.quiet = 0; data.result = 0; while (1) { c = getopt_long(argc, argv, short_options, long_options, &opt_idx); if (c == -1) break; /* Parse end */ switch (c) { case 'i': /* install */ data.request = INSTALL_REQ; break; case 'u': /* uninstall */ data.request = UNINSTALL_REQ; break; case 'c': /* clear */ data.request = CLEAR_REQ; break; case 'A': /* activate */ data.request = ACTIVATE_REQ; break; case 'D': /* deactivate */ data.request = DEACTIVATE_REQ; break; case 'l': /* list */ data.request = LIST_REQ; break; case 's': /* show */ data.request = SHOW_REQ; break; case 'p': /* package path */ if (optarg) strncpy(data.pkg_path, optarg, PKG_NAME_STRING_LEN_MAX); ret = __convert_to_absolute_path(data.pkg_path); if (ret == -1) { printf("conversion of relative path to absolute path failed\n"); return -1; } printf("package path is %s\n", data.pkg_path); break; case 'd': /* descriptor path */ if (optarg) strncpy(data.des_path, optarg, PKG_NAME_STRING_LEN_MAX); break; case 'n': /* package name */ if (optarg) strncpy(data.pkg_name, optarg, PKG_NAME_STRING_LEN_MAX); break; case 't': /* package type */ if (optarg) strncpy(data.pkg_type, optarg, PKG_TYPE_STRING_LEN_MAX); break; case 'h': /* help */ data.request = HELP_REQ; break; case 'q': /* quiet mode */ data.quiet = 1; break; /* Otherwise */ case '?': /* Not an option */ __print_usage(); break; case ':': /* */ break; default: break; } } ret = __process_request(); if (ret != 0) { printf("processing request %d failed\n", data.request); } return ret; }
static int __process_request() { int ret = -1; int mode = PM_DEFAULT; pkgmgr_client *pc = NULL; switch (data.request) { case INSTALL_REQ: if (data.pkg_type[0] == '\0' || data.pkg_path[0] == '\0') { printf("Please provide the arguments.\n"); printf("use -h option to see usage\n"); ret = -1; break; } g_type_init(); main_loop = g_main_loop_new(NULL, FALSE); pc = pkgmgr_client_new(PC_REQUEST); if (pc == NULL) { printf("PkgMgr Client Creation Failed\n"); ret = -1; break; } if (data.quiet == 0) mode = PM_DEFAULT; else mode = PM_QUIET; if (data.des_path[0] == '\0') ret = pkgmgr_client_install(pc, data.pkg_type, NULL, data.pkg_path, NULL, mode, __return_cb, pc); else ret = pkgmgr_client_install(pc, data.pkg_type, data.des_path, data.pkg_path, NULL, mode, __return_cb, pc); if (ret < 0) break; g_main_loop_run(main_loop); ret = data.result; break; case UNINSTALL_REQ: if (data.pkg_type[0] == '\0' || data.pkg_name[0] == '\0') { printf("Please provide the arguments.\n"); printf("use -h option to see usage\n"); ret = -1; break; } g_type_init(); main_loop = g_main_loop_new(NULL, FALSE); pc = pkgmgr_client_new(PC_REQUEST); if (pc == NULL) { printf("PkgMgr Client Creation Failed\n"); ret = -1; break; } if (data.quiet == 0) mode = PM_DEFAULT; else mode = PM_QUIET; #if 0 ret = __is_app_installed(data.pkg_name); if (ret == -1) { printf("package is not installed\n"); break; } #else pkgmgr_pkginfo_h handle; ret = pkgmgr_get_pkginfo(data.pkg_name, &handle); if(ret < 0) { printf("package is not in pkgmgr_info DB\n"); } else pkgmgr_destroy_pkginfo(handle); #endif ret = pkgmgr_client_uninstall(pc, data.pkg_type, data.pkg_name, mode, __return_cb, NULL); if (ret < 0) break; g_main_loop_run(main_loop); ret = data.result; break; case CLEAR_REQ: if (data.pkg_type[0] == '\0' || data.pkg_name[0] == '\0') { printf("Please provide the arguments.\n"); printf("use -h option to see usage\n"); ret = -1; break; } pc = pkgmgr_client_new(PC_REQUEST); if (pc == NULL) { printf("PkgMgr Client Creation Failed\n"); ret = -1; break; } if (data.quiet == 0) mode = PM_DEFAULT; else mode = PM_QUIET; ret = __is_app_installed(data.pkg_name); if (ret == -1) { printf("package is not installed\n"); break; } ret = pkgmgr_client_clear_user_data(pc, data.pkg_type, data.pkg_name, mode); if (ret < 0) break; ret = data.result; break; case ACTIVATE_REQ: if (data.pkg_type[0] == '\0' || data.pkg_name[0] == '\0') { printf("Please provide the arguments.\n"); printf("use -h option to see usage\n"); ret = -1; break; } pc = pkgmgr_client_new(PC_REQUEST); if (pc == NULL) { printf("PkgMgr Client Creation Failed\n"); ret = -1; break; } ret = pkgmgr_client_activate(pc, data.pkg_type, data.pkg_name); if (ret < 0) break; ret = data.result; break; case DEACTIVATE_REQ: if (data.pkg_type[0] == '\0' || data.pkg_name[0] == '\0') { printf("Please provide the arguments.\n"); printf("use -h option to see usage\n"); ret = -1; break; } pc = pkgmgr_client_new(PC_REQUEST); if (pc == NULL) { printf("PkgMgr Client Creation Failed\n"); ret = -1; break; } ret = pkgmgr_client_deactivate(pc, data.pkg_type, data.pkg_name); if (ret < 0) break; ret = data.result; break; case LIST_REQ: ret = pkgmgr_get_pkg_list(__iter_fn, NULL); break; case SHOW_REQ: if (data.pkg_name[0] != '\0') { pkgmgr_info *pkg_info = pkgmgr_info_new(data.pkg_type, data.pkg_name); if (pkg_info == NULL) { printf("Failed to get pkginfo handle\n"); ret = -1; break; } __print_pkg_info(pkg_info); ret = pkgmgr_info_free(pkg_info); break; } if (data.pkg_path[0] != '\0') { pkgmgr_info *pkg_info = pkgmgr_info_new_from_file(data.pkg_type, data.pkg_path); if (pkg_info == NULL) { printf("Failed to get pkginfo handle\n"); ret = -1; break; } __print_pkg_info(pkg_info); ret = pkgmgr_info_free(pkg_info); break; } printf("Either pkgname or pkgpath should be supplied\n"); ret = -1; break; case HELP_REQ: __print_usage(); ret = 0; break; default: printf("Wrong Request\n"); ret = -1; break; } if (pc) { pkgmgr_client_free(pc); pc = NULL; } return ret; }