tfc_say(" when the whole status line width is smaller than tty width.");
tfc_say(" statless: emit less information in status line (only processed data).");
tfc_say(" iobs=val: set IO block size value. Must not exceed %u bytes.", TFC_U(TFC_BLKSIZE));
+ tfc_say(" nobuf: disable IO buffering, write as soon as data received (only for stream ciphers!)");
tfc_say(" iseek=val: seek source file/device by these val bytes.");
tfc_say(" oseek=val: seek destination file/device by these val bytes.");
tfc_say(" ioseek=val: seek both source and destination.");
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(" nobuf: disable IO buffering, write as soon as data received (only for stream ciphers!)");
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.");
tfc_say(" Initial counter is adjusted automatically.");
static tfc_byte svctr[TF_BLOCK_SIZE];
static tfc_fsize rwd, do_read_loops, loopcnt;
+static tfc_yesno unbuffered;
static void open_log(const char *logfile)
{
show_when_done = YES;
else if (!strcmp(s, "pid"))
show_pid = YES;
+ else if (!strcmp(s, "nobuf")) {
+ if (!tfc_is_freestream(ctr_mode)) xerror(NO, YES, YES,
+ "cannot activate unbuffered mode for non-stream cipher mode %s!",
+ tfc_modename(ctr_mode));
+ else unbuffered = YES;
+ }
else if (!strncmp(s, "readloops", 9) && *(s+9) == '=') {
do_read_loops = tfc_humanfsize(s+10, &stoi);
if (!str_empty(stoi)) do_read_loops = NOSIZE;
"%s: invalid block size value", s);
}
else blksize = (size_t)tfc_modifysize((tfc_fsize)blksize, strchr(s, ':'));
- if (!tfc_is_stream(ctr_mode) && blksize < TF_BLOCK_SIZE) xerror(NO, YES, YES,
+ if (!tfc_is_freestream(ctr_mode) && blksize < TF_BLOCK_SIZE) xerror(NO, YES, YES,
"%s: block size is lesser than TF_BLOCK_SIZE (%u bytes)", s, TFC_U(TF_BLOCK_SIZE));
if (blksize > TFC_BLKSIZE) xerror(NO, YES, YES,
"%s: block size exceeds %u bytes",
default: xerror(NO, NO, NO, "%s", srcfname); break;
}
}
- if (lio && lio < lrem) {
+ if (unbuffered == NO && lio && lio < lrem) {
pblk += lio;
lrem -= lio;
goto _ragain;
int xopen(const char *pathname, int flags);
void xclose(int fd);
const char *tfc_modename(int mode);
-tfc_yesno tfc_is_stream(int mode);
+tfc_yesno tfc_is_freestream(int mode);
void tfc_getcurtime(tfc_useconds *tx);
char *tfc_format_time(tfc_useconds t);
char *tfc_format_pid(const char *str);