-o: accept "-" as name, do nothing (leave stderr as is)
[tfcrypt.git] / tfcrypt.c
index 3a7d3034bb61e9866521d699f79d1e1cefa4635a..4eb2b04cc5d620af0741ed66af20c1f7998d54e1 100644 (file)
--- a/tfcrypt.c
+++ b/tfcrypt.c
 
 static tfc_byte svctr[TF_BLOCK_SIZE];
 
+static void open_log(const char *logfile)
+{
+       int fd;
+
+       if (!strcmp(logfile, "-")) return;
+
+       fd = open(logfile, O_WRONLY | O_CREAT | O_LARGEFILE | O_TRUNC, 0666);
+       if (fd == -1) xerror(NO, NO, YES, "%s", logfile);
+       xclose(2);
+       if (dup2(fd, 2) == -1) xexit(2);
+       xclose(fd);
+       do_statline_dynamic = NO;
+}
+
 static int getps_filter(struct getpasswd_state *getps, char chr, size_t pos)
 {
        if (chr == '\x03') {
@@ -138,7 +152,7 @@ _baddfname:
        }
 
        opterr = 0;
-       while ((c = getopt(argc, argv, "L:s:aU:C:r:K:t:Pkzxc:l:qedn:vV:pwE:O:S:AmuM:R:Z:WHD:")) != -1) {
+       while ((c = getopt(argc, argv, "L:s:aU:C:r:K:t:Pkzxc:l:qedn:vV:pwE:o:O:S:AmuM:R:Z:WHD:")) != -1) {
                switch (c) {
                        case 'L':
                                read_defaults(optarg, NO);
@@ -285,6 +299,9 @@ _baddfname:
                                        error_action = TFC_ERRACT_LSYNC;
                                else xerror(NO, YES, YES, "invalid error action %s specified", optarg);
                                break;
+                       case 'o':
+                               open_log(optarg);
+                               break;
                        case 'O':
                                s = d = optarg; t = NULL;
                                while ((s = strtok_r(d, ",", &t))) {
@@ -317,6 +334,10 @@ _baddfname:
                                                do_full_key = YES;
                                        else if (!strcmp(s, "showsecrets"))
                                                show_secrets = YES;
+                                       else if (!strcmp(s, "finished"))
+                                               show_when_done = YES;
+                                       else if (!strncmp(s, "logfile", 7) && *(s+7) == '=')
+                                               open_log(s+8);
                                        else if (!strncmp(s, "iobs", 4) && *(s+4) == '=') {
                                                s += 5;
                                                blksize = (size_t)tfc_humanfsize(s, &stoi);
@@ -1072,7 +1093,7 @@ _plain:
        sigact.sa_handler = print_crypt_status;
        sigaction(SIGUSR1, &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;
@@ -1219,7 +1240,10 @@ _wagain: lio = xwrite(dfd, pblk, lrem);
 _nowrite:      total_processed_dst += ldone;
                delta_processed += ldone;
 
-               if (maxlen != NOFSIZE && total_processed_src >= maxlen) break;
+               if (maxlen != NOFSIZE && total_processed_src >= maxlen) {
+                       do_stop = YES;
+                       break;
+               }
        }
 
        errno = 0;
@@ -1374,7 +1398,7 @@ _macwagain:               lio = xwrite(dfd, pblk, lrem);
                memset(tmpdata, 0, sizeof(tmpdata));
        }
 
-       if (verbose || status_timer || do_stop == YES) print_crypt_status(0);
+       if (verbose || status_timer || (do_stop == YES && quiet == NO)) print_crypt_status(0);
 
        xexit(exitcode);
        return -1;