This thread never resulted in a change, but I need one now. I re-read the earlier discussions, and some points:
1) It is useful if the gl_fd_to_socket function is available on all systems, to avoid ugly #if's in code that uses it. Corollary: declaring it in sys/socket.h seems wrong because that file should ideally not be needed on well-behaving systems. 2) The gl_socket_to_fd function is complicated due to non-overlapping IO. Corollary: skip it, it doesn't seem like anyone needs it. I don't. 3) The function gl_socket_to_fd is a Windows specific work-around and it seems unlikely that other non-POSIX systems can use a similar interface. It is not even clear that re-using the same interface for non-Windows is a good idea. A separate module for this might be the simplest, but the 'sockets' module is there to make sockets work on various platforms. While Bruno convinced me otherwise earlier, I think it is the best place for this kind of functionality. I have pushed the following. /Simon >From c54ca9a9fab462268deec291f450873905acf226 Mon Sep 17 00:00:00 2001 From: Simon Josefsson <si...@josefsson.org> Date: Mon, 9 Feb 2009 14:54:23 +0100 Subject: [PATCH] sockets: Add gl_fd_to_handle. --- ChangeLog | 6 ++++++ lib/sockets.h | 15 ++++++++++++++- tests/test-sockets.c | 4 +++- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index a411173..fd26362 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2009-02-09 Simon Josefsson <si...@josefsson.org> + + * lib/sockets.h (gl_fd_to_handle): New function. + + * tests/test-sockets.c: Call gl_fd_to_handle. + 2009-02-09 Bruno Haible <br...@clisp.org> * doc/havelib.texi: Document the conventions on bi-arch systems. diff --git a/lib/sockets.h b/lib/sockets.h index 33348db..bf180ac 100644 --- a/lib/sockets.h +++ b/lib/sockets.h @@ -1,6 +1,6 @@ /* sockets.h - wrappers for Windows socket functions - Copyright (C) 2008 Free Software Foundation, Inc. + Copyright (C) 2008, 2009 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,4 +29,17 @@ int gl_sockets_startup (int version); int gl_sockets_cleanup (void); +/* This function is useful it you create a socket using gnulib's + Winsock wrappers but needs to pass on the socket handle to some + other library that only accepts sockets. */ +#if WINDOWS_SOCKETS +static inline SOCKET +gl_fd_to_handle (int fd) +{ + return _get_osfhandle (fd); +} +#else +#define gl_fd_to_handle(x) (x) +#endif + #endif diff --git a/tests/test-sockets.c b/tests/test-sockets.c index 514409d..a37a197 100644 --- a/tests/test-sockets.c +++ b/tests/test-sockets.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008 Free Software Foundation + * Copyright (C) 2008, 2009 Free Software Foundation * Written by Simon Josefsson. * * This program is free software: you can redistribute it and/or modify @@ -40,5 +40,7 @@ main (int argc, char *argv[]) return 1; } + gl_fd_to_handle (0); + return 0; } -- 1.5.6.5