aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog12
-rw-r--r--src/assuan-pipe-server.c11
-rw-r--r--src/assuan.h5
-rw-r--r--src/libassuan.def1
-rw-r--r--src/libassuan.vers1
-rw-r--r--src/system.c21
6 files changed, 42 insertions, 9 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index ce14714..83c91db 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,15 @@
+2009-11-25 Marcus Brinkmann <[email protected]>
+
+ * assuan.h (assuan_init_pipe_server): Change type of filedes to
+ assuan_fd_t.
+ (assuan_fdopen): New prototype.
+ * libassuan.vers, libassuan.def: Add assuan_fdopen.
+ * system.c (assuan_fdopen): New function.
+ * assuan-pipe-server.c (assuan_init_pipe_server): Change type of
+ filedes to assuan_fd_t. No longer translate fd to handle. Don't
+ set to binary either (that doesn't do anything for handles, it
+ only affects the libc fd).
+
2009-11-24 Marcus Brinkmann <[email protected]>
* assuan.h (struct _assuan_peercred) [_WIN32]: Define dummy member
diff --git a/src/assuan-pipe-server.c b/src/assuan-pipe-server.c
index f195697..cb15de4 100644
--- a/src/assuan-pipe-server.c
+++ b/src/assuan-pipe-server.c
@@ -51,7 +51,7 @@ is_valid_socket (const char *s)
/* This actually is a int file descriptor (and not assuan_fd_t) as
_get_osfhandle is called on W32 systems. */
gpg_error_t
-assuan_init_pipe_server (assuan_context_t ctx, int filedes[2])
+assuan_init_pipe_server (assuan_context_t ctx, assuan_fd_t filedes[2])
{
const char *s;
unsigned long ul;
@@ -65,13 +65,8 @@ assuan_init_pipe_server (assuan_context_t ctx, int filedes[2])
return rc;
#ifdef HAVE_W32_SYSTEM
- /* MS Windows has so many different types of handle that one needs
- to tranlsate them at many place forth and back. Also make sure
- that the file descriptors are in binary mode. */
- setmode (filedes[0], O_BINARY);
- setmode (filedes[1], O_BINARY);
- infd = (void*)_get_osfhandle (filedes[0]);
- outfd = (void*)_get_osfhandle (filedes[1]);
+ infd = filedes[0];
+ outfd = filedes[1];
#else
s = getenv ("_assuan_connection_fd");
if (s && *s && is_valid_socket (s))
diff --git a/src/assuan.h b/src/assuan.h
index 33afc63..0fb1795 100644
--- a/src/assuan.h
+++ b/src/assuan.h
@@ -91,6 +91,8 @@ typedef int assuan_fd_t;
#define ASSUAN_INVALID_PID ((pid_t) -1)
#endif
+assuan_fd_t assuan_fdopen (int fd);
+
/* Assuan features an emulation of Unix domain sockets based on a
local TCP connections. To implement access permissions based on
@@ -358,7 +360,8 @@ gpg_error_t assuan_close_output_fd (assuan_context_t ctx);
/*-- assuan-pipe-server.c --*/
-gpg_error_t assuan_init_pipe_server (assuan_context_t ctx, int filedes[2]);
+gpg_error_t assuan_init_pipe_server (assuan_context_t ctx,
+ assuan_fd_t filedes[2]);
/*-- assuan-socket-server.c --*/
#define ASSUAN_SOCKET_SERVER_FDPASSING 1
diff --git a/src/libassuan.def b/src/libassuan.def
index ccb774b..510d081 100644
--- a/src/libassuan.def
+++ b/src/libassuan.def
@@ -92,6 +92,7 @@ EXPORTS
__assuan_socketpair @71
__assuan_spawn @72
__assuan_usleep @73
+ assuan_fdopen @74
; END
diff --git a/src/libassuan.vers b/src/libassuan.vers
index 722caa3..587127e 100644
--- a/src/libassuan.vers
+++ b/src/libassuan.vers
@@ -29,6 +29,7 @@ LIBASSUAN_1.0 {
assuan_command_parse_fd;
assuan_ctx_set_system_hooks;
assuan_end_confidential;
+ assuan_fdopen;
assuan_get_active_fds;
assuan_get_assuan_log_prefix;
assuan_get_command_name;
diff --git a/src/system.c b/src/system.c
index ab9e5a1..852ec11 100644
--- a/src/system.c
+++ b/src/system.c
@@ -44,6 +44,27 @@
#endif
+assuan_fd_t
+assuan_fdopen (int fd)
+{
+#ifdef HAVE_W32_SYSTEM
+ assuan_fd_t ifd = (assuan_fd_t) _get_osfhandle (fd);
+ assuan_fd_t ofd;
+
+ if (! DuplicateHandle(GetCurrentProcess(), hfd,
+ GetCurrentProcess(), &ofd, 0,
+ TRUE, DUPLICATE_SAME_ACCESS))
+ {
+ errno = EIO;
+ return ASSUAN_INVALID_FD:
+ }
+ return ofd;
+#else
+ return dup (fd);
+#endif
+}
+
+
/* Manage memory specific to a context. */
void *