Hi.

I don't know if this is technically a bug, but I've noticed that unlike
on Linux or MacOS, I a cannot bind a unix domain socket in a child
process and then listen on it in the parent.

The bind succeeds but `listen()` in the parent then fails with EINVAL.

(The reason I'd like to `bind` in a different process is so I could
`chdir` to a different directory before `bind`ing and then conceptually
back without having the `chdir` break file operations in different threads.)

Just wanted to let you guys know in case there was an easy fix.

Best regards,
Petr Skocik
____________________

Example code:

#include <limits.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/un.h>
#include <sys/wait.h>
#include <unistd.h>

int main(int C, char **V)
{
        int sfd; if(0>(sfd=socket(AF_UNIX, SOCK_STREAM, 0),1)) return
perror("socket"),1;
        struct sockaddr_un uaddr; uaddr.sun_family = AF_UNIX;
        char const *nm = "FOO.sock"; size_t nmlen =
nm[0]?strlen(nm):(1+strlen(&nm[1]));
        size_t actlen = nmlen <= sizeof(uaddr.sun_path)-1 ? nmlen :
sizeof(uaddr.sun_path)-1;

        memcpy(&uaddr.sun_path[0],nm,actlen);
        uaddr.sun_path[actlen]='\0';
        size_t socklen = 0 ? sizeof(struct sockaddr_un) : offsetof(struct
sockaddr_un, sun_path) + actlen + 1;

        fflush(stdout);
        pid_t pid=0;

        int fork_eh = atoi(V[1]?V[1]:"1");

        if(fork_eh)
                if(0>(pid=fork())) return perror("fork"),1;
        if(0==pid){
                printf("pid=%d binding\n", (int)getpid());
                if(0>bind(sfd, (struct sockaddr*)&uaddr, (socklen_t)+socklen))
perror("bind"),_exit(1);
                printf("pid=%d bound\n", (int)getpid());
                fflush(stdout);
                if(fork_eh) _exit(0);
        }
        wait(0);

        if(0>listen(sfd,INT_MAX)) return perror("listen"),1;
        printf("pid=%d listening\n", (int)getpid());

}


--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple

Reply via email to