change atexit newline print policy
[tfcrypt.git] / tfc_random.c
index 0e90f48be408eda3a2bab9d2cec53122955dc85a..d3f2ee303ff09bcd8a9dfe6d93dc19518fb451be 100644 (file)
@@ -2,7 +2,7 @@
  * tfcrypt -- high security Threefish encryption tool.
  *
  * tfcrypt is copyrighted:
- * Copyright (C) 2012-2018 Andrey Rys. All rights reserved.
+ * Copyright (C) 2012-2019 Andrey Rys. All rights reserved.
  *
  * tfcrypt is licensed to you under the terms of std. MIT/X11 license:
  *
@@ -44,7 +44,7 @@ static void get_urandom(const char *src, void *buf, size_t size)
        if (fd == -1) fd = open("/dev/random", O_RDONLY);
        if (fd == -1) xerror(NO, YES, YES, "random source is required (tried %s)", src);
 
-_again:        rd = read(fd, ubuf, sz);
+_again:        rd = xread(fd, ubuf, sz);
        if (rd < sz && rd != NOSIZE) {
                ubuf += rd;
                sz -= rd;
@@ -88,14 +88,15 @@ void gen_write_bytes(const char *foutname, tfc_fsize offset, tfc_fsize nrbytes)
        size_t lblock, lio, lrem;
        tfc_byte *pblk;
 
+       xexit_no_nl = YES;
+
        for (x = 1; x < NSIG; x++) signal(x, SIG_IGN);
        memset(&sigact, 0, sizeof(sigact));
        sigact.sa_flags = SA_RESTART;
        sigact.sa_handler = print_crypt_status;
        sigaction(SIGUSR1, &sigact, NULL);
-       sigaction(SIGTSTP, &sigact, NULL);
        sigaction(SIGALRM, &sigact, NULL);
-       if (status_timer) setup_next_alarm(status_timer);
+       if (status_timer) setup_next_alarm(status_timer > 1000000 ? 1000000 : status_timer);
        sigact.sa_handler = change_status_width;
        sigaction(SIGQUIT, &sigact, NULL);
        sigact.sa_handler = change_status_timer;
@@ -104,11 +105,14 @@ void gen_write_bytes(const char *foutname, tfc_fsize offset, tfc_fsize nrbytes)
                sigact.sa_handler = print_crypt_status;
                sigaction(SIGINT, &sigact, NULL);
                sigaction(SIGTERM, &sigact, NULL);
+               sigaction(SIGTSTP, &sigact, NULL);
        }
        else {
                sigact.sa_handler = exit_sigterm;
                sigaction(SIGINT, &sigact, NULL);
                sigaction(SIGTERM, &sigact, NULL);
+               sigact.sa_handler = handle_sigtstp;
+               sigaction(SIGTSTP, &sigact, NULL);
        }
        memset(&sigact, 0, sizeof(struct sigaction));
 
@@ -130,13 +134,13 @@ void gen_write_bytes(const char *foutname, tfc_fsize offset, tfc_fsize nrbytes)
 
        if (offset) {
                if (lseek(fd, offset, SEEK_SET) == -1)
-                       xerror(YES, NO, NO, "%s: seek failed", foutname);
+                       xerror(ignore_seek_errors, NO, NO, "%s: seek failed", foutname);
        }
 
        if (ctr_mode == TFC_MODE_PLAIN) memset(srcblk, 0, sizeof(srcblk));
 
        if (verbose) tfc_nfsay(stderr, "%s: writing %lld bytes to %s ... ",
-               progname, nrbytes, foutname);
+               tfc_format_pid(progname), nrbytes, foutname);
 
        errno = 0;
        do_stop = NO;
@@ -148,7 +152,7 @@ void gen_write_bytes(const char *foutname, tfc_fsize offset, tfc_fsize nrbytes)
                if (ctr_mode != TFC_MODE_PLAIN) tfc_getrandom(srcblk, lblock);
 
                if (error_action == TFC_ERRACT_SYNC) wrpos = tfc_fdgetpos(fd);
-_wagain:       lio = write(fd, pblk, lrem);
+_wagain:       lio = xwrite(fd, pblk, lrem);
                if (lio == NOSIZE) {
                        if (errno != EIO && catch_all_errors != YES)
                                xerror(NO, NO, YES, "%s", foutname);
@@ -178,6 +182,7 @@ _wagain:    lio = write(fd, pblk, lrem);
 
        if (verbose) tfc_esay("done!");
        if (verbose || status_timer) print_crypt_status(0);
+       if (verbose) tfc_esay("\n");
 
        xclose(fd);
        xexit(0);