[PATCH v2 1/5] Import "glob" and "getcwd" modules from gnulib

Sergio Durigan Junior sergiodj@redhat.com
Wed Sep 20 20:30:00 GMT 2017


On Wednesday, September 20 2017, I wrote:

> On Wednesday, September 20 2017, Pedro Alves wrote:
>
>> On 09/20/2017 06:17 PM, Sergio Durigan Junior wrote:
>>> On Wednesday, September 20 2017, Pedro Alves wrote:
>>
>>>> --- a/gdb/ser-tcp.c
>>>> +++ b/gdb/ser-tcp.c
>>>> @@ -42,7 +42,6 @@
>>>>  #ifndef ETIMEDOUT
>>>>  #define ETIMEDOUT WSAETIMEDOUT
>>>>  #endif
>>>> -#define close(fd) closesocket (fd)
>>>>
>>>> Are you sure that the gnulib code that makes close work
>>>> for sockets is enabled?  I guess it will if WINDOWS_SOCKETS
>>>> is defined, but it wasn't obvious to me whether it'll end
>>>> up defined with the current set of modules.
>>> 
>>> One of the dependencies of "getcwd" is the "close" module, and whenever
>>> I tried to compile this patch with mingw it would fail because of this
>>> re-definition of close made by ser-tcp.c.  My first approach was to
>>> #undef close before ser-tcp.c redefined it, but then I decided to just
>>> use "close" from gnulib.  I didn't know about this WINDOWS_SOCKETS
>>> requirement; maybe we can define it before the inclusion of <stdlib.h>?
>>> Or maybe choose the safe side and let ser-tcp.c redefine close as
>>> needed.
>>
>> I don't know much about WINDOWS_SOCKETS either.  I just looked
>> at gnulib/lib/close.c, and found:
>>
>> ~~~
>> /* Override close() to call into other gnulib modules.  */
>>
>> int
>> rpl_close (int fd)
>> {
>> #if WINDOWS_SOCKETS
>>   int retval = execute_all_close_hooks (close_nothrow, fd);
>> #else
>>   int retval = close_nothrow (fd);
>> #endif
>>
>> #if REPLACE_FCHDIR
>>   if (retval >= 0)
>>     _gl_unregister_fd (fd);
>> #endif
>>
>>   return retval;
>> }
>> ~~~
>>
>>
>> and then figured out that there's a close_fd_maybe_socket
>> close hook implemented in lib/sockets.c.
>>
>> static int
>> close_fd_maybe_socket (const struct fd_hook *remaining_list,
>>                        gl_close_fn primary,
>>                        int fd)
>> {
>>
>> This is all wrapped in #ifdef WINDOWS_SOCKETS, hence the question.
>>
>> It should be easy for you to determine whether WINDOWS_SOCKETS
>> is defined in your mingw build, and thus whether all this code
>> is part of the build or not.
>
> I will do that and report back.  Thanks,

WINDOWS_SOCKETS is not defined when building with the mingw compiler
from Fedora.  This means that removing that "#define" was actually not
correct, because "close" will not work as expected even with gnulib.

My proposal is to define "close" as it was being defined before, but
actually "#undef" it if it's already defined by other headers, like:

  #ifdef close
  #undef close
  #endif
  #define close(fd) closesocket (fd)

Does that work for you?

-- 
Sergio
GPG key ID: 237A 54B1 0287 28BF 00EF  31F4 D0EB 7628 65FC 5E36
Please send encrypted e-mail if possible
http://sergiodj.net/



More information about the Gdb-patches mailing list