/* main */ int main (int argc, char **argv) { int curr_index = 0, option_index = -1; static struct option avail_options[] = { {"create", no_argument, 0, 0}, {"update", no_argument, 0, 0}, {"test", no_argument, 0, 0}, {"reset", no_argument, 0, 0}, {0, 0, 0, 0} }; /* Parse command line arguments */ int tmp; while (-1 != (tmp = getopt_long_only (argc, argv, "", avail_options, &curr_index))) { switch (tmp) { case 0: if (-1 == option_index) { option_index = curr_index; } else { form_sys_result(KB_ERR, "Too many parameters!"); exit(0); } break; default: form_sys_result(KB_ERR, "Unknown option passed!"); exit(0); } } if (optind < argc) { form_sys_result(KB_ERR, "Bad parameter passed!"); exit(0); } /* Process as per option passed */ switch (option_index) { case 0: /* create */ opt_create(); break; case -1: /* no arguments were passed */ case 1: /* update */ opt_process("", 0); break; case 2: /* test */ opt_process("", 1); break; case 3: /* reset */ opt_create(); opt_process("", 0); break; default: form_sys_result(KB_ERR, "Unknown option passed!"); exit(0); } return 0; }
void opt_init(char *name, int argc, char **argv) { if (argc < 2) print_usage(name); memset(&options, 0, sizeof(options)); list_init(&options.passwd); options.loader.flags = DB_LOGIN; list_init(&options.loader.users); list_init(&options.loader.groups); list_init(&options.loader.shells); options.length = -1; opt_process(opt_list, &options.flags, argv); ext_flags = 0; if (options.flags & FLG_EXTERNAL_CHK) { if (options.flags & (FLG_CRACKING_CHK | FLG_MAKECHR_CHK)) { ext_flags = EXT_REQ_FILTER | EXT_USES_FILTER; } else { options.flags |= FLG_CRACKING_SET; ext_flags = EXT_REQ_GENERATE | EXT_USES_GENERATE | EXT_USES_FILTER; } } if (!(options.flags & FLG_ACTION)) options.flags |= FLG_BATCH_SET; opt_check(opt_list, options.flags, argv); if (options.session) { #if OS_FORK char *p = strrchr(options.session, '.'); int bad = 0; if (p) { while (*++p) { if (*p < '0' || *p > '9') { bad = 0; break; } bad = 1; } } if (bad) { fprintf(stderr, "Invalid session name: all-digits suffix\n"); error(); } #endif rec_name = options.session; rec_name_completed = 0; } if (options.flags & FLG_RESTORE_CHK) { #if OS_FORK char *rec_name_orig = rec_name; #endif rec_restore_args(1); #if OS_FORK if (options.fork) { rec_name = rec_name_orig; rec_name_completed = 0; } #endif return; } if (options.flags & FLG_STATUS_CHK) { #if OS_FORK char *rec_name_orig = rec_name; #endif rec_restore_args(0); options.flags |= FLG_STATUS_SET; status_init(NULL, 1); status_print(); #if OS_FORK if (options.fork) { unsigned int i; for (i = 2; i <= options.fork; i++) { rec_name = rec_name_orig; rec_name_completed = 0; rec_restoring_now = 0; options.node_min = options.node_max = i; john_main_process = 0; rec_restore_args(0); john_main_process = 1; options.node_min = options.node_max = i; options.flags |= FLG_STATUS_SET; if (rec_restoring_now) status_print(); } } #endif exit(0); } if (options.flags & FLG_SALTS) if (options.loader.min_pps < 0) { options.loader.max_pps = -1 - options.loader.min_pps; options.loader.min_pps = 0; } if (options.length < 0) options.length = PLAINTEXT_BUFFER_SIZE - 3; else if (options.length < 1 || options.length > PLAINTEXT_BUFFER_SIZE - 3) { fprintf(stderr, "Invalid plaintext length requested\n"); error(); } if (options.flags & FLG_STDOUT) options.flags &= ~FLG_PWD_REQ; #if OS_FORK if ((options.flags & FLG_FORK) && (options.fork < 2 || options.fork > 1024)) { fprintf(stderr, "--fork number must be between 2 and 1024\n"); error(); } #endif if (options.node_str) { const char *msg = NULL; int n; if ((n = sscanf(options.node_str, "%u-%u/%u", &options.node_min, &options.node_max, &options.node_count)) != 3) { n = sscanf(options.node_str, "%u/%u", &options.node_min, &options.node_count); options.node_max = options.node_min; #if OS_FORK if (options.fork) options.node_max += options.fork - 1; #endif } if (n < 2) msg = "valid syntax is MIN-MAX/TOTAL or N/TOTAL"; else if (!options.node_min) msg = "valid node numbers start from 1"; else if (options.node_min > options.node_max) msg = "range start can't exceed range end"; else if (options.node_count < 2) msg = "node count must be at least 2"; else if (options.node_max > options.node_count) msg = "node numbers can't exceed node count"; #if OS_FORK else if (options.fork && options.node_max - options.node_min + 1 != options.fork) msg = "range must be consistent with --fork number"; #endif else if (!options.fork && options.node_max - options.node_min + 1 == options.node_count) msg = "node numbers can't span the whole range"; if (msg) { fprintf(stderr, "Invalid node specification: %s: %s\n", options.node_str, msg); error(); } #if OS_FORK } else if (options.fork) { options.node_min = 1; options.node_max = options.node_min + options.fork - 1; options.node_count = options.node_max; #endif } if ((options.flags & (FLG_PASSWD | FLG_PWD_REQ)) == FLG_PWD_REQ) { fprintf(stderr, "Password files required, " "but none specified\n"); error(); } if ((options.flags & (FLG_PASSWD | FLG_PWD_SUP)) == FLG_PASSWD) { fprintf(stderr, "Password files specified, " "but no option would use them\n"); error(); } rec_argc = argc; rec_argv = argv; rec_check = 0; }
void opt_init(char *name, int argc, char **argv) { if (argc < 2) print_usage(name); memset(&options, 0, sizeof(options)); list_init(&options.passwd); options.loader.flags = DB_LOGIN; list_init(&options.loader.users); list_init(&options.loader.groups); list_init(&options.loader.shells); options.length = -1; opt_process(opt_list, &options.flags, argv); ext_flags = 0; if (options.flags & FLG_EXTERNAL_CHK) { if (options.flags & (FLG_CRACKING_CHK | FLG_MAKECHR_CHK)) { ext_flags = EXT_REQ_FILTER | EXT_USES_FILTER; } else { options.flags |= FLG_CRACKING_SET; ext_flags = EXT_REQ_GENERATE | EXT_USES_GENERATE | EXT_USES_FILTER; } } if (!(options.flags & FLG_ACTION)) options.flags |= FLG_BATCH_SET; opt_check(opt_list, options.flags, argv); if (options.session) { rec_name = options.session; rec_name_completed = 0; } if (options.flags & FLG_RESTORE_CHK) { rec_restore_args(1); return; } if (options.flags & FLG_STATUS_CHK) { rec_restore_args(0); options.flags |= FLG_STATUS_SET; status_init(NULL, 1); status_print(); exit(0); } if (options.flags & FLG_SALTS) if (options.loader.min_pps < 0) { options.loader.max_pps = -1 - options.loader.min_pps; options.loader.min_pps = 0; } if (options.length < 0) options.length = PLAINTEXT_BUFFER_SIZE - 3; else if (options.length < 1 || options.length > PLAINTEXT_BUFFER_SIZE - 3) { fprintf(stderr, "Invalid plaintext length requested\n"); error(); } if (options.flags & FLG_STDOUT) options.flags &= ~FLG_PWD_REQ; if ((options.flags & (FLG_PASSWD | FLG_PWD_REQ)) == FLG_PWD_REQ) { fprintf(stderr, "Password files required, " "but none specified\n"); error(); } if ((options.flags & (FLG_PASSWD | FLG_PWD_SUP)) == FLG_PASSWD) { fprintf(stderr, "Password files specified, " "but no option would use them\n"); error(); } rec_argc = argc; rec_argv = argv; rec_check = 0; }