_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) {
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);
}
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;
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);