X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=tfc_base64.c;h=b2edcbc7e705cb4ed7a3f8d854cef937c01edc19;hb=c0d678824537239f5e17822cd8473ac32f1ed251;hp=b92ac9676a3bc567aaf97f167201cb1bb1b0e8d0;hpb=efa545d64b910923248233618e774ca3b87efebb;p=tfcrypt.git diff --git a/tfc_base64.c b/tfc_base64.c index b92ac96..b2edcbc 100644 --- a/tfc_base64.c +++ b/tfc_base64.c @@ -2,7 +2,7 @@ * tfcrypt -- high security Threefish encryption tool. * * tfcrypt is copyrighted: - * Copyright (C) 2012-2018 Andrey Rys. All rights reserved. + * Copyright (C) 2012-2019 Andrey Rys. All rights reserved. * * tfcrypt is licensed to you under the terms of std. MIT/X11 license: * @@ -28,18 +28,22 @@ #include "tfcrypt.h" +enum { TFB64_STOP1 = 1, TFB64_STOPF }; + void do_edbase64(char **fargv) { struct base64_decodestate dstate; struct base64_encodestate estate; size_t lread = 0; + xexit_no_nl = YES; + sfd = 0; dfd = 1; if (fargv[0]) { if (!strcmp(fargv[0], "-")) sfd = 0; else { - sfd = open(fargv[0], O_RDONLY | O_LARGEFILE); + sfd = xopen(fargv[0], O_RDONLY | O_LARGEFILE); if (do_preserve_time) if (fstat(sfd, &s_stat) == -1) xerror(YES, NO, YES, "stat(%s)", fargv[0]); } @@ -48,8 +52,7 @@ void do_edbase64(char **fargv) if (fargv[0] && fargv[1]) { if (!strcmp(fargv[1], "-")) dfd = 1; - else dfd = open(fargv[1], O_WRONLY | O_CREAT | O_LARGEFILE | write_flags, 0666); - if (dfd == -1) xerror(NO, NO, YES, "%s", fargv[1]); + else dfd = xopen(fargv[1], O_WRONLY | O_CREAT | O_LARGEFILE | write_flags); } if (do_edcrypt == TFC_DO_ENCRYPT) { @@ -68,8 +71,9 @@ void do_edbase64(char **fargv) pblk = srcblk; lblock = lrem = do_edcrypt == TFC_DO_DECRYPT ? TFC_B64_DWIDTH : TFC_B64_EWIDTH; ldone = 0; -_again: lio = read(sfd, pblk, lrem); - if (lio == 0) do_stop = YES; + if (error_action == TFC_ERRACT_SYNC) rdpos = tfc_fdgetpos(sfd); +_again: lio = xread(sfd, pblk, lrem); + if (lio == 0) do_stop = TFB64_STOP1; if (lio != NOSIZE) ldone += lio; else { if (errno != EIO && catch_all_errors != YES) @@ -77,10 +81,12 @@ _again: lio = read(sfd, pblk, lrem); 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; } @@ -105,18 +111,18 @@ _again: lio = read(sfd, pblk, lrem); pblk = dstblk; if (ldone == 0) { - do_stop = TFC_STOP_FULL; + do_stop = TFB64_STOPF; 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); + if (lread >= lblock || do_stop == TFB64_STOPF) { + t = xwrite(dfd, "\n", 1); if (t != NOSIZE) lio += t; else lio = NOSIZE; } @@ -131,19 +137,18 @@ _wagain: lio = write(dfd, pblk, lrem); } } - if (do_edcrypt == TFC_DO_ENCRYPT && do_stop == TFC_STOP_BEGAN) { + if (do_edcrypt == TFC_DO_ENCRYPT && do_stop == TFB64_STOP1) { size_t t = estate.count; pblk = dstblk + estate.count; base64_encode_blockend((char *)dstblk, &estate); lrem = estate.count - t; ldone = 0; - do_stop = TFC_STOP_FULL; + do_stop = TFB64_STOPF; goto _wagain; } memset(&estate, 0, sizeof(struct base64_encodestate)); memset(&dstate, 0, sizeof(struct base64_decodestate)); - if (do_preserve_time) fcopy_matime(dfd, &s_stat); xexit(0); }