#if !defined(__linux__) && !defined(ANDROID) #include typedef SOCKET socket_t; /* https://stackoverflow.com/questions/10817252/why-is-invalid-socket-defined-as-0-in-winsock2-h-c */ #ifndef SHUT_WR #define SHUT_WR SD_SEND #endif #ifndef SHUT_RD #define SHUT_RD SD_RECEIVE #endif #define close(s) closesocket(s) #else #include #include #include typedef int socket_t; #define INVALID_SOCKET -1 #endif #ifndef FILLIPV4ADDR #define FILLIPV4ADDR(a,family,addr,port) \ memset(&(a),0,sizeof(struct sockaddr_in)),\ s.sin_family=family,\ s.sin_addr.s_addr=addr,\ s.sin_port=htons(port) #endif #if 1 #include #endif static int * win32pipe_initvalue(void) { static int init=0; return(&init); } int win32pipe_init(void) { int *init; init=win32pipe_initvalue(); if(*init!=0) return(0); *init=1; #if !defined(__linux__) && !defined(ANDROID) { WSADATA wsaData; return(WSAStartup(0x202,&wsaData)); } #else return(0); #endif } void win32pipe_fini(void) { int *init; init=win32pipe_initvalue(); if(*init==0) return; #if !defined(__linux__) && !defined(ANDROID) WSACleanup(); #endif *init=0; } int win32pipe_pipe(int fds[2]) { socket_t serverfd,workfd,clientfd; struct sockaddr_in s; int sizes; win32pipe_init(); FILLIPV4ADDR(s,AF_INET,htonl(INADDR_ANY),0); serverfd=workfd=clientfd=INVALID_SOCKET; if((serverfd=socket(AF_INET,SOCK_STREAM,0))==INVALID_SOCKET || bind(serverfd,(struct sockaddr *)&s,sizeof(s))!=0 || listen(serverfd,4)==-1 || (sizes=sizeof(s))!=sizeof(s) || getsockname(serverfd,(struct sockaddr *)&s,&sizes)==-1 || (clientfd=socket(AF_INET,SOCK_STREAM,0))==INVALID_SOCKET || connect(clientfd,(struct sockaddr *)&s,sizeof(s))==-1 || (workfd=accept(serverfd,(struct sockaddr *)&s,&sizes))==-1 ) { if(serverfd!=-1) close(serverfd),serverfd=-1; if(clientfd!=-1) close(clientfd),clientfd=-1; if(workfd!=-1) close(workfd),workfd=-1; #if 1 fprintf(stderr,"win32_pipe error creating socket\n"); #endif return(-1); } #if 1 fprintf(stderr,"win32_pipe socket generated\n"); #endif close(serverfd),serverfd=-1; shutdown(workfd,SHUT_WR); shutdown(clientfd,SHUT_RD); fds[0]=workfd,workfd=-1; fds[1]=clientfd,clientfd=-1; return(0); } int win32pipe_read(int fd, char *buf, int count) { return(recv(fd,buf,count,0)); } int win32pipe_write(int fd, char *buf, int count) { return(send(fd,buf,count,0)); }