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

Annotation of OpenXM_contrib2/asir2000/io/sio.c, Revision 1.1

1.1     ! noro        1: /* $OpenXM: OpenXM/src/asir99/io/sio.c,v 1.3 1999/11/18 09:00:38 noro Exp $ */
        !             2: #if INET
        !             3: #include "ca.h"
        !             4: #include "ox.h"
        !             5: #if defined(VISUAL)
        !             6: #include <winsock.h>
        !             7: #else
        !             8: #include <sys/time.h>
        !             9: #include <sys/uio.h>
        !            10: #include <sys/ioctl.h>
        !            11: #include <sys/un.h>
        !            12: #endif
        !            13: #include<signal.h>
        !            14:
        !            15: #define SOCKQUEUELENGTH 5
        !            16: #define ISIZ sizeof(int)
        !            17:
        !            18: extern int little_endian;
        !            19:
        !            20: struct IOFP iofp[MAXIOFP];
        !            21:
        !            22: #if !defined(_PA_RISC1_1)
        !            23: #define RSH "rsh"
        !            24: #else
        !            25: #define RSH "remsh"
        !            26: #endif
        !            27:
        !            28: void init_socket(void);
        !            29:
        !            30: int getremotesocket(s)
        !            31: int s;
        !            32: {
        !            33:        return iofp[s].s;
        !            34: }
        !            35:
        !            36: void getremotename(s,name)
        !            37: int s;
        !            38: char *name;
        !            39: {
        !            40:        struct sockaddr_in peer;
        !            41:        struct hostent *hp;
        !            42:        int peerlen;
        !            43:
        !            44:        peerlen = sizeof(peer);
        !            45:        getpeername(getremotesocket(s),(struct sockaddr *)&peer,&peerlen);
        !            46:        hp = gethostbyaddr((char *)&peer.sin_addr,sizeof(struct in_addr),AF_INET);
        !            47:        if ( hp )
        !            48:                strcpy(name,hp->h_name);
        !            49:        else
        !            50:                strcpy(name,(char *)inet_ntoa(peer.sin_addr));
        !            51: }
        !            52:
        !            53: int generate_port(use_unix,port_str)
        !            54: int use_unix;
        !            55: char *port_str;
        !            56: {
        !            57:        double get_current_time();
        !            58:        unsigned long mt_genrand();
        !            59:        unsigned int port;
        !            60:        static int count=0;
        !            61:
        !            62:        if ( use_unix ) {
        !            63:                sprintf(port_str,"/tmp/ox%02x.XXXXXX",count);
        !            64:                count++;
        !            65:                mktemp(port_str);
        !            66:        } else {
        !            67:                port = ((unsigned int)mt_genrand()+(unsigned int)get_current_time())
        !            68:                        %(65536-1024)+1024;
        !            69:                sprintf(port_str,"%d",port);
        !            70:        }
        !            71: }
        !            72:
        !            73: int try_bind_listen(use_unix,port_str)
        !            74: int use_unix;
        !            75: char *port_str;
        !            76: {
        !            77:        struct sockaddr_in sin;
        !            78:        struct sockaddr_un s_un;
        !            79:        struct sockaddr *saddr;
        !            80:        int len;
        !            81:        int service;
        !            82:
        !            83:        if ( use_unix ) {
        !            84:                service = socket(AF_UNIX, SOCK_STREAM, 0);
        !            85:                if (service < 0) {
        !            86:                        perror("in socket");
        !            87:                        return -1;
        !            88:                }
        !            89:                s_un.sun_family = AF_UNIX;
        !            90:                strcpy(s_un.sun_path,port_str);
        !            91: #if defined(__FreeBSD__)
        !            92:                len = SUN_LEN(&s_un);
        !            93:                s_un.sun_len = len+1; /* XXX */
        !            94: #else
        !            95:                len = strlen(s_un.sun_path)+sizeof(s_un.sun_family);
        !            96: #endif
        !            97:                saddr = (struct sockaddr *)&s_un;
        !            98:        } else {
        !            99:                service = socket(AF_INET, SOCK_STREAM, 0);
        !           100:                if ( service < 0 ) {
        !           101:                        perror("in socket");
        !           102:                        return -1;
        !           103:                }
        !           104:                sin.sin_family = AF_INET; sin.sin_addr.s_addr = INADDR_ANY;
        !           105:                sin.sin_port = htons(atoi(port_str));
        !           106:                len = sizeof(sin);
        !           107:                saddr = (struct sockaddr *)&sin;
        !           108:        }
        !           109:        if (bind(service, saddr, len) < 0) {
        !           110:                perror("in bind");
        !           111:                close(service);
        !           112:                return -1;
        !           113:        }
        !           114:        if (getsockname(service,saddr, &len) < 0) {
        !           115:            perror("in getsockname");
        !           116:            close(service);
        !           117:            return -1;
        !           118:        }
        !           119:        if (listen(service, SOCKQUEUELENGTH) < 0) {
        !           120:                perror("in listen");
        !           121:                close(service);
        !           122:                return -1;
        !           123:        }
        !           124:        return service;
        !           125: }
        !           126:
        !           127: /*
        !           128:   try to accept a connection request
        !           129:
        !           130:   Input
        !           131:     af_unix: s is UNIX domain socket if af_unix is nonzero
        !           132:     s: socket
        !           133:
        !           134:   Output
        !           135:     c: an accepted socket which is newly created
        !           136:     -1: if failed to accept
        !           137:
        !           138:   the original socket is always closed.
        !           139: */
        !           140:
        !           141: int try_accept(af_unix,s)
        !           142: int af_unix,s;
        !           143: {
        !           144:        int len,c,i;
        !           145:        struct sockaddr_un s_un;
        !           146:        struct sockaddr_in sin;
        !           147:
        !           148:        if ( af_unix ) {
        !           149:                len = sizeof(s_un);
        !           150:                for ( c = -1, i = 0; (c < 0)&&(i = 10) ; i++ )
        !           151:                        c = accept(s, (struct sockaddr *) &s_un, &len);
        !           152:        } else {
        !           153:
        !           154:                len = sizeof(sin);
        !           155:                for ( c = -1, i = 0; (c < 0)&&(i = 10) ; i++ )
        !           156:                        c = accept(s, (struct sockaddr *) &sin, &len);
        !           157:        }
        !           158:        if ( i == 10 )
        !           159:                c = -1;
        !           160:        close(s);
        !           161:        return c;
        !           162: }
        !           163:
        !           164: int try_connect(use_unix,host,port_str)
        !           165: int use_unix;
        !           166: char *host,*port_str;
        !           167: {
        !           168:        struct sockaddr_in sin;
        !           169:        struct sockaddr_un s_un;
        !           170:        struct sockaddr *saddr;
        !           171:        struct hostent *hp;
        !           172:        int len,s,i;
        !           173:
        !           174:        for ( i = 0; i < 10; i++ ) {
        !           175:                if ( use_unix ) {
        !           176:                        if ( (s = socket(AF_UNIX,SOCK_STREAM,0)) < 0 ) {
        !           177:                                perror("socket");
        !           178:                                return -1;
        !           179:                        }
        !           180:                        bzero(&s_un,sizeof(s_un));
        !           181:                        s_un.sun_family = AF_UNIX;
        !           182:                        strcpy(s_un.sun_path,port_str);
        !           183: #if defined(__FreeBSD__)
        !           184:                        len = SUN_LEN(&s_un);
        !           185:                        s_un.sun_len = len+1; /* XXX */
        !           186: #else
        !           187:                        len = strlen(s_un.sun_path)+sizeof(s_un.sun_family);
        !           188: #endif
        !           189:                        saddr = (struct sockaddr *)&s_un;
        !           190:                } else {
        !           191:                        if ( (s = socket(AF_INET,SOCK_STREAM,0)) < 0 ) {
        !           192:                                perror("socket");
        !           193:                                return -1;
        !           194:                        }
        !           195:                        bzero(&sin,sizeof(sin));
        !           196:                        sin.sin_port = htons(atoi(port_str));
        !           197:                        sin.sin_addr.s_addr = inet_addr(host);
        !           198:                        if ( sin.sin_addr.s_addr != -1 ) {
        !           199:                                sin.sin_family = AF_INET;
        !           200:                        } else {
        !           201:                                hp = gethostbyname(host);
        !           202:                                bcopy(hp->h_addr,&sin.sin_addr,hp->h_length);
        !           203:                                sin.sin_family = hp->h_addrtype;
        !           204:                        }
        !           205:                        len = sizeof(sin);
        !           206:                        saddr = (struct sockaddr *)&sin;
        !           207:                }
        !           208:                if ( connect(s,saddr,len) >= 0 )
        !           209:                        break;
        !           210:                else {
        !           211:                        close(s);
        !           212:                        usleep(100000);
        !           213:                }
        !           214:        }
        !           215:        if ( i == 10 ) {
        !           216:                perror("connect");
        !           217:                return -1;
        !           218:        } else
        !           219:                return s;
        !           220: }
        !           221:
        !           222: close_allconnections()
        !           223: {
        !           224:        int s;
        !           225:
        !           226: #if defined(SIGPIPE)
        !           227:        signal(SIGPIPE,SIG_IGN);
        !           228: #endif
        !           229:        for ( s = 0; s < MAXIOFP; s++ )
        !           230:                close_connection(s);
        !           231: }
        !           232:
        !           233: close_connection(s)
        !           234: int s;
        !           235: {
        !           236:        struct IOFP *r;
        !           237:
        !           238:        r = &iofp[s];
        !           239:        if ( r->in && r->out ) {
        !           240:                if ( check_sm_by_mc(s,SM_shutdown) )
        !           241:                        ox_send_cmd(s,SM_shutdown);
        !           242:                free_iofp(s);
        !           243:        }
        !           244: }
        !           245:
        !           246: free_iofp(s)
        !           247: int s;
        !           248: {
        !           249:        struct IOFP *r;
        !           250:
        !           251:        r = &iofp[s];
        !           252:        r->in = r->out = 0; r->s = 0;
        !           253: #if !defined(VISUAL)
        !           254:        if ( r->socket )
        !           255:                unlink(r->socket);
        !           256: #endif
        !           257: }
        !           258:
        !           259: #define LBUFSIZ BUFSIZ*10
        !           260:
        !           261: int get_iofp(s1,af_sock,is_server)
        !           262: int s1;
        !           263: char *af_sock;
        !           264: int is_server;
        !           265: {
        !           266:        int i;
        !           267:        unsigned char c,rc;
        !           268:
        !           269:        for ( i = 0; i < MAXIOFP; i++ )
        !           270:                if ( !iofp[i].in )
        !           271:                        break;
        !           272:        iofp[i].s = s1;
        !           273: #if defined(VISUAL) || MPI
        !           274:        iofp[i].in = WSIO_open(s1,"r");
        !           275:        iofp[i].out = WSIO_open(s1,"w");
        !           276: #else
        !           277:        iofp[i].in = fdopen(s1,"r");
        !           278:        iofp[i].out = fdopen(s1,"w");
        !           279:        setbuffer(iofp[i].in,(char *)malloc(LBUFSIZ),LBUFSIZ);
        !           280:        setbuffer(iofp[i].out,(char *)malloc(LBUFSIZ),LBUFSIZ);
        !           281: #endif
        !           282: #if MPI
        !           283:        iofp[i].conv = 0;
        !           284:        iofp[i].socket = 0;
        !           285: #else
        !           286:        if ( little_endian )
        !           287:                c = 1;
        !           288:        else
        !           289:                c = 0xff;
        !           290:        if ( is_server ) {
        !           291:                /* server : write -> read */
        !           292:                write_char(iofp[i].out,&c); ox_flush_stream_force(i);
        !           293:                read_char(iofp[i].in,&rc);
        !           294:        } else {
        !           295:                /* client : read -> write */
        !           296:                read_char(iofp[i].in,&rc);
        !           297:                write_char(iofp[i].out,&c); ox_flush_stream_force(i);
        !           298:        }
        !           299:        iofp[i].conv = c == rc ? 0 : 1;
        !           300:        if ( af_sock && af_sock[0] ) {
        !           301:                iofp[i].socket = (char *)malloc(strlen(af_sock)+1);
        !           302:                strcpy(iofp[i].socket,af_sock);
        !           303:        } else
        !           304:                iofp[i].socket = 0;
        !           305: #endif
        !           306:        return i;
        !           307: }
        !           308:
        !           309: #if defined(VISUAL)
        !           310: void init_socket()
        !           311: {
        !           312:        static int socket_is_initialized;
        !           313:        WORD wVersionRequested;
        !           314:        WSADATA wsaData;
        !           315:        int err;
        !           316:        wVersionRequested = MAKEWORD(2,0);
        !           317:
        !           318:        if ( socket_is_initialized )
        !           319:                return;
        !           320:        err = WSAStartup(wVersionRequested,&wsaData);
        !           321:        if ( err )
        !           322:                return;
        !           323: }
        !           324: #endif
        !           325:
        !           326: get_fd(index)
        !           327: int index;
        !           328: {
        !           329:        return iofp[index].s;
        !           330: }
        !           331:
        !           332: get_index(fd)
        !           333: int fd;
        !           334: {
        !           335:        int i;
        !           336:
        !           337:        for ( i = 0; i < MAXIOFP; i++ )
        !           338:                if ( iofp[i].s == fd )
        !           339:                        return i;
        !           340:        return -1;
        !           341: }
        !           342: #endif /* INET */

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