w32: Improve locating gpgconf on 64 bit systems.
[gpgme.git] / src / data-fd.c
index 1ada70f..42d6a0d 100644 (file)
@@ -1,18 +1,18 @@
 /* data-fd.c - A file descripor based data object.
    Copyright (C) 2002, 2004 g10 Code GmbH
 /* data-fd.c - A file descripor based data object.
    Copyright (C) 2002, 2004 g10 Code GmbH
+
    This file is part of GPGME.
    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 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.
    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
    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
 #ifdef HAVE_UNISTD_H
 # include <unistd.h>
 #endif
 #ifdef HAVE_UNISTD_H
 # include <unistd.h>
 #endif
-#include <sys/types.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
 
 #include "debug.h"
 #include "data.h"
 
 
 #include "debug.h"
 #include "data.h"
 
+
+\f
+#if defined(HAVE_W32CE_SYSTEM) && !defined(__MINGW32CE__)
+/* We need to provide replacements for read, write and lseek.  They
+   are taken from the cegcc runtime files, written by Pedro Alves
+   <pedro_alves@portugalmail.pt> in Feb 2007 and placed in the public
+   domain. (cf. cegcc/src/mingw/mingwex/wince/)  */
+
+#include <windows.h>
+
+static int
+read (int fildes, void *buf, unsigned int bufsize)
+{
+  DWORD NumberOfBytesRead;
+  if (bufsize > 0x7fffffff)
+    bufsize = 0x7fffffff;
+  if (!ReadFile ((HANDLE) fildes, buf, bufsize, &NumberOfBytesRead, NULL))
+    return -1;
+  return (int) NumberOfBytesRead;
+}
+
+static int
+write (int fildes, const void *buf, unsigned int bufsize)
+{
+  DWORD NumberOfBytesWritten;
+  if (bufsize > 0x7fffffff)
+    bufsize = 0x7fffffff;
+  if (!WriteFile ((HANDLE) fildes, buf, bufsize, &NumberOfBytesWritten, NULL))
+    return -1;
+  return (int) NumberOfBytesWritten;
+}
+
+static long
+lseek (int fildes, long offset, int whence)
+{
+  DWORD mode;
+  switch (whence)
+    {
+    case SEEK_SET:
+      mode = FILE_BEGIN;
+      break;
+    case SEEK_CUR:
+      mode = FILE_CURRENT;
+      break;
+    case SEEK_END:
+      mode = FILE_END;
+      break;
+    default:
+      /* Specify an invalid mode so SetFilePointer catches it.  */
+      mode = (DWORD)-1;
+    }
+  return (long) SetFilePointer ((HANDLE) fildes, offset, NULL, mode);
+}
+#endif /*HAVE_W32CE_SYSTEM && !__MINGW32CE__*/
+
+
 \f
 \f
-static ssize_t
+static gpgme_ssize_t
 fd_read (gpgme_data_t dh, void *buffer, size_t size)
 {
   return read (dh->data.fd, buffer, size);
 }
 
 
 fd_read (gpgme_data_t dh, void *buffer, size_t size)
 {
   return read (dh->data.fd, buffer, size);
 }
 
 
-static ssize_t
+static gpgme_ssize_t
 fd_write (gpgme_data_t dh, const void *buffer, size_t size)
 {
   return write (dh->data.fd, buffer, size);
 }
 
 
 fd_write (gpgme_data_t dh, const void *buffer, size_t size)
 {
   return write (dh->data.fd, buffer, size);
 }
 
 
-static off_t
-fd_seek (gpgme_data_t dh, off_t offset, int whence)
+static gpgme_off_t
+fd_seek (gpgme_data_t dh, gpgme_off_t offset, int whence)
 {
   return lseek (dh->data.fd, offset, whence);
 }
 {
   return lseek (dh->data.fd, offset, whence);
 }