[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.1 and 1.19

version 1.9.2.1, 2000/11/08 08:18:14 version 1.19, 2003/01/28 08:38:59
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 2000/11/07 06:35:39 noro Exp $   * $OpenXM: OpenXM_contrib2/asir2000/io/sio.c,v 1.18 2002/10/03 07:12:30 noro Exp $
 */  */
 #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>
   #include <io.h>
 #else  #else
 #include <sys/time.h>  #include <sys/time.h>
 #include <sys/uio.h>  #include <sys/uio.h>
Line 76  struct IOFP iofp[MAXIOFP];
Line 76  struct IOFP iofp[MAXIOFP];
   
 void init_socket(void);  void init_socket(void);
   
 int getremotesocket(s)  int getremotesocket(int s)
 int s;  
 {  {
         return iofp[s].s;          return iofp[s].s;
 }  }
   
 void getremotename(s,name)  void getremotename(int s,char *name)
 int s;  
 char *name;  
 {  {
         union {          struct sockaddr_in peer;
                 struct sockaddr sa;          struct hostent *hp;
                 char data[SOCK_MAXADDRLEN];          int peerlen;
         } dummy;  
         struct sockaddr *sa;  
         socklen_t len;  
         char host[NI_MAXHOST];  
         int rs;  
   
         rs = getremotesocket(s);          peerlen = sizeof(peer);
         len = SOCK_MAXADDRLEN;          getpeername(getremotesocket(s),(struct sockaddr *)&peer,&peerlen);
         getpeername(rs, (struct sockaddr *)dummy.data, &len);          hp = gethostbyaddr((char *)&peer.sin_addr,sizeof(struct in_addr),AF_INET);
         sa = &(dummy.sa);          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)  void generate_port(int use_unix,char *port_str)
 int use_unix;  
 char *port_str;  
 {  {
         double get_current_time();          double get_current_time();
         unsigned long mt_genrand();          unsigned long mt_genrand();
Line 126  char *port_str;
Line 117  char *port_str;
         }          }
 }  }
   
 int try_bind_listen(use_unix,port_str)  int try_bind_listen(int use_unix,char *port_str)
 int use_unix;  
 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);  
         }  
   
         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((unsigned short)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;
 }  }
   
 /*  /*
Line 196  char *port_str;
Line 186  char *port_str;
   the original socket is always closed.    the original socket is always closed.
 */  */
   
 int try_accept(af_unix,s)  int try_accept(int af_unix,int s)
 int af_unix,s;  
 {  {
         union {          int len,c,i;
                 struct sockaddr sa;          struct sockaddr_in sin;
                 char data[SOCK_MAXADDRLEN];  
         } dummy;  
         socklen_t len;  
         int c, i;  
   
         len = SOCK_MAXADDRLEN;  #if !defined(VISUAL)
         if (getsockname(s, (struct sockaddr *)dummy.data, &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, &(dummy.sa), &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(int use_unix,char *host,char *port_str)
 int use_unix;  
 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 ( !host )
         error = getaddrinfo(host, port_str, &hints, &res);                                  host = "127.0.0.1";
         if (error) {                          if ( (s = socket(AF_INET,SOCK_STREAM,0)) < 0 ) {
                 warnx("try_connect: %s", gai_strerror(error));                                  perror("socket");
                 return (-1);                                  return -1;
         }  
         for (i = 0 ; i < 10 ; i++) {  
                 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((unsigned short)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
 close_allconnections()  void close_allconnections()
 {  {
         int s;          int s;
   
Line 295  close_allconnections()
Line 290  close_allconnections()
                 close_connection(s);                  close_connection(s);
 }  }
   
 close_connection(s)  void close_connection(int s)
 int s;  
 {  {
         struct IOFP *r;          struct IOFP *r;
   
Line 308  int s;
Line 302  int s;
         }          }
 }  }
 #else  #else
 close_allconnections()  void close_allconnections()
 {  {
         shutdown_all();          shutdown_all();
 }  }
 #endif  #endif
   
 free_iofp(s)  void free_iofp(int s)
 int s;  
 {  {
         struct IOFP *r;          struct IOFP *r;
   
         r = &iofp[s];          r = &iofp[s];
         r->in = r->out = 0; r->s = 0;  #if defined(VISUAL)
 #if !defined(VISUAL)          if ( r->s ) close(r->s);
         if ( r->socket )  #elif !MPI
                 unlink(r->socket);          if ( r->in ) fclose(r->in);
           if ( r->out ) fclose(r->out);
           if ( r->socket ) unlink(r->socket);
 #endif  #endif
           r->in = r->out = 0; r->s = 0;
 }  }
   
 #define LBUFSIZ BUFSIZ*10  int get_iofp(int s1,char *af_sock,int is_server)
   
 int get_iofp(s1,af_sock,is_server)  
 int s1;  
 char *af_sock;  
 int is_server;  
 {  {
         int i;          int i;
         unsigned char c,rc;          unsigned char c,rc;
Line 362  int is_server;
Line 353  int is_server;
 #else  #else
         iofp[i].in = fdopen(s1,"r");          iofp[i].in = fdopen(s1,"r");
         iofp[i].out = fdopen(s1,"w");          iofp[i].out = fdopen(s1,"w");
   #if !defined(__CYGWIN__)
         setbuffer(iofp[i].in,(char *)malloc(LBUFSIZ),LBUFSIZ);          setbuffer(iofp[i].in,(char *)malloc(LBUFSIZ),LBUFSIZ);
         setbuffer(iofp[i].out,(char *)malloc(LBUFSIZ),LBUFSIZ);          setbuffer(iofp[i].out,(char *)malloc(LBUFSIZ),LBUFSIZ);
 #endif  #endif
   #endif
         if ( little_endian )          if ( little_endian )
                 c = 1;                  c = 1;
         else          else
                 c = 0xff;                  c = 0xff;
         if ( is_server ) {          if ( is_server ) {
                 /* server : write -> read */                  /* server : write -> read */
                 write_char(iofp[i].out,&c); ox_flush_stream_force(i);                  write_char((FILE *)iofp[i].out,&c); ox_flush_stream_force(i);
                 read_char(iofp[i].in,&rc);                  read_char((FILE *)iofp[i].in,&rc);
         } else {          } else {
                 /* client : read -> write */                  /* client : read -> write */
                 read_char(iofp[i].in,&rc);                  read_char((FILE *)iofp[i].in,&rc);
                 /* special care for a failure of spawing a server */                  /* special care for a failure of spawing a server */
                 if ( rc !=0 && rc != 1 && rc != 0xff )                  if ( rc !=0 && rc != 1 && rc != 0xff )
                         return -1;                          return -1;
                 write_char(iofp[i].out,&c); ox_flush_stream_force(i);                  write_char((FILE *)iofp[i].out,&c); ox_flush_stream_force(i);
         }          }
         iofp[i].conv = c == rc ? 0 : 1;          iofp[i].conv = c == rc ? 0 : 1;
         if ( af_sock && af_sock[0] ) {          if ( af_sock && af_sock[0] ) {
Line 408  void init_socket()
Line 401  void init_socket()
 }  }
 #endif  #endif
   
 get_fd(index)  int get_fd(int index)
 int index;  
 {  {
         return iofp[index].s;          return iofp[index].s;
 }  }
   
 get_index(fd)  int get_index(int fd)
 int fd;  
 {  {
         int i;          int i;
   
Line 424  int fd;
Line 415  int fd;
                         return i;                          return i;
         return -1;          return -1;
 }  }
   
 #endif /* INET */  
   

Legend:
Removed from v.1.9.2.1  
changed lines
  Added in v.1.19

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