=================================================================== RCS file: /home/cvs/OpenXM/src/kan96xx/plugin/mytcpio.c,v retrieving revision 1.4.2.3 retrieving revision 1.13 diff -u -p -r1.4.2.3 -r1.13 --- OpenXM/src/kan96xx/plugin/mytcpio.c 2000/11/11 07:01:19 1.4.2.3 +++ OpenXM/src/kan96xx/plugin/mytcpio.c 2004/02/25 23:14:35 1.13 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM/src/kan96xx/plugin/mytcpio.c,v 1.4.2.2 2000/11/11 04:44:30 maekawa Exp $ */ +/* $OpenXM: OpenXM/src/kan96xx/plugin/mytcpio.c,v 1.12 2003/09/16 02:57:39 takayama Exp $ */ #include #include #include @@ -6,6 +6,7 @@ #include #include #include +#include /* -lnsl -lsocket /usr/ucblib/libucb.a */ #include "ox_kan.h" /* @@ -15,10 +16,15 @@ #if defined(sun) int MyEnv_oxmisc[2000]; #else +#if defined(__CYGWIN__) +sigjmp_buf MyEnv_oxmisc; /* may cause a trouble in Solaris. */ +#else jmp_buf MyEnv_oxmisc; /* may cause a trouble in Solaris. */ #endif +#endif #define READBUFSIZE 10000 +#define MAX_LISTEN_QUEUE 3 static void errorMsg1s(char *s) { fprintf(stderr,"%s\n",s); } @@ -29,103 +35,52 @@ int OpenedSocket = 0; extern int Quiet; socketOpen(char *serverName,int portNumber) { - struct addrinfo hints, *res, *ai; - struct sockaddr_storage ss; - socklen_t len; - char pstr[BUFSIZ], *errstr; - int s, p, opt, error; + static struct hostent *myhost; + static struct sockaddr_in me; + static int s_waiting; + static int on; + int tt; - SET_TCPIOERROR; - fprintf(TcpioError, "Hello from open. serverName is %s and " - "portnumber is %d\n", serverName, portNumber); + SET_TCPIOERROR; + fprintf(TcpioError,"Hello from open. serverName is %s and portnumber is %d\n", + serverName,portNumber); + if ((myhost = gethostbyname(serverName)) == NULL) { + errorMsg1s("Bad server name."); + return(-1); + } + bzero((char *)&me,sizeof(me)); + me.sin_family = AF_INET; + me.sin_port = htons(portNumber); + bcopy(myhost->h_addr, + &me.sin_addr,myhost->h_length); - memset(&hints, 0, sizeof(hints)); - hints.ai_family = PF_UNSPEC; - hints.ai_socktype = SOCK_STREAM; + if ((s_waiting = socket(AF_INET,SOCK_STREAM,0)) < 0) { + errorMsg1s("Socket allocation is failed."); + return(-1); + } - memset(pstr, 0, sizeof(pstr)); - snprintf(pstr, sizeof(pstr), "%d", portNumber); + on=1; setsockopt(s_waiting,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)); + /* important */ + if ((tt = bind(s_waiting,(struct sockaddr *) &me,sizeof(me))) == -1) { + fprintf(TcpioError,"Bind error. Error no is %d. See /usr/include/sys/errno.h. (asm/errno.h)\n",errno); + errorMsg1s("cannot bind"); + return(-1); + } + /* printf("bind returns %d\n",tt); */ + tt = sizeof(me); + if (getsockname(s_waiting,(struct sockaddr *)&me,&tt) < 0) { + fprintf(TcpioError,"getsockname error. Error no is %d. See /usr/include/sys/errno.h (asm/errno.h).\n",errno); + errorMsg1s("cannot getsockname"); + return(-1); + } - error = getaddrinfo(serverName, pstr, &hints, &res); - if (error) { - errorMsg1s("Bad server name."); - return (-1); - } - - s = -1; - p = -1; - errstr = NULL; - - for (ai = res ; ai != NULL ; ai = ai->ai_next) { - s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); - if (s < 0) { - errstr = "socket"; - continue; - } - - opt = 1; - setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); - - if (bind(s, ai->ai_addr, ai->ai_addrlen) < 0) { - errstr = "bind"; - close(s); - s = -1; - continue; - } - - len = sizeof(ss); - if (getsockname(s, (struct sockaddr *)&ss, &len) < 0) { - errstr = "getsockname"; - close(s); - s = -1; - continue; - } - - switch (ss.ss_family) { - case AF_INET: - { - struct sockaddr_in *sin; - sin = (struct sockaddr_in *)&ss; - p = ntohs(sin->sin_port); - break; - } - case AF_INET6: - { - struct sockaddr_in6 *sin6; - sin6 = (struct sockaddr_in6 *)&ss; - p = ntohs(sin6->sin6_port); - break; - } - default: - p = -1; - } - if (p < 0) { - errstr = "AF"; - close(s); - s = -1; - continue; - } - - if (listen(s, 1) < 0) { - errstr = "listen"; - close(s); - s = -1; - continue; - } - - break; - } - - freeaddrinfo(res); - - if (s < 0) { - fprintf(TcpioError, "Error: %s", errstr); - errorMsg1s(errstr); - } else { - OpenedSocket = p; - } - - return (s); + if (listen(s_waiting,MAX_LISTEN_QUEUE) < 0) { + errorMsg1s("Listen failed"); + return(-1); + } + fprintf(TcpioError,"Done the initialization. port =%d\n",ntohs(me.sin_port)); + OpenedSocket = ntohs(me.sin_port); + return(s_waiting); } @@ -136,8 +91,12 @@ socketAccept(int snum) { s = snum; fprintf(TcpioError,"Trying to accept... "); fflush(TcpioError); if ((news = accept(s,NULL,NULL)) < 0) { - errorMsg1s("Error in accept."); - return(-1); + errorMsg1s("Error in accept. Retrying (socketAccept)."); + /* Code added for strange behavior on cygwin. */ + if ((news = accept(s,NULL,NULL)) < 0) { + errorMsg1s("Error in accept. Retry failed."); + return (-1); + } } fprintf(TcpioError,"Accepted.\n"); fflush(TcpioError); if (close(s) < 0) { @@ -147,84 +106,94 @@ socketAccept(int snum) { return(news); } -socketAcceptLocal(int s) { - struct sockaddr_storage ss; - socklen_t len; - int ps, accepted, error; +socketAcceptLocal(int snum) { + int s, news; + struct sockaddr peer; + int len; + int i; - SET_TCPIOERROR; + SET_TCPIOERROR; + s = snum; + fprintf(TcpioError,"Trying to accept from localhost... "); fflush(TcpioError); + len = sizeof(struct sockaddr); + if ((news = accept(s,&peer,&len)) < 0) { + errorMsg1s("Error in accept. Retrying"); + /* Code added for strange behavior on cygwin. */ + if ((news = accept(s,&peer,&len)) < 0) { + errorMsg1s("Error in accept. Retry failed."); + return (-1); + } + } - fprintf(TcpioError,"Trying to accept from localhost... "); - fflush(TcpioError); + len = sizeof(struct sockaddr); + getpeername(news,&peer,&len); + printf("len= %d\n",len); + for (i=0; isin_addr.s_addr == INADDR_LOOPBACK) - accepted = 1; - break; - } - case AF_INET6: - { - struct sockaddr_in6 *sin6; - sin6 = (struct sockaddr_in6 *)&ss; - if (IN6_IS_ADDR_LOOPBACK(&sin6->sin6_addr)) - accepted = 1; - break; - } - default: - accepted = 0; - } + SET_TCPIOERROR; + s = snum; + fprintf(TcpioError,"Trying to accept from localhost... "); fflush(TcpioError); + len = sizeof(struct sockaddr); + if ((news = accept(s,&peer,&len)) < 0) { + errorMsg1s("Error in accept. Retrying (socketAcceptLocal2)."); + /* Code added for strange behavior on cygwin. */ + if ((news = accept(s,&peer,&len)) < 0) { + errorMsg1s("Error in accept. Retry failed."); + return (-1); + } + } - if (accepted) { - fprintf(stderr, "Authentication: " - "localhost is allowed to be accepted.\n"); - } else { - errorMsg1s("Authentication: " - "The connection is not from the localhost."); - close(s); - close(ps); - fprintf(stderr, "The connection is refused."); - return (-1); - } + len = sizeof(struct sockaddr); + getpeername(news,&peer,&len); + printf("len= %d\n",len); + for (i=0; ih_addr, + (char *)&server.sin_addr,servhost->h_length); - memset(&hints, 0, sizeof(hints)); - hints.ai_family = PF_UNSPEC; - hints.ai_socktype = SOCK_STREAM; - - memset(pstr, 0, sizeof(pstr)); - snprintf(pstr, sizeof(pstr), "%d", portNumber); - - error = getaddrinfo(serverName, pstr, &hints, &res); - if (error) { - errorMsg1s("bad server name.\n"); - return (-1); - } - - s = -1; - errstr = NULL; - - for (ai = res ; ai != NULL ; ai = ai->ai_next) { - s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); - if (s < 0) { - errstr = "socket"; - continue; - } - - if (!Quiet) { - fprintf(TcpioError, "Trying to connect %s, port %d\n", - serverName, portNumber); - } - - if (connect(s, ai->ai_addr, ai->ai_addrlen) < 0) { - errstr = "connect"; - close(s); - s = -1; - continue; - } - } - - freeaddrinfo(res); - - if (s < 0) { - fprintf(stderr, "Error %s\n", errstr); - return (-1); - } - - if (!Quiet) - fprintf(TcpioError,"connected.\n"); - - return (s); + if ((socketid = socket(AF_INET,SOCK_STREAM,0)) <0) { + errorMsg1s("socket allocation is failed.\n"); + return(-1); + } + /* on=1; setsockopt(socketid,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)); */ + if (!Quiet) { + fprintf(TcpioError,"Trying to connect port %d, ip=%x\n",ntohs(server.sin_port),server.sin_addr); + } + if (connect(socketid,(struct sockaddr *)&server,sizeof(server)) == -1) { + errorMsg1s("cannot connect"); + return(-1); + } + if (!Quiet) fprintf(TcpioError,"connected.\n"); + return(socketid); } socketConnectWithPass(char *servername,int port,char *pass) @@ -364,6 +309,8 @@ socketConnectWithPass(char *servername,int port,char * int m; SET_TCPIOERROR; fd = socketConnect(servername,port); + if ((pass == NULL) && (fd >= 0)) return fd; + if ((pass == NULL) && (fd < 0)) return -1; if (fd >= 0) { m = write(fd,pass,strlen(pass)+1); if (m != strlen(pass)+1) {