Beispiel #1
0
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;
}