iotool: separate alias to do only plain I/O.
[tfcrypt.git] / tfcrypt.c
index d673d386e7757cf739ffc35fbf35283476b39e3b..604a6bf990247abd61c19f996a83dea63d989002 100644 (file)
--- a/tfcrypt.c
+++ b/tfcrypt.c
@@ -128,6 +128,12 @@ int main(int argc, char **argv)
 _baddfname:
        memset(s, 0, n);
 
+       if (!strcmp(progname, "iotool")) {
+               do_edcrypt = TFC_DO_PLAIN;
+               password = YES;
+               ctr_mode = TFC_MODE_PLAIN;
+       }
+
        opterr = 0;
        while ((c = getopt(argc, argv, "L:s:aU:C:r:K:t:Pkzxc:l:qedn:vV:pwE:O:S:AmM:R:Z:WHD:")) != -1) {
                switch (c) {
@@ -195,10 +201,10 @@ _baddfname:
                                ctr_mode = TFC_MODE_PLAIN;
                                break;
                        case 'e':
-                               do_edcrypt = TFC_DO_ENCRYPT;
+                               if (do_edcrypt != TFC_DO_PLAIN) do_edcrypt = TFC_DO_ENCRYPT;
                                break;
                        case 'd':
-                               do_edcrypt = TFC_DO_DECRYPT;
+                               if (do_edcrypt != TFC_DO_PLAIN) do_edcrypt = TFC_DO_DECRYPT;
                                break;
                        case 'D':
                                macbits = strtoul(optarg, &stoi, 10);
@@ -425,14 +431,21 @@ _baddfname:
                                        }
                                        else if (!strncmp(s, "ftrunc", 6) && *(s+6) == '=') {
                                                s += 7;
-                                               ftrunc_dfd = tfc_humanfsize(s, &stoi);
-                                               if (!str_empty(stoi)) {
-                                                       ftrunc_dfd = tfc_fnamesize(s, YES);
-                                                       ftrunc_dfd = tfc_modifysize(ftrunc_dfd, strchr(s, ':'));
-                                                       if (ftrunc_dfd == NOFSIZE) xerror(NO, YES, YES,
-                                                       "%s: invalid ftrunc value", s);
+                                               if (!strcmp(s, "tail")) {
+                                                       do_ftrunc = TFC_FTRUNC_TAIL;
+                                                       ftrunc_dfd = NOFSIZE;
+                                               }
+                                               else {
+                                                       do_ftrunc = TFC_DO_FTRUNC;
+                                                       ftrunc_dfd = tfc_humanfsize(s, &stoi);
+                                                       if (!str_empty(stoi)) {
+                                                               ftrunc_dfd = tfc_fnamesize(s, YES);
+                                                               ftrunc_dfd = tfc_modifysize(ftrunc_dfd, strchr(s, ':'));
+                                                               if (ftrunc_dfd == NOFSIZE) xerror(NO, YES, YES,
+                                                               "%s: invalid ftrunc value", s);
+                                                       }
+                                                       else ftrunc_dfd = tfc_modifysize(ftrunc_dfd, strchr(s, ':'));
                                                }
-                                               else ftrunc_dfd = tfc_modifysize(ftrunc_dfd, strchr(s, ':'));
                                        }
                                        else if (!strncmp(s, "xkey", 4) && *(s+4) == '=') {
                                                s += 5;
@@ -1333,7 +1346,10 @@ _nomac:
 
        if (do_preserve_time) fcopy_matime(dfd, &s_stat);
        xclose(sfd);
-       if (ftrunc_dfd != NOFSIZE) if (ftruncate(dfd, (off_t)ftrunc_dfd) == -1) xerror(YES, NO, YES, "ftruncate(%d)", dfd);
+       if (do_ftrunc > TFC_NO_FTRUNC) {
+               if (do_ftrunc == TFC_FTRUNC_TAIL) ftrunc_dfd = total_processed_dst;
+               if (ftruncate(dfd, (off_t)ftrunc_dfd) == -1) xerror(YES, NO, YES, "ftruncate(%d)", dfd);
+       }
        xclose(dfd);
 
        xexit(exitcode);