51 broke -E logic completely, rewise it
[tfcrypt.git] / tfc_signal.c
index 550b6c4d0ae1f5c74213495cb7030f593907cb88..a81aa1efcd85d9faa1d16d1bfef5eab5dcb7c566 100644 (file)
 
 void exit_sigterm(int signal)
 {
+       tfc_esay("\n");
        xexit(0);
 }
 
+void handle_sigtstp(int signal)
+{
+       if (signal == SIGTSTP) {
+               tfc_useconds freeze_start, freeze_end;
+
+               tfc_getcurtime(&freeze_start);
+               kill(getpid(), SIGSTOP);
+               tfc_getcurtime(&freeze_end);
+               total_time -= (freeze_end - freeze_start);
+       }
+}
+
 void print_crypt_status(int signal)
 {
        tfc_fsize wr_speed;
-       double seconds, human_totalproc_src, human_totalproc_dst, human_wr_speed;
-       int src_scale_idx, dst_scale_idx, wr_speed_scale;
+       double seconds, human_totalproc_src, human_totalproc_dst, human_totalwrit_dst, human_wr_speed;
+       int src_scale_idx, dst_scale_idx, wri_scale_idx, wr_speed_scale;
        const char *oper_mode, *inplace;
-       static tfc_yesno last, was_sigint;
+       static tfc_yesno last;
+       tfc_yesno finished = NO;
 
        if (last == YES) return;
-       if (signal == 0) last = YES;
+       if (signal == TFC_SIGLAST) {
+               last = YES;
+               finished = YES;
+       }
 
        switch (do_edcrypt) {
                case TFC_DO_ENCRYPT: oper_mode = "encrypted"; break;
                case TFC_DO_DECRYPT: oper_mode = "decrypted"; break;
                default:
                        if (ctr_mode == TFC_MODE_PLAIN) oper_mode = "written";
+                       else if (ctr_mode == TFC_MODE_XOR) oper_mode = "xored";
                        else if (ctr_mode == TFC_MODE_SKSUM) oper_mode = "hashed";
                        else oper_mode = NULL;
                        break;
        }
 
        if (signal == SIGINT || signal == SIGTERM) {
-               if (signal == SIGINT) was_sigint = YES;
-               if (do_stop == TFC_STOP_FULL) xexit(0);
-               do_stop = TFC_STOP_FULL;
-               status_timer = 0;
-               verbose = NO;
-               if (bench_timer) goto _out;
-               return;
+               do_stop = YES;
        }
 
-_out:  tfc_getcurtime(&current_time);
+       tfc_getcurtime(&current_time);
+       total_time += (current_time - delta_time);
        seconds = TFC_UTODSECS(current_time - delta_time);
        wr_speed = delta_processed / seconds;
        tfc_describescale(total_processed_src, &human_totalproc_src, &src_scale_idx);
        tfc_describescale(total_processed_dst, &human_totalproc_dst, &dst_scale_idx);
+       tfc_describescale(total_written_dst, &human_totalwrit_dst, &wri_scale_idx);
        tfc_describescale(wr_speed, &human_wr_speed, &wr_speed_scale);
 
        if (bench_timer) {
                tfc_say("done!");
-               tfc_say("%s %s benchmark results:", progname, tfc_modename(ctr_mode));
+               tfc_say("%s %s benchmark results:", tfc_format_pid(progname), tfc_modename(ctr_mode));
                tfc_nfsay(stdout, "%s %llu (%.2f%s) bytes, "
                        "avg. speed %llu (%.2f%s) B/s, time %.4fs.",
                        oper_mode,
                        total_processed_src, human_totalproc_src, tfc_getscale(src_scale_idx),
-                       wr_speed, human_wr_speed, tfc_getscale(wr_speed_scale),
-                       TFC_UTODSECS(current_time - delta_time));
-               if (was_sigint == NO) tfc_esay("\n");
+                       wr_speed, human_wr_speed, tfc_getscale(wr_speed_scale), seconds);
                xexit(0);
        }
 
@@ -88,43 +100,45 @@ _out:      tfc_getcurtime(&current_time);
        else inplace = "";
 
        if (do_less_stats == YES) {
-               tfc_nfsay(stderr, "%s%s:"
+               tfc_nfsay(stderr, "%s%s%s:"
                        " %s %.2f%s,"
-                       " %.2f%s B/s",
-                       inplace, progname,
+                       " %.2f%s B/s @%s",
+                       inplace, (finished && show_when_done) ? "finished: " : "", tfc_format_pid(progname),
                        oper_mode,
                        human_totalproc_dst, tfc_getscale(dst_scale_idx),
-                       human_wr_speed, tfc_getscale(wr_speed_scale));
+                       human_wr_speed, tfc_getscale(wr_speed_scale), tfc_format_time(total_time));
        }
        else {
-               if (ctr_mode <= TFC_MODE_PLAIN) tfc_nfsay(stderr, "%s%s: read: %llu (%.2f%s),"
+               if (ctr_mode <= TFC_MODE_PLAIN) tfc_nfsay(stderr, "%s%s%s: read: %llu (%.2f%s),"
                        " %s %llu (%.2f%s) bytes,"
-                       " (%llu (%.2f%s) B/s)",
-                       inplace, progname,
+                       " (%llu (%.2f%s) B/s), time %s",
+                       inplace, (finished && show_when_done) ? "finished: " : "", tfc_format_pid(progname),
                        total_processed_src, human_totalproc_src, tfc_getscale(src_scale_idx),
                        oper_mode,
                        total_processed_dst, human_totalproc_dst, tfc_getscale(dst_scale_idx),
-                       wr_speed, human_wr_speed, tfc_getscale(wr_speed_scale));
-               else tfc_nfsay(stderr, "%s%s: read: %llu (%.2f%s),"
+                       wr_speed, human_wr_speed, tfc_getscale(wr_speed_scale), tfc_format_time(total_time));
+               else tfc_nfsay(stderr, "%s%s%s: read: %llu (%.2f%s),"
                        " %s %s %llu (%.2f%s) bytes,"
-                       " (%llu (%.2f%s) B/s)",
-                       inplace, progname,
+                       " written %llu (%.2f%s) bytes,"
+                       " (%llu (%.2f%s) B/s), time %s",
+                       inplace, (finished && show_when_done) ? "finished: " : "", tfc_format_pid(progname),
                        total_processed_src, human_totalproc_src, tfc_getscale(src_scale_idx),
                        tfc_modename(ctr_mode), oper_mode,
                        total_processed_dst, human_totalproc_dst, tfc_getscale(dst_scale_idx),
-                       wr_speed, human_wr_speed, tfc_getscale(wr_speed_scale));
+                       total_written_dst, human_totalwrit_dst, tfc_getscale(wri_scale_idx),
+                       wr_speed, human_wr_speed, tfc_getscale(wr_speed_scale), tfc_format_time(total_time));
        }
 
-       if ((do_statline_dynamic == NO || last == YES || signal == -1) && was_sigint == NO) tfc_esay("\n");
+       if (do_stop == NO && do_statline_dynamic == NO) tfc_esay("\n");
+       else if (signal == TFC_SIGLAST || signal == TFC_SIGERR) tfc_esay("\n");
        statline_was_shown = YES;
 
+       if ((signal == SIGINT || signal == SIGTERM) && do_stop == YES) exit_sigterm(signal);
+
        delta_processed = 0;
        tfc_getcurtime(&delta_time);
 
-       if (signal == SIGTSTP) {
-               tfc_esay("stopping.");
-               kill(getpid(), SIGSTOP);
-       }
+       handle_sigtstp(signal);
 
        if (status_timer) setup_next_alarm(status_timer);
 }
@@ -148,7 +162,7 @@ void change_status_timer(int signal)
        else status_timer *= 2;
 
        if (verbose) tfc_esay("%s: status timer was changed to %.2fs",
-               progname, TFC_UTODSECS(status_timer));
+               tfc_format_pid(progname), TFC_UTODSECS(status_timer));
        setup_next_alarm(status_timer);
 }