pblk = srcblk;
lblock = lrem = do_edcrypt == TFC_DO_DECRYPT ? TFC_B64_DWIDTH : TFC_B64_EWIDTH;
ldone = 0;
-_again: lio = read(sfd, pblk, lrem);
+ if (error_action == TFC_ERRACT_SYNC) rdpos = tfc_fdgetpos(sfd);
+_again: lio = xread(sfd, pblk, lrem);
if (lio == 0) do_stop = YES;
if (lio != NOSIZE) ldone += lio;
else {
switch (error_action) {
case TFC_ERRACT_CONT: xerror(YES, NO, NO, "%s", fargv[0]); goto _again; break;
case TFC_ERRACT_SYNC:
+ case TFC_ERRACT_LSYNC:
xerror(YES, NO, NO, "%s", fargv[0]);
lio = ldone = lrem = lblock;
memset(srcblk, 0, lio);
- lseek(sfd, lio, SEEK_CUR);
+ if (rdpos == NOFSIZE) lseek(sfd, lio, SEEK_CUR);
+ else lseek(sfd, rdpos + lio, SEEK_SET);
break;
default: xerror(NO, NO, NO, "%s", fargv[0]); break;
}
}
lrem = ldone;
ldone = 0;
-_wagain: lio = write(dfd, pblk, lrem);
+_wagain: lio = xwrite(dfd, pblk, lrem);
if (lio != NOSIZE) ldone += lio;
else xerror(NO, NO, NO, "%s", fargv[1]);
if (do_edcrypt == TFC_DO_ENCRYPT) {
size_t t;
if (lread >= lblock || do_stop == TFC_STOP_FULL) {
- t = write(dfd, "\n", 1);
+ t = xwrite(dfd, "\n", 1);
if (t != NOSIZE) lio += t;
else lio = NOSIZE;
}