Пример #1
0
Файл: main.c Проект: pbleser/mdp
int
main(int ac, char **av)
{
	char *t;
	int opt, mode = MODE_PAGER;
	extern int optind;
	extern char *optarg;

	if (ac < 2)
		usage();

	setlocale(LC_ALL, "");

	/* Populate $HOME */
	t = getenv("HOME");
	if (t == NULL || *t == '\0')
		errx(0, "Unknown variable '$HOME'.");
	mbstowcs(home, t, MAXPATHLEN);

	/* Populate $EDITOR */
	t = getenv("EDITOR");
	if (t != NULL)
		mbstowcs(editor, t, MAXPATHLEN);

	while ((opt = getopt(ac, av, "hVdeg:qrc:")) != -1) {
		switch (opt) {
		case 'd':
			cfg_debug = 1;
			break;
		case 'V':
			mode = MODE_VERSION;
			break;
		case 'q':
			mode = MODE_QUERY;
			break;
		case 'e':
			mode = MODE_EDIT;
			break;
		case 'g':
			mode = MODE_GENERATE;
			password_length = strtoumax(optarg, NULL, 10);
			break;
		case 'r':
			mode = MODE_RAW;
			break;
		case 'c':
			swprintf(cfg_config_path, MAXPATHLEN, L"%s", optarg);
			break;
		default:
			usage();
		}
	}

	debug("read config");

	config_set_defaults();
	config_check_paths();
	config_read();

	ac -= optind;
	av += optind;

	keywords_load_from_argv(av);

	/* Decide if we use the internal pager or just dump to screen. */
	switch (mode) {
		case MODE_VERSION:
			printf("mdp-%s\n", MDP_VERSION);
			break;

		case MODE_RAW:
			debug("mode: MODE_RAW");
			if (ac == 0)
				usage();

			gpg_check();
			load_results();
			filter_results();
			print_results();
			break;

		case MODE_PAGER:
			debug("mode: MODE_PAGER");
			if (ac == 0)
				usage();

			gpg_check();
			load_results();
			filter_results();
			pager(START_WITHOUT_PROMPT);
			break;

		case MODE_QUERY:
			debug("mode: MODE_QUERY");
			gpg_check();
			load_results();
			pager(START_WITH_PROMPT);
			break;

		case MODE_EDIT:
			debug("mode: MODE_EDIT");
			if (ac != 0)
				usage();

			gpg_check();
			lock_set();
			load_results();
			edit_results();
			break;

		case MODE_GENERATE:
			debug("mode: MODE_GENERATE");
			if (ac != 0)
				usage();

			print_passwords(password_length, cfg_password_count);
			break;

		default:
			errx(1, "unknown mode");
			break;
	}

	debug("normal shutdown");

	return 0;
}
Пример #2
0
/* recurse through starting directory 
 *  print out matching resources/types
 */
void search_dir(char *parentdir, char * dirname, struct opt_info * opts) {
    DIR *dir_ptr; /* an actual directory */
    char currpath[PATH_MAX + 1];
    int num_glob_call = 0; /* keep glob from running too many times */

    if (parentdir != NULL && parentdir[0] != '\0') {
        /* keep current full path */
        sprintf(currpath, "%s/%s", parentdir, dirname);
    } else {
        strcpy(currpath, dirname);
    }

    /* open the directory with name dirname, if not report and return 
     * not necessarily a failure
     */
    dir_ptr = opendir(dirname);

    if (!dir_ptr) {
        report_func_err(dirname);
        return;
    }

    int cherr = chdir(dirname);
    if (cherr != 0) {
        report_err("chdir", dirname);
        closedir(dir_ptr); // don't care about errors
        return;
    }

    for (;;) {
        struct dirent entry;
        struct dirent *next_dir;
        char *name;

        int err = readdir_r(dir_ptr, &entry, &next_dir);
        if (err != 0) {
            continue;
        }

        if (next_dir == NULL) {
            break;
        }


        name = next_dir->d_name;
        if ((strcmp(name, ".") == 0) || (strcmp(name, "..") == 0)) {
            continue; /* skip self and parents */
        } else {
            filter_results(opts, currpath, &num_glob_call);
        }

        if (next_dir->d_type == DT_DIR) { /* only recurse thru directories */
            search_dir(currpath, name, opts); /* RECURSION!!! */
        }
    }

    closedir(dir_ptr);

    cherr = chdir("..");
    if (cherr != 0) {
        report_err("chdir", "..");
        return;
    }

}