diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ChangeLog | 12 | ||||
-rw-r--r-- | src/assuan-pipe-server.c | 11 | ||||
-rw-r--r-- | src/assuan.h | 5 | ||||
-rw-r--r-- | src/libassuan.def | 1 | ||||
-rw-r--r-- | src/libassuan.vers | 1 | ||||
-rw-r--r-- | src/system.c | 21 |
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 * |