fix -C stream -c rand regression.
[tfcrypt.git] / tfc_skein.c
index b3b2019d5875d446d3704ea854f8511c72f0ce34..4eb6f92d7734695d45558f028f5613742974aaf5 100644 (file)
@@ -49,7 +49,7 @@ void tf_key_tweak_compat(void *key)
        ukey[TF_TWEAK_WORD3] = ukey[TF_TWEAK_WORD1] ^ ukey[TF_TWEAK_WORD2];
 }
 
-tfc_yesno skeinfd(void *hash, size_t bits, const void *key, int fd, tfc_fsize readto)
+tfc_yesno skeinfd(void *hash, size_t bits, const void *key, int fd, tfc_fsize offset, tfc_fsize readto)
 {
        static tfc_byte skblk[TFC_BLKSIZE];
 
@@ -62,9 +62,16 @@ tfc_yesno skeinfd(void *hash, size_t bits, const void *key, int fd, tfc_fsize re
        if (ctr_mode == TFC_MODE_SKSUM) total_processed_src = total_processed_dst = delta_processed = 0;
 
        if (fd == -1) goto _fail;
-       if (fd > 2 && readto == NOFSIZE) {
-               readto = tfc_fdsize(fd);
-               if (readto == NOFSIZE) goto _fail;
+       if (fd > 2) {
+               if (readto == NOFSIZE) {
+                       readto = tfc_fdsize(fd);
+                       if (readto == NOFSIZE) goto _fail;
+               }
+               if (offset != 0 && offset != NOFSIZE) {
+                       if (lseek(fd, (off_t)offset, SEEK_SET) == -1) {
+                               if (ignore_seek_errors == NO) goto _fail;
+                       }
+               }
        }
 
        if (key) skein_init_key(&sk, key, bits);
@@ -197,8 +204,7 @@ _dothat:
 
                while (1) {
                        memset(sksblk, 0, sizeof(sksblk));
-                       x = xfgets(sksblk, sizeof(sksblk), f);
-                       if (x == 0) break;
+                       if (xfgets(sksblk, sizeof(sksblk), f) != YES) break;
 
                        s = d = sksblk; t = NULL;
                        shash = fname = NULL;
@@ -226,7 +232,7 @@ _dothat:
                        }
 
                        if (status_timer) setup_next_alarm(status_timer);
-                       if (skeinfd(hash, bits, mackey_opt ? mackey : NULL, fd, maxlen) != YES) {
+                       if (skeinfd(hash, bits, mackey_opt ? mackey : NULL, fd, iseek, maxlen) != YES) {
                                xerror(YES, NO, YES, "%s", fname);
                                exitcode = 1;
                                continue;
@@ -278,7 +284,7 @@ _dothat:
                }
 
 _dohash:       if (status_timer) setup_next_alarm(status_timer);
-               if (skeinfd(hash, bits, mackey_opt ? mackey : NULL, fd, maxlen) != YES) {
+               if (skeinfd(hash, bits, mackey_opt ? mackey : NULL, fd, iseek, maxlen) != YES) {
                        xerror(YES, NO, YES, "%s", fargv[x]);
                        exitcode = 1;
                        continue;