connect() hangs on a listen()ing AF_UNIX socket

Christian Franke
Thu Aug 21 16:17:00 GMT 2014

Corinna Vinschen wrote (in thread "[ITP] libsuexec 1.0"):
> Postfix for Cygwin would be *so* nice.  Sigh.  ...

Due to the following problem, Postfix hangs during startup (and blocks 
any possible "[ITP] postfix ..."):

If a AF_UNIX socket is in listen()ing state, a client connect() should 
succeed immediately. On Cygwin, connect() waits until the server site 
accept()s the connection.


#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>

int main()
   sockaddr_un sa = {AF_UNIX, "testsocket"};

   int sd1 = socket(AF_UNIX, SOCK_STREAM, 0);
   if (sd1 < 0) {
     perror("socket"); return 1;
   if (bind(sd1, (sockaddr*) &sa, sizeof(sa))) {
     perror("bind"); return 1;
   if (listen(sd1, 10) < 0) {
     perror("listen"); return 1;

   int sd2 = socket(AF_UNIX, SOCK_STREAM, 0);
   if (sd2 < 0) {
     perror("socket"); return 1;
   printf("connecting to %s ...\n", sa.sun_path);

   // Cygwin hangs here:
   if (connect(sd2, (sockaddr*) &sa, sizeof(sa))) {
     perror("connect"); return 1;

   // Linux & friends arrive here:
   return 0;

This is likely because fhandler_socket::af_local_connect() waits for 
some secret. Sending it in af_local_accept() is too late in this case.

Unfortunately the event handling of postfix relies on the correct 
behavior and there is possibly no easy workaround.


Problem reports:
Unsubscribe info:

More information about the Cygwin mailing list