core: Make the status-fd monitor work for all gpgsm commands.
[gpgme.git] / src / data-mem.c
index 7be72bf..a498b82 100644 (file)
@@ -1,18 +1,18 @@
 /* data-mem.c - A memory based data object.
    Copyright (C) 2002, 2003, 2004, 2007 g10 Code GmbH
+
    This file is part of GPGME.
+
    GPGME is free software; you can redistribute it and/or modify it
    under the terms of the GNU Lesser General Public License as
    published by the Free Software Foundation; either version 2.1 of
    the License, or (at your option) any later version.
-   
+
    GPGME is distributed in the hope that it will be useful, but
    WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.
-   
+
    You should have received a copy of the GNU Lesser General Public
    License along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
@@ -24,7 +24,9 @@
 
 #include <errno.h>
 #include <stdlib.h>
-#include <unistd.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
 #include <assert.h>
 #include <string.h>
 
@@ -33,7 +35,7 @@
 #include "debug.h"
 
 \f
-static ssize_t
+static gpgme_ssize_t
 mem_read (gpgme_data_t dh, void *buffer, size_t size)
 {
   size_t amt = dh->data.mem.length - dh->data.mem.offset;
@@ -52,7 +54,7 @@ mem_read (gpgme_data_t dh, void *buffer, size_t size)
 }
 
 
-static ssize_t
+static gpgme_ssize_t
 mem_write (gpgme_data_t dh, const void *buffer, size_t size)
 {
   size_t unused;
@@ -70,7 +72,7 @@ mem_write (gpgme_data_t dh, const void *buffer, size_t size)
        return -1;
       memcpy (new_buffer, dh->data.mem.orig_buffer, dh->data.mem.length);
 
-      dh->data.mem.buffer = new_buffer;      
+      dh->data.mem.buffer = new_buffer;
       dh->data.mem.size = new_size;
     }
 
@@ -107,8 +109,8 @@ mem_write (gpgme_data_t dh, const void *buffer, size_t size)
 }
 
 
-static off_t
-mem_seek (gpgme_data_t dh, off_t offset, int whence)
+static gpgme_off_t
+mem_seek (gpgme_data_t dh, gpgme_off_t offset, int whence)
 {
   switch (whence)
     {
@@ -122,7 +124,7 @@ mem_seek (gpgme_data_t dh, off_t offset, int whence)
       break;
     case SEEK_CUR:
       if ((offset > 0 && dh->data.mem.length - dh->data.mem.offset < offset)
-         || (offset < 0 && dh->data.mem.offset < -offset)) 
+         || (offset < 0 && dh->data.mem.offset < -offset))
        {
          gpg_err_set_errno (EINVAL);
          return -1;
@@ -135,7 +137,7 @@ mem_seek (gpgme_data_t dh, off_t offset, int whence)
          gpg_err_set_errno (EINVAL);
          return -1;
        }
-      dh->data.mem.offset = dh->data.mem.length - offset;
+      dh->data.mem.offset = dh->data.mem.length + offset;
       break;
     default:
       gpg_err_set_errno (EINVAL);
@@ -200,16 +202,16 @@ gpgme_data_new_from_mem (gpgme_data_t *r_dh, const char *buffer,
       char *bufcpy = malloc (size);
       if (!bufcpy)
        {
-         int saved_errno = errno;
+         int saved_err = gpg_error_from_syserror ();
          _gpgme_data_release (*r_dh);
-         return TRACE_ERR (gpg_error_from_errno (saved_errno));
+         return TRACE_ERR (saved_err);
        }
       memcpy (bufcpy, buffer, size);
       (*r_dh)->data.mem.buffer = bufcpy;
     }
   else
     (*r_dh)->data.mem.orig_buffer = buffer;
-  
+
   (*r_dh)->data.mem.size = size;
   (*r_dh)->data.mem.length = size;
   return TRACE_SUC1 ("dh=%p", *r_dh);
@@ -240,9 +242,9 @@ gpgme_data_release_and_get_mem (gpgme_data_t dh, size_t *r_len)
       str = malloc (dh->data.mem.length);
       if (!str)
        {
-         int saved_errno = errno;
+         int saved_err = gpg_error_from_syserror ();
          gpgme_data_release (dh);
-         TRACE_ERR (gpg_error_from_errno (saved_errno));
+         TRACE_ERR (saved_err);
          return NULL;
        }
       memcpy (str, dh->data.mem.orig_buffer, dh->data.mem.length);
@@ -269,7 +271,8 @@ gpgme_data_release_and_get_mem (gpgme_data_t dh, size_t *r_len)
 }
 
 
-/* Release the memory returned by gpgme_data_release_and_get_mem().  */
+/* Release the memory returned by gpgme_data_release_and_get_mem() and
+   some other functions.  */
 void
 gpgme_free (void *buffer)
 {