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; }
/* 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; } }