void sig_init(void) { clk_tck_init(); timer_save_interval = cfg_get_int(SECTION_OPTIONS, NULL, "Save"); if (timer_save_interval < 0) timer_save_interval = TIMER_SAVE_DELAY; else if ((timer_save_interval /= TIMER_INTERVAL) <= 0) timer_save_interval = 1; if (cfg_get_param(SECTION_OPTIONS, NULL, "AbortGraceTime")) { abort_grace_time = cfg_get_int(SECTION_OPTIONS, NULL, "AbortGraceTime"); } #if OS_TIMER timer_save_value = timer_save_interval; #elif !defined(BENCH_BUILD) timer_save_value = status_get_time() + timer_save_interval; #endif timer_ticksafety_interval = (clock_t)1 << (sizeof(clock_t) * 8 - 4); timer_ticksafety_interval /= clk_tck; if ((timer_ticksafety_interval /= TIMER_INTERVAL) <= 0) timer_ticksafety_interval = 1; timer_ticksafety_value = timer_ticksafety_interval; atexit(sig_done); sig_install(sig_handle_update, SIGHUP); sig_install_abort(); sig_install_timer(); }
static void status_print_cracking(char *percent) { unsigned int time = status_get_time(); char *key, saved_key[PLAINTEXT_BUFFER_SIZE]; char s_cps[64]; if (!(options.flags & FLG_STATUS_CHK)) { if ((key = crk_get_key2())) strnzcpy(saved_key, key, PLAINTEXT_BUFFER_SIZE); else saved_key[0] = 0; } fprintf(stderr, "guesses: %u " "time: %u:%02u:%02u:%02u" "%s " "c/s: %s", status.guess_count, time / 86400, time % 86400 / 3600, time % 3600 / 60, time % 60, percent, status_get_cps(s_cps)); if ((options.flags & FLG_STATUS_CHK) || !(status.crypts.lo | status.crypts.hi)) fputc('\n', stderr); else fprintf(stderr, " trying: %s%s%s\n", crk_get_key1(), saved_key[0] ? " - " : "", saved_key); }
void log_event(const char *format, ...) { va_list args; int count1, count2; if (options.flags & FLG_LOG_STDERR) { unsigned int time; #ifndef HAVE_MPI if (options.fork) #else if (options.fork || mpi_p > 1) #endif fprintf(stderr, "%u ", options.node_min); time = pot.fd >= 0 ? status_get_time() : status_restored_time; fprintf(stderr, "%u:%02u:%02u:%02u ", time / 86400, time % 86400 / 3600, time % 3600 / 60, time % 60); va_start(args, format); vfprintf(stderr, format, args); va_end(args); fprintf(stderr, "\n"); return; } if (log.fd < 0) return; /* * Handle possible recursion: * log_*() -> ... -> pexit() -> ... -> log_event() */ if (in_logger) return; in_logger = 1; count1 = log_time(); if (count1 > 0 && count1 + strlen(format) < LINE_BUFFER_SIZE - 500 - 1) { log.ptr += count1; va_start(args, format); count2 = (int)vsprintf(log.ptr, format, args); va_end(args); if (count2 > 0) { log.ptr += count2; *log.ptr++ = '\n'; } else log.ptr -= count1; if (log_file_write(&log)) log_file_flush(&pot); } in_logger = 0; }
void rec_save(void) { int save_format; long size; char **opt; log_flush(); if (!rec_file) return; if (fseek(rec_file, 0, SEEK_SET)) pexit("fseek"); #ifdef __CYGWIN32__ if (ftruncate(rec_fd, 0)) pexit("ftruncate"); #endif save_format = !options.format && rec_db->loaded; fprintf(rec_file, RECOVERY_V "\n%d\n", rec_argc + (save_format ? 1 : 0)); opt = rec_argv; while (*++opt) fprintf(rec_file, "%s\n", *opt); if (save_format) fprintf(rec_file, "--format=%s\n", rec_db->format->params.label); fprintf(rec_file, "%u\n%u\n%x\n%x\n%x\n%x\n%x\n%x\n%x\n" "%d\n%d\n%d\n%x\n", status_get_time() + 1, status.guess_count, status.combs.lo, status.combs.hi, status.combs_ehi, status.crypts.lo, status.crypts.hi, status.cands.lo, status.cands.hi, status.compat, status.pass, status_get_progress ? status_get_progress() : -1, rec_check); if (rec_save_mode) rec_save_mode(rec_file); if (ferror(rec_file)) pexit("fprintf"); if ((size = ftell(rec_file)) < 0) pexit("ftell"); if (fflush(rec_file)) pexit("fflush"); if (ftruncate(rec_fd, size)) pexit("ftruncate"); #ifndef __CYGWIN32__ if (!options.fork && fsync(rec_fd)) pexit("fsync"); #endif }
static int log_time(void) { unsigned int time; time = pot.fd >= 0 ? status_get_time() : status_restored_time; return (int)sprintf(log.ptr, "%u:%02u:%02u:%02u ", time / 86400, time % 86400 / 3600, time % 3600 / 60, time % 60); }
static void status_print_cracking(char *percent) { unsigned int time = status_get_time(); char *key1, key2[PLAINTEXT_BUFFER_SIZE]; int64 g; char s_gps[32], s_pps[32], s_crypts_ps[32], s_combs_ps[32]; char s[1024], *p; int n; key1 = NULL; key2[0] = 0; if (!(options.flags & FLG_STATUS_CHK) && (status.crypts.lo | status.crypts.hi)) { char *key = crk_get_key2(); if (key) strnzcpy(key2, key, sizeof(key2)); key1 = crk_get_key1(); } p = s; if (options.fork) { n = sprintf(p, "%u ", options.node_min); if (n > 0) p += n; } g.lo = status.guess_count; g.hi = 0; n = sprintf(p, "%ug %u:%02u:%02u:%02u%.100s %.31sg/s ", status.guess_count, time / 86400, time % 86400 / 3600, time % 3600 / 60, time % 60, percent, status_get_cps(s_gps, &g, 0)); if (n > 0) p += n; if (!status.compat) { n = sprintf(p, "%.31sp/s %.31sc/s ", status_get_cps(s_pps, &status.cands, 0), status_get_cps(s_crypts_ps, &status.crypts, 0)); if (n > 0) p += n; } n = sprintf(p, "%.31sC/s%s%.200s%s%.200s\n", status_get_cps(s_combs_ps, &status.combs, status.combs_ehi), key1 ? " " : "", key1 ? key1 : "", key2[0] ? ".." : "", key2); if (n > 0) p += n; fwrite(s, p - s, 1, stderr); }
static int log_time(void) { int count1, count2; unsigned int time; count1 = 0; #ifndef HAVE_MPI if (options.fork) { #else if (options.fork || mpi_p > 1) { #endif count1 = (int)sprintf(log.ptr, "%u ", options.node_min); if (count1 < 0) return count1; } time = pot.fd >= 0 ? status_get_time() : status_restored_time; count2 = (int)sprintf(log.ptr + count1, "%u:%02u:%02u:%02u ", time / 86400, time % 86400 / 3600, time % 3600 / 60, time % 60); if (count2 < 0) return count2; return count1 + count2; } void log_init(char *log_name, char *pot_name, char *session) { in_logger = 1; if (log_name && log.fd < 0) { if (session) log_name = path_session(session, LOG_SUFFIX); log_file_init(&log, log_name, LOG_BUFFER_SIZE); } if (pot_name && pot.fd < 0) { log_file_init(&pot, pot_name, POT_BUFFER_SIZE); cfg_beep = cfg_get_bool(SECTION_OPTIONS, NULL, "Beep", 0); } cfg_log_passwords = cfg_get_bool(SECTION_OPTIONS, NULL, "LogCrackedPasswords", 0); cfg_showcand = cfg_get_bool(SECTION_OPTIONS, NULL, "StatusShowCandidates", 0); in_logger = 0; }
static int log_time(void) { unsigned int time; time = pot.fd >= 0 ? status_get_time() : status_restored_time; #ifdef HAVE_MPI if (mpi_p > 1) return (int)sprintf(log.ptr, "%u %u:%02u:%02u:%02u ", mpi_id, time / 86400, time % 86400 / 3600, time % 3600 / 60, time % 60); else #endif return (int)sprintf(log.ptr, "%u:%02u:%02u:%02u ", time / 86400, time % 86400 / 3600, time % 3600 / 60, time % 60); }
static void status_print_stdout(char *percent) { unsigned int time = status_get_time(); char *key; char s_pps[32], s_p[32]; key = NULL; if (!(options.flags & FLG_STATUS_CHK) && (status.cands.lo | status.cands.hi)) key = crk_get_key1(); fprintf(stderr, "%sp %u:%02u:%02u:%02u%s %sp/s%s%s\n", status_get_c(s_p, &status.cands, 0), time / 86400, time % 86400 / 3600, time % 3600 / 60, time % 60, percent, status_get_cps(s_pps, &status.cands, 0), key ? " " : "", key ? key : ""); }
static void status_print_stdout(char *percent) { unsigned int time = status_get_time(); char s_wps[64]; char s_words[32]; int64 current, next, rem; char *s_words_ptr; s_words_ptr = &s_words[sizeof(s_words) - 1]; *s_words_ptr = 0; current = status.crypts; do { next = current; div64by32(&next, 10); rem = next; mul64by32(&rem, 10); neg64(&rem); add64to64(&rem, ¤t); *--s_words_ptr = rem.lo + '0'; current = next; } while (current.lo || current.hi); fprintf(stderr, "words: %s " "time: %u:%02u:%02u:%02u" "%s%s " "w/s: %s", s_words_ptr, time / 86400, time % 86400 / 3600, time % 3600 / 60, time % 60, strncmp(percent, " 100", 4) ? percent : " DONE", status_get_ETA(percent, time), status_get_cps(s_wps)); if ((options.flags & FLG_STATUS_CHK) || !(status.crypts.lo | status.crypts.hi)) fputc('\n', stderr); else fprintf(stderr, " current: %s\n", crk_get_key1()); }
static int log_time(void) { int count1, count2; unsigned int time; count1 = 0; if (options.fork) { count1 = (int)sprintf(log.ptr, "%u ", options.node_min); if (count1 < 0) return count1; } time = pot.fd >= 0 ? status_get_time() : status_restored_time; count2 = (int)sprintf(log.ptr + count1, "%u:%02u:%02u:%02u ", time / 86400, time % 86400 / 3600, time % 3600 / 60, time % 60); if (count2 < 0) return count2; return count1 + count2; }
static void status_print_total(char *totpercent) { unsigned int max_time, time = status_get_time(); char s_cps[64]; char *tot_ETA; unsigned int sum_guess; MPI_Reduce(&status.guess_count, &sum_guess, 1, MPI_UNSIGNED, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Allreduce(&time, &max_time, 1, MPI_UNSIGNED, MPI_MAX, MPI_COMM_WORLD); tot_ETA = status_get_totalETA(totpercent, max_time); status_get_totalcps(s_cps); if (mpi_id == 0) { fprintf(stderr, "SUM: guesses: %u " "time: %u:%02u:%02u:%02u" "%s%s " "c/s: %s\n", sum_guess, max_time / 86400, max_time % 86400 / 3600, max_time % 3600 / 60, max_time % 60, strncmp(totpercent, " 100", 4) ? totpercent : " DONE", tot_ETA, s_cps); } }
static void rec_name_complete(void) { if (rec_name_completed) return; #ifndef HAVE_MPI if (options.fork && !john_main_process) { #else if (!john_main_process && options.node_min) { #endif char *suffix = mem_alloc(1 + 20 + strlen(RECOVERY_SUFFIX) + 1); sprintf(suffix, ".%u%s", options.node_min, RECOVERY_SUFFIX); rec_name = path_session(rec_name, suffix); MEM_FREE(suffix); } else { rec_name = path_session(rec_name, RECOVERY_SUFFIX); } rec_name_completed = 1; } #if OS_FLOCK || FCNTL_LOCKS static void rec_lock(int shared) { int lockmode; #if FCNTL_LOCKS int blockmode; struct flock lock; #endif /* * In options.c, MPI code path call rec_restore_args(mpi_p) * relying on anything >1 meaning LOCK_SH. After restore, the * root node must block, in case some other node has not yet * closed the original file */ if (shared == 1) { #if FCNTL_LOCKS lockmode = F_WRLCK; blockmode = F_SETLKW; #else lockmode = LOCK_EX; #endif #ifdef HAVE_MPI if (!rec_restored || mpi_id || mpi_p == 1) #endif #if FCNTL_LOCKS blockmode = F_SETLK; #else lockmode |= LOCK_NB; #endif } else #if FCNTL_LOCKS { lockmode = F_RDLCK; blockmode = F_SETLK; } #else lockmode = LOCK_SH | LOCK_NB; #endif #ifdef LOCK_DEBUG fprintf(stderr, "%s(%u): Locking session file...\n", __FUNCTION__, options.node_min); #endif #if FCNTL_LOCKS memset(&lock, 0, sizeof(lock)); lock.l_type = lockmode; if (fcntl(rec_fd, blockmode, &lock)) { if (errno == EAGAIN || errno == EACCES) { #else if (flock(rec_fd, lockmode)) { if (errno == EWOULDBLOCK) { #endif #ifdef HAVE_MPI fprintf(stderr, "Node %d@%s: Crash recovery file is" " locked: %s\n", mpi_id + 1, mpi_name, path_expand(rec_name)); #else fprintf(stderr, "Crash recovery file is locked: %s\n", path_expand(rec_name)); #endif error(); } else #if FCNTL_LOCKS pexit("fcntl()"); #else pexit("flock()"); #endif } #ifdef LOCK_DEBUG fprintf(stderr, "%s(%u): Locked session file (%s)\n", __FUNCTION__, options.node_min, shared == 1 ? "exclusive" : "shared"); #endif } static void rec_unlock(void) { #if FCNTL_LOCKS struct flock lock = { 0 }; lock.l_type = F_UNLCK; #endif #ifdef LOCK_DEBUG fprintf(stderr, "%s(%u): Unlocking session file\n", __FUNCTION__, options.node_min); #endif #if FCNTL_LOCKS if (fcntl(rec_fd, F_SETLK, &lock)) pexit("fcntl(F_UNLCK)"); #else if (flock(rec_fd, LOCK_UN)) pexit("flock(LOCK_UN)"); #endif } #else #define rec_lock(lock) \ {} #define rec_unlock() \ {} #endif void rec_init(struct db_main *db, void (*save_mode)(FILE *file)) { rec_done(1); if (!rec_argc) return; rec_name_complete(); if ((rec_fd = open(path_expand(rec_name), O_RDWR | O_CREAT, 0600)) < 0) pexit("open: %s", path_expand(rec_name)); rec_lock(1); if (!(rec_file = fdopen(rec_fd, "w"))) pexit("fdopen"); rec_db = db; rec_save_mode = save_mode; } void rec_save(void) { int save_format; #ifdef HAVE_MPI int fake_fork; #endif int add_argc = 0, add_enc = 1, add_2nd_enc = 1; int add_mkv_stats = (options.mkv_stats ? 1 : 0); long size; char **opt; log_flush(); if (!rec_file) return; if (fseek(rec_file, 0, SEEK_SET)) pexit("fseek"); #ifdef _MSC_VER if (_write(fileno(rec_file), "", 0)) pexit("ftruncate"); #elif __CYGWIN__ if (ftruncate(rec_fd, 0)) pexit("ftruncate"); #endif save_format = !options.format && rec_db->loaded; #ifdef HAVE_MPI fake_fork = (mpi_p > 1); #endif opt = rec_argv; while (*++opt) { #ifdef HAVE_MPI if (!strncmp(*opt, "--fork", 6)) fake_fork = 0; else #endif if (!strncmp(*opt, "--encoding", 10) || !strncmp(*opt, "--input-encoding", 16)) add_enc = 0; else if (!strncmp(*opt, "--internal-encoding", 19) || !strncmp(*opt, "--target-encoding", 17)) add_2nd_enc = 0; else if (!strncmp(*opt, "--mkv-stats", 11)) add_mkv_stats = 0; } if (add_2nd_enc && (options.flags & FLG_STDOUT) && (pers_opts.input_enc != UTF_8 || pers_opts.target_enc != UTF_8)) add_2nd_enc = 0; add_argc = add_enc + add_2nd_enc + add_mkv_stats; #ifdef HAVE_MPI add_argc += fake_fork; #endif fprintf(rec_file, RECOVERY_V "\n%d\n", rec_argc + (save_format ? 1 : 0) + add_argc); opt = rec_argv; while (*++opt) { /* Add defaults as if they were actually on **argv */ if (options.wordlist && !(strcmp(*opt, "--wordlist") && strcmp(*opt, "--loopback"))) fprintf(rec_file, "%s=%s\n", *opt, options.wordlist); else if (!strcmp(*opt, "--rules")) fprintf(rec_file, "%s=%s\n", *opt, pers_opts.activewordlistrules); else if (!strcmp(*opt, "--single")) fprintf(rec_file, "%s=%s\n", *opt, pers_opts.activesinglerules); else if (!strcmp(*opt, "--incremental")) fprintf(rec_file, "%s=%s\n", *opt, options.charset); else if (!strcmp(*opt, "--markov")) fprintf(rec_file, "%s=%s\n", *opt, options.mkv_param); else fprintf(rec_file, "%s\n", *opt); } if (save_format) fprintf(rec_file, "--format=%s\n", rec_db->format->params.label); if (add_enc) fprintf(rec_file, "--input-encoding=%s\n", cp_id2name(pers_opts.input_enc)); if (add_2nd_enc && pers_opts.input_enc == UTF_8 && pers_opts.target_enc == UTF_8) fprintf(rec_file, "--internal-encoding=%s\n", cp_id2name(pers_opts.internal_enc)); else if (add_2nd_enc) fprintf(rec_file, "--target-encoding=%s\n", cp_id2name(pers_opts.target_enc)); if (add_mkv_stats) fprintf(rec_file, "--mkv-stats=%s\n", options.mkv_stats); #ifdef HAVE_MPI if (fake_fork) fprintf(rec_file, "--fork=%d\n", mpi_p); #endif fprintf(rec_file, "%u\n%u\n%x\n%x\n%x\n%x\n%x\n%x\n%x\n" "%d\n%d\n%d\n%x\n", status_get_time() + 1, status.guess_count, status.combs.lo, status.combs.hi, status.combs_ehi, status.crypts.lo, status.crypts.hi, status.cands.lo, status.cands.hi, status.compat, status.pass, status_get_progress ? (int)status_get_progress() : -1, rec_check); if (rec_save_mode) rec_save_mode(rec_file); if (options.flags & FLG_MASK_STACKED) mask_save_state(rec_file); if (ferror(rec_file)) pexit("fprintf"); if ((size = ftell(rec_file)) < 0) pexit("ftell"); if (fflush(rec_file)) pexit("fflush"); #ifndef _MSC_VER if (ftruncate(rec_fd, size)) pexit("ftruncate"); #endif #if HAVE_WINDOWS_H==0 if (!options.fork && fsync(rec_fd)) pexit("fsync"); #endif }
static void status_print_cracking(char *percent) { unsigned int time = status_get_time(); char *key1, key2[PLAINTEXT_BUFFER_SIZE]; UTF8 t1buf[PLAINTEXT_BUFFER_SIZE + 1]; int64 g; char s_gps[32], s_pps[32], s_crypts_ps[32], s_combs_ps[32]; char s[1024], *p; char sc[32]; int n; key1 = NULL; key2[0] = 0; if (!(options.flags & FLG_STATUS_CHK) && (status.crypts.lo | status.crypts.hi)) { char *key = crk_get_key2(); if (key) strnzcpy(key2, key, sizeof(key2)); key1 = crk_get_key1(); if (options.report_utf8 && !options.utf8) { UTF8 t2buf[PLAINTEXT_BUFFER_SIZE + 1]; char *t; key1 = (char*)enc_to_utf8_r(key1, t1buf, PLAINTEXT_BUFFER_SIZE); t = (char*)enc_to_utf8_r(key2, t2buf, PLAINTEXT_BUFFER_SIZE); strnzcpy(key2, t, sizeof(key2)); } } p = s; #ifndef HAVE_MPI if (options.fork) { #else if (options.fork || mpi_p > 1) { #endif n = sprintf(p, "%u ", options.node_min); if (n > 0) p += n; } if (showcand) { unsigned long long cands = ((unsigned long long) status.cands.hi << 32) + status.cands.lo; sprintf(sc, " %llup", cands); } g.lo = status.guess_count; g.hi = 0; n = sprintf(p, "%ug%s %u:%02u:%02u:%02u%.100s%s %.31sg/s ", status.guess_count, showcand ? sc : "", time / 86400, time % 86400 / 3600, time % 3600 / 60, time % 60, strncmp(percent, " 100", 4) ? percent : " DONE", status_get_ETA(percent,time), status_get_cps(s_gps, &g, 0)); if (n > 0) p += n; if (!status.compat) { n = sprintf(p, "%.31sp/s %.31sc/s ", status_get_cps(s_pps, &status.cands, 0), status_get_cps(s_crypts_ps, &status.crypts, 0)); if (n > 0) p += n; } n = sprintf(p, "%.31sC/s%s%.200s%s%.200s\n", status_get_cps(s_combs_ps, &status.combs, status.combs_ehi), key1 ? " " : "", key1 ? key1 : "", key2[0] ? ".." : "", key2); if (n > 0) p += n; fwrite(s, p - s, 1, stderr); } static void status_print_stdout(char *percent) { unsigned int time = status_get_time(); char *key; char s_pps[32], s_p[32]; key = NULL; if (!(options.flags & FLG_STATUS_CHK) && (status.cands.lo | status.cands.hi)) key = crk_get_key1(); fprintf(stderr, "%sp %u:%02u:%02u:%02u%s%s %sp/s%s%s\n", status_get_c(s_p, &status.cands, 0), time / 86400, time % 86400 / 3600, time % 3600 / 60, time % 60, strncmp(percent, " 100", 4) ? percent : " DONE", status_get_ETA(percent,time), status_get_cps(s_pps, &status.cands, 0), key ? " " : "", key ? key : ""); }
static void sig_handle_timer(int signum) { int saved_errno = errno; #if !OS_TIMER unsigned int time; #endif #ifndef BENCH_BUILD #if OS_TIMER /* Some stuff only done every few seconds */ if (timer_save_interval < 4 || ((timer_save_interval - timer_save_value) & 3) == 3) { #ifdef HAVE_MPI if (!event_reload && mpi_p > 1) { event_pending = event_mpiprobe = 1; } #endif event_poll_files = event_pending = 1; #ifdef SIGUSR2 sig_install(sig_handle_reload, SIGUSR2); #endif } if (!--timer_save_value) { timer_save_value = timer_save_interval; event_save = event_pending = 1; event_reload = options.reload_at_save; } if (timer_abort && !--timer_abort) { aborted_by_timer = 1; if (abort_grace_time > 0) timer_abort = abort_grace_time; else if (abort_grace_time < 0) timer_abort = 0; else /* no grace time, kill immediately */ event_abort = 1; sig_handle_abort(0); } if (timer_status && !--timer_status) { timer_status = options.status_interval; event_status = event_pending = 1; } #else /* no OS_TIMER */ time = status_get_time(); /* Some stuff only done every few seconds */ if ((time & 3) == 3) { #ifdef HAVE_MPI if (!event_reload && mpi_p > 1) { event_pending = event_mpiprobe = 1; } #endif event_poll_files = event_pending = 1; #ifdef SIGUSR2 sig_install(sig_handle_reload, SIGUSR2); #endif } if (time >= timer_save_value) { timer_save_value += timer_save_interval; event_save = event_pending = 1; event_reload = options.reload_at_save; } if (timer_abort && time >= timer_abort) { aborted_by_timer = 1; if (abort_grace_time > 0) timer_abort += abort_grace_time; else if (abort_grace_time < 0) timer_abort = 0; else /* no grace time, kill immediately */ event_abort = 1; sig_handle_abort(0); } if (timer_status && time >= timer_status) { timer_status += options.status_interval; event_status = event_pending = 1; } #endif /* OS_TIMER */ #endif /* !BENCH_BUILD */ if (!--timer_ticksafety_value) { timer_ticksafety_value = timer_ticksafety_interval; event_ticksafety = event_pending = 1; } #ifndef HAVE_MPI if (john_main_process) #endif { int c; #if OS_FORK int new_abort = 0, new_status = 0; #endif while ((c = tty_getchar()) >= 0) { if (c == 3 || c == 'q') { #if OS_FORK new_abort = 1; #endif sig_handle_abort(0); } else { #if OS_FORK new_status = 1; #endif event_status = event_pending = 1; } } #if OS_FORK if (new_abort || new_status) signal_children(new_abort ? SIGTERM : SIGUSR1); #endif } #if !OS_TIMER signal(SIGALRM, sig_handle_timer); #elif !defined(SA_RESTART) && !defined(__DJGPP__) sig_install_timer(); #endif errno = saved_errno; }
static void status_print_cracking(char *percent) { unsigned int time = status_get_time(); char *key, saved_key[PLAINTEXT_BUFFER_SIZE] = ""; char s_cps[64], cand[32] = ""; emms(); if (!(options.flags & FLG_STATUS_CHK)) if ((key = crk_get_key2())) strnzcpy(saved_key, key, PLAINTEXT_BUFFER_SIZE); if (showcand) sprintf(cand, "/%.0f", (double)((long long)status.crypts.hi << 32) + status.crypts.lo); #ifdef HAVE_MPI // we need to print until cr in one call, otherwise output gets interleaved char nodeid[11] = ""; if (mpi_p > 1) snprintf(nodeid, sizeof(nodeid), "%3d: ", mpi_id); nodeid[sizeof(nodeid)-1] = 0; char trying[256]; if ((options.flags & FLG_STATUS_CHK) || !(status.crypts.lo | status.crypts.hi)) trying[0] = 0; else { UTF8 t1buf[PLAINTEXT_BUFFER_SIZE + 1]; UTF8 t2buf[PLAINTEXT_BUFFER_SIZE + 1]; char *t1, *t2; if (options.report_utf8 && !options.utf8) { t1 = (char*)enc_to_utf8_r(crk_get_key1(), t1buf, PLAINTEXT_BUFFER_SIZE); t2 = (char*)enc_to_utf8_r(saved_key, t2buf, PLAINTEXT_BUFFER_SIZE); } else { t1 = crk_get_key1(); t2 = saved_key; } snprintf(trying, sizeof(trying), "%strying: %s%s%s", mpi_p > 1 ? " " : " ", t1, t2[0] ? " - " : "", t2); } fprintf(stderr, "%s" "guesses: %u%s%s" "time: %u:%02u:%02u:%02u" "%s%s%s" "c/s: %s" "%s\n", nodeid, status.guess_count, cand, mpi_p > 1 ? " " : " ", time / 86400, time % 86400 / 3600, time % 3600 / 60, time % 60, strncmp(percent, " 100", 4) ? percent : " DONE", status_get_ETA(percent,time), mpi_p > 1 ? " " : " ", status_get_cps(s_cps), trying); #else fprintf(stderr, "guesses: %u%s " "time: %u:%02u:%02u:%02u" "%s%s " "c/s: %s", status.guess_count, cand, time / 86400, time % 86400 / 3600, time % 3600 / 60, time % 60, strncmp(percent, " 100", 4) ? percent : " DONE", status_get_ETA(percent,time), status_get_cps(s_cps)); if ((options.flags & FLG_STATUS_CHK) || !(status.crypts.lo | status.crypts.hi)) fputc('\n', stderr); else { UTF8 t1buf[PLAINTEXT_BUFFER_SIZE + 1]; UTF8 t2buf[PLAINTEXT_BUFFER_SIZE + 1]; char *t1, *t2; if (options.report_utf8 && !options.utf8) { t1 = (char*)enc_to_utf8_r(crk_get_key1(), t1buf, PLAINTEXT_BUFFER_SIZE); t2 = (char*)enc_to_utf8_r(saved_key, t2buf, PLAINTEXT_BUFFER_SIZE); } else { t1 = crk_get_key1(); t2 = saved_key; } fprintf(stderr, " trying: %s%s%s\n", t1, t2[0] ? " - " : "", t2); } #endif }
static void finish_status(int col_flag) { char *v, ch; Line *l; int top, rows, narrows; char buf[256]; char *str; v = CBuf->status_line; if (*v == 0) v = Default_Status_Line; while (1) { char *v0 = v; while (1) { ch = *v; if (ch == 0) { SLsmg_write_nchars (v0, (unsigned int) (v-v0)); return; } if (ch == '%') { SLsmg_write_nchars (v0, (unsigned int) (v-v0)); break; } v++; } /* At this point *v == '%' */ v++; ch = *v++; switch (ch) { case 'F': SLsmg_write_string (CBuf->dir); str = CBuf->file; break; case 'S': /* stack depth */ sprintf(buf, "%03d", SLstack_depth()); str = buf; break; case 'a': if (CBuf->flags & ABBREV_MODE) str = " abbrev"; else str = NULL; break; case 'f': str = CBuf->file; break; case 'n': narrows = jed_count_narrows (); if (narrows) { sprintf (buf, " Narrow[%d]", narrows); str = buf; } else str = NULL; break; case 'o': if (CBuf->flags & OVERWRITE_MODE) str = " Ovwrt"; else str = NULL; break; case 'O': if (CBuf->flags & OVERWRITE_MODE) str = " ovr"; else str = " ins"; break; case 'b': str = CBuf->name; break; case 'p': str = buf; if (0 == User_Prefers_Line_Numbers) { top = JWindow->sy; rows = JWindow->rows - 1; l = JScreen[top + rows].line; if (l == CBuf->end) l = NULL; if (JScreen[top].line == CBuf->beg) { if (l == NULL) str = "All"; else str = "Top"; } else if (l == NULL) str = "Bot"; else { sprintf(buf, "%d%%", (int) ((LineNum * 100L) / (long) Max_LineNum)); } } else { if (User_Prefers_Line_Numbers == 1) sprintf(buf, "%u/%u", LineNum, Max_LineNum); else { if (col_flag) (void) calculate_column (); sprintf(buf, "%u/%u,%d", LineNum, Max_LineNum, Absolute_Column); } } break; case 'l': sprintf(buf, "%u", LineNum); str=buf; break; case 'L': sprintf(buf, "%u", Max_LineNum); str=buf; break; case 'v': SLsmg_write_string (Jed_Version_String); if (Jed_UTF8_Mode) str = "U"; else str = NULL; break; case 'm': str = CBuf->mode_string; break; case 't': str = status_get_time(); break; case 'c': if (col_flag) (void) calculate_column (); sprintf(buf, "%d", Absolute_Column); str = buf; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { char fmt[16]; int num = ch - '0'; while (isdigit(*v)) { num = num * 10 + (*v - '0'); v++; } if ((num < 0) || (-1 == SLsnprintf (fmt, sizeof(fmt), "%s%du", ((ch == '0') ? "%0" : "%"), num))) strcpy (fmt, "%u"); str = "*"; switch (*v++) { default: v--; break; case 'c': if (col_flag) (void) calculate_column (); if (-1 != SLsnprintf (buf, sizeof (buf), fmt, (unsigned int)Absolute_Column)) str = buf; break; case 'l': if (-1 != SLsnprintf (buf, sizeof (buf), fmt, LineNum)) str = buf; break; case 'L': if (-1 != SLsnprintf (buf, sizeof (buf), fmt, Max_LineNum)) str = buf; break; } } break; case '%': str = "%"; break; case 0: return; default: str = NULL; } if (str != NULL) SLsmg_write_string (str); } }