[BACK]Return to sio.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / io

Diff for /OpenXM_contrib2/asir2000/io/sio.c between version 1.9.2.4 and 1.10

version 1.9.2.4, 2000/11/11 06:37:08 version 1.10, 2000/11/15 01:20:27
Line 44 
Line 44 
  * OF THE SOFTWARE HAS BEEN DEVELOPED BY A THIRD PARTY, THE THIRD PARTY   * OF THE SOFTWARE HAS BEEN DEVELOPED BY A THIRD PARTY, THE THIRD PARTY
  * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,   * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,
  * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.   * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.
  * $OpenXM: OpenXM_contrib2/asir2000/io/sio.c,v 1.9.2.3 2000/11/10 14:57:24 maekawa Exp $   * $OpenXM: OpenXM_contrib2/asir2000/io/sio.c,v 1.9 2000/11/07 06:35:39 noro Exp $
 */  */
 #if INET  #if INET
 #include "ca.h"  #include "ca.h"
 #include "setjmp.h"  #include "setjmp.h"
 #include "ox.h"  #include "ox.h"
 #if defined(VISUAL)  #if defined(VISUAL)
 #include <winsock.h>  #include <winsock2.h>
 #else  #else
 #include <sys/time.h>  #include <sys/time.h>
 #include <sys/uio.h>  #include <sys/uio.h>
Line 86  void getremotename(s,name)
Line 86  void getremotename(s,name)
 int s;  int s;
 char *name;  char *name;
 {  {
         struct sockaddr_storage ss;          struct sockaddr_in peer;
         struct sockaddr *sa;          struct hostent *hp;
         socklen_t len;          int peerlen;
         char host[NI_MAXHOST];  
         int rs;  
   
         rs = getremotesocket(s);          peerlen = sizeof(peer);
         len = sizeof(ss);          getpeername(getremotesocket(s),(struct sockaddr *)&peer,&peerlen);
         getpeername(rs, (struct sockaddr *)&ss, &len);          hp = gethostbyaddr((char *)&peer.sin_addr,sizeof(struct in_addr),AF_INET);
         sa = (struct sockaddr *)&ss;          if ( hp )
         getnameinfo(sa, sa->sa_len, host, sizeof(host), NULL, 0, 0);                  strcpy(name,hp->h_name);
         strcpy(name, host);          else
                   strcpy(name,(char *)inet_ntoa(peer.sin_addr));
 }  }
   
 int generate_port(use_unix,port_str)  int generate_port(use_unix,port_str)
Line 127  int try_bind_listen(use_unix,port_str)
Line 126  int try_bind_listen(use_unix,port_str)
 int use_unix;  int use_unix;
 char *port_str;  char *port_str;
 {  {
         struct addrinfo hints, *res, *ai;          struct sockaddr_in sin;
         int s, error;          struct sockaddr *saddr;
         char *errstr;          int len;
           int service;
   #if !defined(VISUAL)
           struct sockaddr_un s_un;
   
         memset(&hints, 0, sizeof(hints));          if ( use_unix ) {
 #if defined(VISUAL)                  service = socket(AF_UNIX, SOCK_STREAM, 0);
         hints.ai_family = PF_UNSPEC;                  if (service < 0) {
                           perror("in socket");
                           return -1;
                   }
                   s_un.sun_family = AF_UNIX;
                   strcpy(s_un.sun_path,port_str);
   #if defined(__FreeBSD__)
                   len = SUN_LEN(&s_un);
                   s_un.sun_len = len+1; /* XXX */
 #else  #else
         if (use_unix)                  len = strlen(s_un.sun_path)+sizeof(s_un.sun_family);
                 hints.ai_family = PF_UNIX;  #endif
         else                  saddr = (struct sockaddr *)&s_un;
                 hints.ai_family = PF_UNSPEC;          } else
 #endif /* VISUAL */  #endif
         hints.ai_socktype = SOCK_STREAM;          {
                   service = socket(AF_INET, SOCK_STREAM, 0);
         error = getaddrinfo(NULL, port_str, &hints, &res);                  if ( service < 0 ) {
         if (error) {                          perror("in socket");
                 warnx("try_bind_listen(): %s", gai_strerror(error));                          return -1;
                 return (-1);  
         }  
   
         s = -1;  
         for (ai = res ; ai != NULL ; ai = ai->ai_next) {  
                 if ((s = socket(ai->ai_family, ai->ai_socktype,  
                                 ai->ai_protocol)) < 0 ) {  
                         errstr = "in socket";  
                         continue;  
                 }                  }
                   sin.sin_family = AF_INET; sin.sin_addr.s_addr = INADDR_ANY;
                 if (bind(s, ai->ai_addr, ai->ai_addrlen) < 0) {                  sin.sin_port = htons(atoi(port_str));
                         errstr = "in bind";                  len = sizeof(sin);
                         close(s);                  saddr = (struct sockaddr *)&sin;
                         s = -1;  
                         continue;  
                 }  
   
                 if (listen(s, SOCKQUEUELENGTH) < 0) {  
                         errstr = "in listen";  
                         close(s);  
                         s = -1;  
                         continue;  
                 }  
   
                 /* established connection */  
                 break;  
         }          }
         freeaddrinfo(res);          if (bind(service, saddr, len) < 0) {
                   perror("in bind");
         if (s < 0)                  close(service);
                 perror(errstr);                  return -1;
         return (s);          }
           if (getsockname(service,saddr, &len) < 0) {
               perror("in getsockname");
               close(service);
               return -1;
           }
           if (listen(service, SOCKQUEUELENGTH) < 0) {
                   perror("in listen");
                   close(service);
                   return -1;
           }
           return service;
 }  }
   
 /*  /*
   try to accept a connection request    try to accept a connection request
   
   Input    Input
       af_unix: s is UNIX domain socket if af_unix is nonzero
     s: socket      s: socket
   
   Output    Output
Line 193  char *port_str;
Line 193  char *port_str;
   the original socket is always closed.    the original socket is always closed.
 */  */
   
 int try_accept(s)  int try_accept(af_unix,s)
 int s;  int af_unix,s;
 {  {
         struct sockaddr_storage ss;          int len,c,i;
         socklen_t len;          struct sockaddr_in sin;
         int c, i;  
   
         len = sizeof(ss);  #if !defined(VISUAL)
         if (getsockname(s, (struct sockaddr *)&ss, &len) < 0) {          struct sockaddr_un s_un;
                 close(s);          if ( af_unix ) {
                 return (-1);                  len = sizeof(s_un);
         }                  for ( c = -1, i = 0; (c < 0)&&(i = 10) ; i++ )
                           c = accept(s, (struct sockaddr *) &s_un, &len);
           } else
   #endif
           {
   
         for (i = 0 ; i < 10 ; i++) {                  len = sizeof(sin);
                 c = accept(s, (struct sockaddr *)&ss, &len);                  for ( c = -1, i = 0; (c < 0)&&(i = 10) ; i++ )
                 if (c >= 0) {                          c = accept(s, (struct sockaddr *) &sin, &len);
                         close(s);  
                         return (c);  
                 }  
         }          }
           if ( i == 10 )
                   c = -1;
         close(s);          close(s);
         return (-1);          return c;
 }  }
   
 int try_connect(use_unix,host,port_str)  int try_connect(use_unix,host,port_str)
 int use_unix;  int use_unix;
 char *host,*port_str;  char *host,*port_str;
 {  {
         struct addrinfo hints, *res, *ai;          struct sockaddr_in sin;
         int s, error, i;          struct sockaddr *saddr;
         char *errstr;          struct hostent *hp;
           int len,s,i;
   #if !defined(VISUAL)
           struct sockaddr_un s_un;
   #endif
   
         memset(&hints, 0, sizeof(hints));          for ( i = 0; i < 10; i++ ) {
 #if defined(VISUAL)  #if !defined(VISUAL)
         hints.ai_family = PF_UNSPEC;                  if ( use_unix ) {
                           if ( (s = socket(AF_UNIX,SOCK_STREAM,0)) < 0 ) {
                                   perror("socket");
                                   return -1;
                           }
                           bzero(&s_un,sizeof(s_un));
                           s_un.sun_family = AF_UNIX;
                           strcpy(s_un.sun_path,port_str);
   #if defined(__FreeBSD__)
                           len = SUN_LEN(&s_un);
                           s_un.sun_len = len+1; /* XXX */
 #else  #else
         if (use_unix)                          len = strlen(s_un.sun_path)+sizeof(s_un.sun_family);
                 hints.ai_family = PF_UNIX;  #endif
         else                          saddr = (struct sockaddr *)&s_un;
                 hints.ai_family = PF_UNSPEC;                  } else
 #endif /* VISUAL */  #endif /* VISUAL */
         hints.ai_socktype = SOCK_STREAM;                  {
                           if ( (s = socket(AF_INET,SOCK_STREAM,0)) < 0 ) {
         error = getaddrinfo(host, port_str, &hints, &res);                                  perror("socket");
         if (error) {                                  return -1;
                 warnx("try_connect: %s", gai_strerror(error));  
                 return (-1);  
         }  
         for (i = 0 ; i < 10 ; i++) {  
                 s = -1;  
                 for (ai = res ; ai != NULL ; ai = ai->ai_next) {  
                         if ((s = socket(ai->ai_family, ai->ai_socktype,  
                                         ai->ai_protocol)) < 0 ) {  
                                 errstr = "socket";  
                                 continue;  
                         }                          }
                         if (connect(s, ai->ai_addr, ai->ai_addrlen) < 0) {                          bzero(&sin,sizeof(sin));
                                 errstr = "connect";                          sin.sin_port = htons(atoi(port_str));
                                 close(s);                          sin.sin_addr.s_addr = inet_addr(host);
                                 s = -1;                          if ( sin.sin_addr.s_addr != -1 ) {
                                 continue;                                  sin.sin_family = AF_INET;
                           } else {
                                   hp = gethostbyname(host);
                                   bcopy(hp->h_addr,&sin.sin_addr,hp->h_length);
                                   sin.sin_family = hp->h_addrtype;
                         }                          }
                           len = sizeof(sin);
                         /* established a connection */                          saddr = (struct sockaddr *)&sin;
                         break;  
                 }                  }
                   if ( connect(s,saddr,len) >= 0 )
                 if (s >= 0) {                          break;
                         freeaddrinfo(res);                  else {
                         return (s);                          close(s);
                 }  
   
 #if defined(VISUAL)  #if defined(VISUAL)
                 Sleep(100);                          Sleep(100);
 #else  #else
                 usleep(100000);                          usleep(100000);
 #endif  #endif
                   }
         }          }
         freeaddrinfo(res);          if ( i == 10 ) {
                   perror("connect");
         perror(errstr);                  return -1;
         return (-1);          } else
                   return s;
 }  }
   
 #if 0  #if 0

Legend:
Removed from v.1.9.2.4  
changed lines
  Added in v.1.10

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>