[Help-gnutls] Re: Build gnutls on windows

Simon Josefsson jas at extundo.com
Sat Sep 24 10:04:02 CEST 2005

Martin Lambers <marlam at marlam.de> writes:

> On Fri, 23. Sep 2005, 00:46:27 +0200, Simon Josefsson wrote:
>> > Reasonable POSIX support on Win32 is not just a collection of fixes for
>> > minor misbehaviour; it is a major task. Perhaps it would be better to
>> > leave that to an external project and only support "MinGW + plibc" (or
>> > something similar) as a target platform.
>> Yes, I think you are right.  However, it isn't impossible to integrate
>> something like plibc in gnulib, or in GnuTLS itself.  Then the GnuTLS
>> core code will be good and the resulting binaries should run properly
>> too.  I'm not sure GnuTLS need a lot from POSIX, perhaps we can even
>> integrate the plibc functions we need in GnuTLS.
> Judging from some quick greps, I think at least the following is
> necessary to get rid of #ifdef _WIN32:

Many thanks for checking this!

> - Integration of existing gnulib modules:
>   - inet_ntop

The module is LGPL so this isn't a problem.

> - New gnulib modules for missing headers:
>   - <sys/socket.h>
>   - <netinet/in.h>
>   - <arpa/inet.h>
>   - <netdb.h>

Bruno said on the gnulib list that this was doable.

> - New gnulib modules to make socket functions set errno, provide
>   the missing errnos such as ECONNREFUSED, and provide a strerror() that
>   understands these additional errnos.
>   - select()
>   - connect()
>   - accept()
>   - recv()
>   - send()
>   - ...

We could do this too, but it would take more time to figure out which
functions need to be re-implemented.  And also to write the
re-implementation, I haven't looked at plibc enough to know whether it
would work or not.

> - New gnulib modules to make some functions work with sockets:
>   - close()
>   - fcntl() which handles O_NONBLOCK for sockets
> - Call WSAStartup() / WSACleanup() somewhere without having them in the
>   main code.

I'm not sure how to do this, but may be doable.  Perhaps calling
WSAStartup/WSACleanup in a #ifdef WIN32 is acceptable.

> - Non-networking issues:
>   - getpwuid(), getuid()
>   - signal handling:
>     Using SIGALARM for network timeouts could be replaced by using
>     setsockopt with SO_RCVTIMEO and SO_SNDTIMEO. But this does not work on
>     Windows <= 2000 and on several UNIX versions including Solaris. It does
>     work on GNU/Linux and *BSD.

I wonder if there is a better solution.

> I'm sorry to say that I currently don't have enough spare time to be
> able to work on these things.

Your message is a very good stating point...

>> Btw, have you tested to run a mingw32 built gnutls-cli on a Windows
>> platform?  It shouldn't be too hard to test it to see whether it works
>> or almost works.
> It does not. I tested
> $ gnutls-cli.exe --print-cert --port 25 --starttls some.smtp.server
> It hangs after printing "Simple Client Mode:".  That's because select()
> is called and the test after the call assumes that errno is set. This
> results in an endless loop.

The next step would be to integrate the plibc select and see what
breaks then.


More information about the Gnutls-help mailing list