2004-09-23 Marcus Brinkmann <marcus@g10code.de>
authorMarcus Brinkmann <mb@g10code.com>
Thu, 23 Sep 2004 17:54:26 +0000 (17:54 +0000)
committerMarcus Brinkmann <mb@g10code.com>
Thu, 23 Sep 2004 17:54:26 +0000 (17:54 +0000)
* data-stream.c (stream_seek): Call ftello and return the current
offset.
* data.h (struct gpgme_data): Change type of data.mem.offset to
off_t.
* data.c (gpgme_data_seek): Check dh->cbs->seek callback, not read
callback.  If SEEK_CUR, adjust the offset by the pending buffer
size.  Clear pending buffer on success.

gpgme/ChangeLog
gpgme/data-stream.c
gpgme/data.c
gpgme/data.h

index 02bb5d65187f595a54e6e61a48109e837bfcf7da..039b197ed601b29b8b0a920ab3592f7a7e95ca78 100644 (file)
@@ -1,3 +1,13 @@
+2004-09-23  Marcus Brinkmann  <marcus@g10code.de>
+
+       * data-stream.c (stream_seek): Call ftello and return the current
+       offset.
+       * data.h (struct gpgme_data): Change type of data.mem.offset to
+       off_t.
+       * data.c (gpgme_data_seek): Check dh->cbs->seek callback, not read
+       callback.  If SEEK_CUR, adjust the offset by the pending buffer
+       size.  Clear pending buffer on success.
+
 2004-09-14  Marcus Brinkmann  <marcus@g10code.de>
 
        * gpgme.m4: Add copyright notice.
index c28f5ff23240bf6f8ea1b552a368931d4fbf1a06..3abecaafbcb4652beaf60041d56a5ca3dc38c571 100644 (file)
@@ -50,12 +50,19 @@ stream_write (gpgme_data_t dh, const void *buffer, size_t size)
 static off_t
 stream_seek (gpgme_data_t dh, off_t offset, int whence)
 {
+  int err;
+
 #ifdef HAVE_FSEEKO
-  return fseeko (dh->data.stream, offset, whence);
+  err = fseeko (dh->data.stream, offset, whence);
 #else
   /* FIXME: Check for overflow, or at least bail at compilation.  */
-  return fseek (dh->data.stream, offset, whence);
+  err = fseek (dh->data.stream, offset, whence);
 #endif
+
+  if (err)
+    return -1;
+
+  return ftello (dh->data.stream);
 }
 
 
index 80a3fb4bb1415c7fbc2cadff8ece3b86c46476cf..aba1986b88a4d2e2e4e3ccb4881921fbca4525e7 100644 (file)
@@ -112,12 +112,22 @@ gpgme_data_seek (gpgme_data_t dh, off_t offset, int whence)
       errno = EINVAL;
       return -1;
     }
-  if (!dh->cbs->read)
+  if (!dh->cbs->seek)
     {
       errno = EOPNOTSUPP;
       return -1;
     }
-  return (*dh->cbs->seek) (dh, offset, whence);
+
+  /* For relative movement, we must take into account the actual
+     position of the read counter.  */
+  if (whence == SEEK_CUR)
+    offset -= dh->pending_len;
+
+  offset = (*dh->cbs->seek) (dh, offset, whence);
+  if (offset >= 0)
+    dh->pending_len = 0;
+
+  return offset;
 }
 
 
index 57815ef3d0d3c1f884338903a91c7415519a8aa6..51d89aa86c97c057cdfc8d5440441b355c99b1c4 100644 (file)
@@ -99,7 +99,7 @@ struct gpgme_data
       /* Allocated size of BUFFER.  */
       size_t size;
       size_t length;
-      size_t offset;
+      off_t offset;
     } mem;
 
     /* For gpgme_data_new_from_read_cb.  */