aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcus Brinkmann <[email protected]>2004-09-23 17:54:26 +0000
committerMarcus Brinkmann <[email protected]>2004-09-23 17:54:26 +0000
commit4b8e1217fc9ea7ef49ce048fc1e466d7ea568d26 (patch)
tree452391f8f8e4cc38a507cf73839cdaf4014658db
parentAdd entry about AC_CONFIG_MACRO_DIR. (diff)
downloadgpgme-4b8e1217fc9ea7ef49ce048fc1e466d7ea568d26.tar.gz
gpgme-4b8e1217fc9ea7ef49ce048fc1e466d7ea568d26.zip
2004-09-23 Marcus Brinkmann <[email protected]>
* 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.
-rw-r--r--gpgme/ChangeLog10
-rw-r--r--gpgme/data-stream.c11
-rw-r--r--gpgme/data.c14
-rw-r--r--gpgme/data.h2
4 files changed, 32 insertions, 5 deletions
diff --git a/gpgme/ChangeLog b/gpgme/ChangeLog
index 02bb5d65..039b197e 100644
--- a/gpgme/ChangeLog
+++ b/gpgme/ChangeLog
@@ -1,3 +1,13 @@
+2004-09-23 Marcus Brinkmann <[email protected]>
+
+ * 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 <[email protected]>
* gpgme.m4: Add copyright notice.
diff --git a/gpgme/data-stream.c b/gpgme/data-stream.c
index c28f5ff2..3abecaaf 100644
--- a/gpgme/data-stream.c
+++ b/gpgme/data-stream.c
@@ -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);
}
diff --git a/gpgme/data.c b/gpgme/data.c
index 80a3fb4b..aba1986b 100644
--- a/gpgme/data.c
+++ b/gpgme/data.c
@@ -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;
}
diff --git a/gpgme/data.h b/gpgme/data.h
index 57815ef3..51d89aa8 100644
--- a/gpgme/data.h
+++ b/gpgme/data.h
@@ -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. */