2007-07-17 Marcus Brinkmann <marcus@g10code.de>
[gpgme.git] / gpgme / data.c
index 22768ff..aa3eeb3 100644 (file)
@@ -1,5 +1,5 @@
 /* data.c - An abstraction for data objects.
-   Copyright (C) 2002, 2003, 2004, 2005 g10 Code GmbH
+   Copyright (C) 2002, 2003, 2004, 2005, 2007 g10 Code GmbH
 
    This file is part of GPGME.
  
@@ -32,6 +32,7 @@
 #include "util.h"
 #include "ops.h"
 #include "priv-io.h"
+#include "debug.h"
 
 \f
 gpgme_error_t
@@ -72,17 +73,22 @@ _gpgme_data_release (gpgme_data_t dh)
 ssize_t
 gpgme_data_read (gpgme_data_t dh, void *buffer, size_t size)
 {
+  ssize_t res;
+  TRACE_BEG2 (DEBUG_DATA, "gpgme_data_read", dh,
+             "buffer=%p, size=%u", buffer, size);
+
   if (!dh)
     {
       errno = EINVAL;
-      return -1;
+      return TRACE_SYSRES (-1);
     }
   if (!dh->cbs->read)
     {
       errno = ENOSYS;
-      return -1;
+      return TRACE_SYSRES (-1);
     }
-  return (*dh->cbs->read) (dh, buffer, size);
+  res = (*dh->cbs->read) (dh, buffer, size);
+  return TRACE_SYSRES (res);
 }
 
 
@@ -92,17 +98,22 @@ gpgme_data_read (gpgme_data_t dh, void *buffer, size_t size)
 ssize_t
 gpgme_data_write (gpgme_data_t dh, const void *buffer, size_t size)
 {
+  ssize_t res;
+  TRACE_BEG2 (DEBUG_DATA, "gpgme_data_write", dh,
+             "buffer=%p, size=%u", buffer, size);
+
   if (!dh)
     {
       errno = EINVAL;
-      return -1;
+      return TRACE_SYSRES (-1);
     }
   if (!dh->cbs->write)
     {
       errno = ENOSYS;
-      return -1;
+      return TRACE_SYSRES (-1);
     }
-  return (*dh->cbs->write) (dh, buffer, size);
+  res = (*dh->cbs->write) (dh, buffer, size);
+  return TRACE_SYSRES (res);
 }
 
 
@@ -112,15 +123,18 @@ gpgme_data_write (gpgme_data_t dh, const void *buffer, size_t size)
 off_t
 gpgme_data_seek (gpgme_data_t dh, off_t offset, int whence)
 {
+  TRACE_BEG2 (DEBUG_DATA, "gpgme_data_seek", dh,
+             "offset=%lli, whence=%i", offset, whence);
+
   if (!dh)
     {
       errno = EINVAL;
-      return -1;
+      return TRACE_SYSRES (-1);
     }
   if (!dh->cbs->seek)
     {
       errno = ENOSYS;
-      return -1;
+      return TRACE_SYSRES (-1);
     }
 
   /* For relative movement, we must take into account the actual
@@ -132,7 +146,7 @@ gpgme_data_seek (gpgme_data_t dh, off_t offset, int whence)
   if (offset >= 0)
     dh->pending_len = 0;
 
-  return offset;
+  return TRACE_SYSRES (offset);
 }
 
 
@@ -140,6 +154,8 @@ gpgme_data_seek (gpgme_data_t dh, off_t offset, int whence)
 void
 gpgme_data_release (gpgme_data_t dh)
 {
+  TRACE (DEBUG_DATA, "gpgme_data_release", dh);
+
   if (!dh)
     return;
 
@@ -154,6 +170,8 @@ gpgme_data_release (gpgme_data_t dh)
 gpgme_data_encoding_t
 gpgme_data_get_encoding (gpgme_data_t dh)
 {
+  TRACE1 (DEBUG_DATA, "gpgme_data_get_encoding", dh,
+         "dh->encoding=%i", dh ? dh->encoding : GPGME_DATA_ENCODING_NONE);
   return dh ? dh->encoding : GPGME_DATA_ENCODING_NONE;
 }
 
@@ -163,12 +181,14 @@ gpgme_data_get_encoding (gpgme_data_t dh)
 gpgme_error_t
 gpgme_data_set_encoding (gpgme_data_t dh, gpgme_data_encoding_t enc)
 {
+  TRACE_BEG1 (DEBUG_DATA, "gpgme_data_set_encoding", dh,
+             "encoding=%i", enc);
   if (!dh)
-    return gpg_error (GPG_ERR_INV_VALUE);
+    return TRACE_ERR (gpg_error (GPG_ERR_INV_VALUE));
   if (enc < 0 || enc > GPGME_DATA_ENCODING_ARMOR)
-    return gpg_error (GPG_ERR_INV_VALUE);
+    return TRACE_ERR (gpg_error (GPG_ERR_INV_VALUE));
   dh->encoding = enc;
-  return 0;
+  return TRACE_ERR (0);
 }
 
 
@@ -177,8 +197,11 @@ gpgme_data_set_encoding (gpgme_data_t dh, gpgme_data_encoding_t enc)
 gpgme_error_t
 gpgme_data_set_file_name (gpgme_data_t dh, const char *file_name)
 {
+  TRACE_BEG1 (DEBUG_DATA, "gpgme_data_set_file_name", dh,
+             "file_name=%s", file_name);
+
   if (!dh)
-    return gpg_error (GPG_ERR_INV_VALUE);
+    return TRACE_ERR (gpg_error (GPG_ERR_INV_VALUE));
 
   if (dh->file_name)
     free (dh->file_name);
@@ -187,22 +210,28 @@ gpgme_data_set_file_name (gpgme_data_t dh, const char *file_name)
     {
       dh->file_name = strdup (file_name);
       if (!dh->file_name)
-       return gpg_error_from_errno (errno);
+       return TRACE_ERR (gpg_error_from_errno (errno));
     }
   else
     dh->file_name = 0;
 
-  return 0;
+  return TRACE_ERR (0);
 }
 
+
 /* Get the file name associated with the data object with handle DH,
    or NULL if there is none.  */
 char *
 gpgme_data_get_file_name (gpgme_data_t dh)
 {
   if (!dh)
-    return NULL;
+    {
+      TRACE (DEBUG_DATA, "gpgme_data_get_file_name", dh);
+      return NULL;
+    }
 
+  TRACE1 (DEBUG_DATA, "gpgme_data_get_file_name", dh,
+         "dh->file_name=%s", dh->file_name);
   return dh->file_name;
 }
 
@@ -216,6 +245,8 @@ _gpgme_data_inbound_handler (void *opaque, int fd)
   char buffer[BUFFER_SIZE];
   char *bufp = buffer;
   ssize_t buflen;
+  TRACE_BEG1 (DEBUG_CTX, "_gpgme_data_inbound_handler", dh,
+             "fd=0x%x", fd);
 
   buflen = _gpgme_io_read (fd, buffer, BUFFER_SIZE);
   if (buflen < 0)
@@ -223,19 +254,19 @@ _gpgme_data_inbound_handler (void *opaque, int fd)
   if (buflen == 0)
     {
       _gpgme_io_close (fd);
-      return 0;
+      return TRACE_ERR (0);
     }
 
   do
     {
       ssize_t amt = gpgme_data_write (dh, bufp, buflen);
       if (amt == 0 || (amt < 0 && errno != EINTR))
-       return gpg_error_from_errno (errno);
+       return TRACE_ERR (gpg_error_from_errno (errno));
       bufp += amt;
       buflen -= amt;
     }
   while (buflen > 0);
-  return 0;
+  return TRACE_ERR (0);
 }
 
 
@@ -244,23 +275,25 @@ _gpgme_data_outbound_handler (void *opaque, int fd)
 {
   gpgme_data_t dh = (gpgme_data_t) opaque;
   ssize_t nwritten;
+  TRACE_BEG1 (DEBUG_CTX, "_gpgme_data_outbound_handler", dh,
+             "fd=0x%x", fd);
 
   if (!dh->pending_len)
     {
       ssize_t amt = gpgme_data_read (dh, dh->pending, BUFFER_SIZE);
       if (amt < 0)
-       return gpg_error_from_errno (errno);
+       return TRACE_ERR (gpg_error_from_errno (errno));
       if (amt == 0)
        {
          _gpgme_io_close (fd);
-         return 0;
+         return TRACE_ERR (0);
        }
       dh->pending_len = amt;
     }
 
   nwritten = _gpgme_io_write (fd, dh->pending, dh->pending_len);
   if (nwritten == -1 && errno == EAGAIN)
-    return 0;
+    return TRACE_ERR (0);
 
   if (nwritten == -1 && errno == EPIPE)
     {
@@ -269,16 +302,16 @@ _gpgme_data_outbound_handler (void *opaque, int fd)
         end is going to tell us what happened on some other channel.
         Silently close our end.  */
       _gpgme_io_close (fd);
-      return 0;
+      return TRACE_ERR (0);
     }
 
   if (nwritten <= 0)
-    return gpg_error_from_errno (errno);
+    return TRACE_ERR (gpg_error_from_errno (errno));
 
   if (nwritten < dh->pending_len)
     memmove (dh->pending, dh->pending + nwritten, dh->pending_len - nwritten);
   dh->pending_len -= nwritten;
-  return 0;
+  return TRACE_ERR (0);
 }