static void john_set_mpi(void) { options.node_min += mpi_id; options.node_max = options.node_min; if (mpi_p > 1) { if (!john_main_process) { if (rec_restoring_now) { unsigned int node_id = options.node_min; rec_done(-2); rec_restore_args(1); if (node_id != options.node_min + mpi_id) fprintf(stderr, "Inconsistent crash recovery file:" " %s\n", rec_name); options.node_min = options.node_max = node_id; } } } fflush(stdout); fflush(stderr); }
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; }
static void john_fork(void) { int i, pid; int *pids; fflush(stdout); fflush(stderr); #if HAVE_MPI /* * We already initialized MPI before knowing this is actually a fork session. * So now we need to tear that "1-node MPI session" down before forking, or * all sorts of funny things might happen. */ mpi_teardown(); #endif /* * It may cost less memory to reset john_main_process to 0 before fork()'ing * the children than to do it in every child process individually (triggering * copy-on-write of the entire page). We then reset john_main_process back to * 1 in the parent, but this only costs one page, not one page per child. */ john_main_process = 0; pids = mem_alloc_tiny((options.fork - 1) * sizeof(*pids), sizeof(*pids)); for (i = 1; i < options.fork; i++) { switch ((pid = fork())) { case -1: pexit("fork"); case 0: sig_preinit(); options.node_min += i; options.node_max = options.node_min; #if HAVE_OPENCL // Poor man's multi-device support if (options.gpu_devices->count && strstr(database.format->params.label, "-opencl")) { // Pick device to use for this child opencl_preinit(); gpu_id = gpu_device_list[i % get_number_of_devices_in_use()]; platform_id = get_platform_id(gpu_id); // Hide any other devices from list gpu_device_list[0] = gpu_id; gpu_device_list[1] = -1; // Postponed format init in forked process fmt_init(database.format); } #endif if (rec_restoring_now) { unsigned int node_id = options.node_min; rec_done(-2); rec_restore_args(1); if (node_id != options.node_min + i) fprintf(stderr, "Inconsistent crash recovery file:" " %s\n", rec_name); options.node_min = options.node_max = node_id; } sig_init_child(); return; default: pids[i - 1] = pid; } } #if HAVE_OPENCL // Poor man's multi-device support if (options.gpu_devices->count && strstr(database.format->params.label, "-opencl")) { // Pick device to use for mother process opencl_preinit(); gpu_id = gpu_device_list[0]; platform_id = get_platform_id(gpu_id); // Hide any other devices from list gpu_device_list[1] = -1; // Postponed format init in mother process fmt_init(database.format); } #endif john_main_process = 1; john_child_pids = pids; john_child_count = options.fork - 1; options.node_max = options.node_min; }