-o logfile: logging to separate logfile instead of stderr.
authorAndrey Rys <rys@lynxlynx.ru>
Sun, 28 Nov 2021 00:53:56 +0000 (01:53 +0100)
committerAndrey Rys <rys@lynxlynx.ru>
Sun, 28 Nov 2021 00:53:56 +0000 (01:53 +0100)
VERSION
tfc_error.c
tfcrypt.c

diff --git a/VERSION b/VERSION
index 920a1396648024dd8985b3cafa24d7156e3b2610..c739b42c4d2ce23786c5350641d0adbf5fa7d6b2 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-43
+44
index 3d95eba0cae6387a14800c4dfa7705ee52c1e447..f69fdbe4ed0bf0800fcad4a101f14a3633f6a4e3 100644 (file)
@@ -298,6 +298,7 @@ void usage(void)
        tfc_say("  -E xall: turn on error actions above for all errors, not just EIO errors.");
        tfc_say("  -E xseek: ignore positioning and other seek related errors.");
        tfc_say("    Multiple -E specifiers may be given in separate options.");
+       tfc_say("  -o logfile: redirect all messages to logfile instead of stderr.");
        tfc_say("  -O opts: set options (comma separated list):");
        tfc_say("    sync: request a synchronous I/O for a output,");
        tfc_say("    fsync: on each write() call a corresponding fsync(fd),");
@@ -315,6 +316,7 @@ void usage(void)
        tfc_say("    prompt=str: set main password prompts to this string.");
        tfc_say("    macprompt=str: set MAC password prompts to this string.");
        tfc_say("    shorthex: with -H, do not print printable characters, dump only hex string.");
+       tfc_say("    logfile: (same as -o) redirect all messages to logfile instead of stderr.");
        tfc_say("    iobs=val: set IO block size value. Must not exceed %u bytes.", TFC_U(TFC_BLKSIZE));
        tfc_say("    xtsblocks=val: use these nr of TF blocks per XTS block. Default is %u.", TFC_U(TFC_XTSBLOCKS));
        tfc_say("    iseek=val: seek source file/device by these val bytes.");
index 719eff811b0a72b48319b78c80dfd42ab1650301..b6bbe73de3cd3f3d38497fe2c8e11cd2697af735 100644 (file)
--- a/tfcrypt.c
+++ b/tfcrypt.c
 
 static tfc_byte svctr[TF_BLOCK_SIZE];
 
+static void open_log(const char *logfile)
+{
+       int fd;
+
+       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) xerror(NO, NO, YES, "dup2(%d, 2) for %s", fd, logfile);
+       xclose(fd);
+       do_statline_dynamic = NO;
+}
+
 static int getps_filter(struct getpasswd_state *getps, char chr, size_t pos)
 {
        if (chr == '\x03') {
@@ -138,7 +150,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 +297,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 +332,8 @@ _baddfname:
                                                do_full_key = YES;
                                        else if (!strcmp(s, "showsecrets"))
                                                show_secrets = 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);