[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.1.1.1 and 1.9.2.2

version 1.1.1.1, 1999/12/03 07:39:11 version 1.9.2.2, 2000/11/08 08:31:55
Line 1 
Line 1 
 /* $OpenXM: OpenXM/src/asir99/io/sio.c,v 1.3 1999/11/18 09:00:38 noro Exp $ */  /*
    * Copyright (c) 1994-2000 FUJITSU LABORATORIES LIMITED
    * All rights reserved.
    *
    * FUJITSU LABORATORIES LIMITED ("FLL") hereby grants you a limited,
    * non-exclusive and royalty-free license to use, copy, modify and
    * redistribute, solely for non-commercial and non-profit purposes, the
    * computer program, "Risa/Asir" ("SOFTWARE"), subject to the terms and
    * conditions of this Agreement. For the avoidance of doubt, you acquire
    * only a limited right to use the SOFTWARE hereunder, and FLL or any
    * third party developer retains all rights, including but not limited to
    * copyrights, in and to the SOFTWARE.
    *
    * (1) FLL does not grant you a license in any way for commercial
    * purposes. You may use the SOFTWARE only for non-commercial and
    * non-profit purposes only, such as academic, research and internal
    * business use.
    * (2) The SOFTWARE is protected by the Copyright Law of Japan and
    * international copyright treaties. If you make copies of the SOFTWARE,
    * with or without modification, as permitted hereunder, you shall affix
    * to all such copies of the SOFTWARE the above copyright notice.
    * (3) An explicit reference to this SOFTWARE and its copyright owner
    * shall be made on your publication or presentation in any form of the
    * results obtained by use of the SOFTWARE.
    * (4) In the event that you modify the SOFTWARE, you shall notify FLL by
    * e-mail at risa-admin@sec.flab.fujitsu.co.jp of the detailed specification
    * for such modification or the source code of the modified part of the
    * SOFTWARE.
    *
    * THE SOFTWARE IS PROVIDED AS IS WITHOUT ANY WARRANTY OF ANY KIND. FLL
    * MAKES ABSOLUTELY NO WARRANTIES, EXPRESSED, IMPLIED OR STATUTORY, AND
    * EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS
    * FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT OF THIRD PARTIES'
    * RIGHTS. NO FLL DEALER, AGENT, EMPLOYEES IS AUTHORIZED TO MAKE ANY
    * MODIFICATIONS, EXTENSIONS, OR ADDITIONS TO THIS WARRANTY.
    * UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, TORT, CONTRACT,
    * OR OTHERWISE, SHALL FLL BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY
    * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL
    * DAMAGES OF ANY CHARACTER, INCLUDING, WITHOUT LIMITATION, DAMAGES
    * ARISING OUT OF OR RELATING TO THE SOFTWARE OR THIS AGREEMENT, DAMAGES
    * FOR LOSS OF GOODWILL, WORK STOPPAGE, OR LOSS OF DATA, OR FOR ANY
    * DAMAGES, EVEN IF FLL SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF
    * SUCH DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY. EVEN IF A PART
    * OF THE SOFTWARE HAS BEEN DEVELOPED BY A THIRD PARTY, THE THIRD PARTY
    * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,
    * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.
    * $OpenXM: OpenXM_contrib2/asir2000/io/sio.c,v 1.9.2.1 2000/11/08 08:18:14 maekawa Exp $
   */
 #if INET  #if INET
 #include "ca.h"  #include "ca.h"
   #include "setjmp.h"
 #include "ox.h"  #include "ox.h"
 #if defined(VISUAL)  #if defined(VISUAL)
 #include <winsock.h>  #include <winsock.h>
Line 17 
Line 65 
   
 extern int little_endian;  extern int little_endian;
   
   int I_am_server;
 struct IOFP iofp[MAXIOFP];  struct IOFP iofp[MAXIOFP];
   
 #if !defined(_PA_RISC1_1)  #if !defined(_PA_RISC1_1)
Line 37  void getremotename(s,name)
Line 86  void getremotename(s,name)
 int s;  int s;
 char *name;  char *name;
 {  {
         struct sockaddr_in peer;          union {
         struct hostent *hp;                  struct sockaddr sa;
         int peerlen;                  char data[SOCK_MAXADDRLEN];
           } dummy;
           struct sockaddr *sa;
           socklen_t len;
           char host[NI_MAXHOST];
           int rs;
   
         peerlen = sizeof(peer);          rs = getremotesocket(s);
         getpeername(getremotesocket(s),(struct sockaddr *)&peer,&peerlen);          len = SOCK_MAXADDRLEN;
         hp = gethostbyaddr((char *)&peer.sin_addr,sizeof(struct in_addr),AF_INET);          getpeername(rs, (struct sockaddr *)dummy.data, &len);
         if ( hp )          sa = &(dummy.sa);
                 strcpy(name,hp->h_name);          getnameinfo(sa, sa->sa_len, host, sizeof(host), NULL, 0, 0);
         else          strcpy(name, host);
                 strcpy(name,(char *)inet_ntoa(peer.sin_addr));  
 }  }
   
 int generate_port(use_unix,port_str)  int generate_port(use_unix,port_str)
Line 59  char *port_str;
Line 112  char *port_str;
         unsigned int port;          unsigned int port;
         static int count=0;          static int count=0;
   
   #if !defined(VISUAL)
         if ( use_unix ) {          if ( use_unix ) {
                 sprintf(port_str,"/tmp/ox%02x.XXXXXX",count);                  sprintf(port_str,"/tmp/ox%02x.XXXXXX",count);
                 count++;                  count++;
                 mktemp(port_str);                  mktemp(port_str);
         } else {          } else
   #endif
           {
                 port = ((unsigned int)mt_genrand()+(unsigned int)get_current_time())                  port = ((unsigned int)mt_genrand()+(unsigned int)get_current_time())
                         %(65536-1024)+1024;                          %(65536-1024)+1024;
                 sprintf(port_str,"%d",port);                  sprintf(port_str,"%d",port);
Line 74  int try_bind_listen(use_unix,port_str)
Line 130  int try_bind_listen(use_unix,port_str)
 int use_unix;  int use_unix;
 char *port_str;  char *port_str;
 {  {
         struct sockaddr_in sin;          struct addrinfo hints, *res, *ai;
         struct sockaddr_un s_un;          int s, error;
         struct sockaddr *saddr;          char *errstr;
         int len;  
         int service;  
   
         if ( use_unix ) {          memset(&hints, 0, sizeof(hints));
                 service = socket(AF_UNIX, SOCK_STREAM, 0);  #if defined(VISUAL)
                 if (service < 0) {          hints.ai_family = PF_UNSPEC;
                         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
                 len = strlen(s_un.sun_path)+sizeof(s_un.sun_family);          if (use_unix)
 #endif                  hints.ai_family = PF_UNIX;
                 saddr = (struct sockaddr *)&s_un;          else
         } else {                  hints.ai_family = PF_UNSPEC;
                 service = socket(AF_INET, SOCK_STREAM, 0);  #endif /* VISUAL */
                 if ( service < 0 ) {          hints.ai_socktype = SOCK_STREAM;
                         perror("in socket");  
                         return -1;          error = getaddrinfo(NULL, port_str, &hints, &res);
           if (error) {
                   warnx("try_bind_listen(): %s", gai_strerror(error));
                   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;  
                 sin.sin_port = htons(atoi(port_str));                  if (bind(s, ai->ai_addr, ai->ai_addrlen) < 0) {
                 len = sizeof(sin);                          errstr = "in bind";
                 saddr = (struct sockaddr *)&sin;                          close(s);
                           s = -1;
                           continue;
                   }
   
                   if (listen(s, SOCKQUEUELENGTH) < 0) {
                           errstr = "in listen";
                           close(s);
                           s = -1;
                           continue;
                   }
   
                   /* established connection */
                   break;
         }          }
         if (bind(service, saddr, len) < 0) {          freeaddrinfo(res);
                 perror("in bind");  
                 close(service);          if (s < 0)
                 return -1;                  perror(errstr);
         }          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 138  char *port_str;
Line 195  char *port_str;
   the original socket is always closed.    the original socket is always closed.
 */  */
   
 int try_accept(af_unix,s)  int try_accept(s)
 int af_unix,s;  int s;
 {  {
         int len,c,i;          union {
         struct sockaddr_un s_un;                  struct sockaddr sa;
         struct sockaddr_in sin;                  char data[SOCK_MAXADDRLEN];
           } dummy;
           socklen_t len;
           int c, i;
   
         if ( af_unix ) {          len = SOCK_MAXADDRLEN;
                 len = sizeof(s_un);          if (getsockname(s, (struct sockaddr *)dummy.data, &len) < 0) {
                 for ( c = -1, i = 0; (c < 0)&&(i = 10) ; i++ )                  close(s);
                         c = accept(s, (struct sockaddr *) &s_un, &len);                  return (-1)
         } else {          }
   
                 len = sizeof(sin);          for (i = 0 ; i < 10 ; i++) {
                 for ( c = -1, i = 0; (c < 0)&&(i = 10) ; i++ )                  c = accept(s, &(dummy.sa), &len);
                         c = accept(s, (struct sockaddr *) &sin, &len);                  if (c >= 0) {
                           close(s);
                           return (c);
                   }
         }          }
         if ( i == 10 )  
                 c = -1;  
         close(s);          close(s);
         return c;          return (-1);
 }  }
   
 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 sockaddr_in sin;          struct addrinfo hints, *res, *ai;
         struct sockaddr_un s_un;          int s, error, i;
         struct sockaddr *saddr;          char *errstr;
         struct hostent *hp;  
         int len,s,i;  
   
         for ( i = 0; i < 10; i++ ) {          memset(&hints, 0, sizeof(hints));
                 if ( use_unix ) {  #if defined(VISUAL)
                         if ( (s = socket(AF_UNIX,SOCK_STREAM,0)) < 0 ) {          hints.ai_family = PF_UNSPEC;
                                 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
                         len = strlen(s_un.sun_path)+sizeof(s_un.sun_family);          if (use_unix)
 #endif                  hints.ai_family = PF_UNIX;
                         saddr = (struct sockaddr *)&s_un;          else
                 } else {                  hints.ai_family = PF_UNSPEC;
                         if ( (s = socket(AF_INET,SOCK_STREAM,0)) < 0 ) {  #endif /* VISUAL */
                                 perror("socket");          hints.ai_socktype = SOCK_STREAM;
                                 return -1;  
           error = getaddrinfo(host, port_str, &hints, &res);
           if (error) {
                   warnx("try_connect: %s", gai_strerror(error));
                   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;
                         }                          }
                         bzero(&sin,sizeof(sin));                          if (connect(s, ai->ai_addr, ai->ai_addrlen) < 0) {
                         sin.sin_port = htons(atoi(port_str));                                  errstr = "connect";
                         sin.sin_addr.s_addr = inet_addr(host);                                  close(s);
                         if ( sin.sin_addr.s_addr != -1 ) {                                  s = -1;
                                 sin.sin_family = AF_INET;                                  continue;
                         } else {  
                                 hp = gethostbyname(host);  
                                 bcopy(hp->h_addr,&sin.sin_addr,hp->h_length);  
                                 sin.sin_family = hp->h_addrtype;  
                         }                          }
                         len = sizeof(sin);  
                         saddr = (struct sockaddr *)&sin;                          /* established a connection */
                 }  
                 if ( connect(s,saddr,len) >= 0 )  
                         break;                          break;
                 else {  
                         close(s);  
                         usleep(100000);  
                 }                  }
   
                   if (s >= 0) {
                           freeaddrinfo(res);
                           return (s);
                   }
   
   #if defined(VISUAL)
                   Sleep(100);
   #else
                   usleep(100000);
   #endif
         }          }
         if ( i == 10 ) {          freeaddrinfo(res);
                 perror("connect");  
                 return -1;          perror(errstr);
         } else          return (-1);
                 return s;  
 }  }
   
   #if 0
 close_allconnections()  close_allconnections()
 {  {
         int s;          int s;
Line 242  int s;
Line 306  int s;
                 free_iofp(s);                  free_iofp(s);
         }          }
 }  }
   #else
   close_allconnections()
   {
           shutdown_all();
   }
   #endif
   
 free_iofp(s)  free_iofp(s)
 int s;  int s;
Line 265  int is_server;
Line 335  int is_server;
 {  {
         int i;          int i;
         unsigned char c,rc;          unsigned char c,rc;
           extern int mpi_myid;
   
   #if MPI
           iofp[s1].s = s1;
           if ( mpi_myid == s1 ) {
                   iofp[s1].in = 0;
                   iofp[s1].out = 0;
           } else {
                   iofp[s1].in = WSIO_open(s1,"r");
                   iofp[s1].out = WSIO_open(s1,"w");
           }
           iofp[s1].conv = 0;
           iofp[s1].socket = 0;
   
           return s1;
   #else
         for ( i = 0; i < MAXIOFP; i++ )          for ( i = 0; i < MAXIOFP; i++ )
                 if ( !iofp[i].in )                  if ( !iofp[i].in )
                         break;                          break;
         iofp[i].s = s1;          iofp[i].s = s1;
 #if defined(VISUAL) || MPI  #if defined(VISUAL)
         iofp[i].in = WSIO_open(s1,"r");          iofp[i].in = WSIO_open(s1,"r");
         iofp[i].out = WSIO_open(s1,"w");          iofp[i].out = WSIO_open(s1,"w");
 #else  #else
Line 279  int is_server;
Line 364  int is_server;
         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
 #if MPI  
         iofp[i].conv = 0;  
         iofp[i].socket = 0;  
 #else  
         if ( little_endian )          if ( little_endian )
                 c = 1;                  c = 1;
         else          else
Line 294  int is_server;
Line 375  int is_server;
         } else {          } else {
                 /* client : read -> write */                  /* client : read -> write */
                 read_char(iofp[i].in,&rc);                  read_char(iofp[i].in,&rc);
                   /* special care for a failure of spawing a server */
                   if ( rc !=0 && rc != 1 && rc != 0xff )
                           return -1;
                 write_char(iofp[i].out,&c); ox_flush_stream_force(i);                  write_char(iofp[i].out,&c); ox_flush_stream_force(i);
         }          }
         iofp[i].conv = c == rc ? 0 : 1;          iofp[i].conv = c == rc ? 0 : 1;
Line 302  int is_server;
Line 386  int is_server;
                 strcpy(iofp[i].socket,af_sock);                  strcpy(iofp[i].socket,af_sock);
         } else          } else
                 iofp[i].socket = 0;                  iofp[i].socket = 0;
 #endif  
         return i;          return i;
   #endif
 }  }
   
 #if defined(VISUAL)  #if defined(VISUAL)
Line 339  int fd;
Line 423  int fd;
                         return i;                          return i;
         return -1;          return -1;
 }  }
   
 #endif /* INET */  #endif /* INET */
   

Legend:
Removed from v.1.1.1.1  
changed lines
  Added in v.1.9.2.2

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