-O ro: readonly files, never write anything (except to standard streams)
[tfcrypt.git] / tfc_random.c
index 9f9105af68fdaf9a53beca93f24ff1e43882309d..0a529d401b53410f08ef97d436a6fc4b578ab1f6 100644 (file)
 
 #include "tfcrypt.h"
 
+static void print_crypt_status_genrnd(int signal)
+{
+       if (signal == SIGTERM || signal == SIGINT) {
+               if (xexit_no_nl == YES) xexit_no_nl = NO;
+       }
+       print_crypt_status(signal);
+}
+
+static void exit_sigterm_genrnd(int signal)
+{
+       if (xexit_no_nl == YES) xexit_no_nl = NO;
+       exit_sigterm(signal);
+}
+
 static void get_urandom(const char *src, void *buf, size_t size)
 {
        tfc_byte *ubuf = buf;
@@ -88,6 +102,8 @@ 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;
@@ -100,13 +116,13 @@ void gen_write_bytes(const char *foutname, tfc_fsize offset, tfc_fsize nrbytes)
        sigact.sa_handler = change_status_timer;
        sigaction(SIGUSR2, &sigact, NULL);
        if (quiet == NO) {
-               sigact.sa_handler = print_crypt_status;
+               sigact.sa_handler = print_crypt_status_genrnd;
                sigaction(SIGINT, &sigact, NULL);
                sigaction(SIGTERM, &sigact, NULL);
                sigaction(SIGTSTP, &sigact, NULL);
        }
        else {
-               sigact.sa_handler = exit_sigterm;
+               sigact.sa_handler = exit_sigterm_genrnd;
                sigaction(SIGINT, &sigact, NULL);
                sigaction(SIGTERM, &sigact, NULL);
                sigact.sa_handler = handle_sigtstp;
@@ -127,8 +143,7 @@ void gen_write_bytes(const char *foutname, tfc_fsize offset, tfc_fsize nrbytes)
                fd = 1;
                foutname = TFC_STDOUT_NAME;
        }
-       else fd = open(foutname, O_WRONLY | O_CREAT | O_LARGEFILE | write_flags, 0666);
-       if (fd == -1) xerror(NO, NO, YES, "%s", foutname);
+       else fd = xopen(foutname, O_WRONLY | O_CREAT | O_LARGEFILE | write_flags);
 
        if (offset) {
                if (lseek(fd, offset, SEEK_SET) == -1)
@@ -179,7 +194,10 @@ _wagain:   lio = xwrite(fd, pblk, lrem);
        }
 
        if (verbose) tfc_esay("done!");
-       if (verbose || status_timer) print_crypt_status(0);
+       if (verbose || status_timer) {
+               print_crypt_status(0);
+               tfc_esay("\n");
+       }
 
        xclose(fd);
        xexit(0);