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

Annotation of OpenXM_contrib2/asir2000/io/tcpf_win_mini.c, Revision 1.3

1.3     ! noro        1: /* $OpenXM: OpenXM_contrib2/asir2000/io/tcpf_win_mini.c,v 1.2 2006/09/26 05:50:31 noro Exp $ */
1.1       noro        2:
                      3: #include "ca.h"
                      4: #include "parse.h"
                      5: #include "com.h"
                      6: #include <signal.h>
                      7: #include <string.h>
                      8: #include "ox.h"
                      9: #include <stdlib.h>
                     10: #include <winsock2.h>
                     11: #include <process.h>
                     12: static int control_port,server_port;
                     13: int win_ox_launch();
                     14: void win_spawn_server(char *control_port_str,char *server_port_str);
1.3     ! noro       15: void win_get_rootdir();
        !            16: int win_pop_string(Obj *);
        !            17: void free_obj(Obj obj);
1.1       noro       18: extern int terminate;
1.3     ! noro       19: static char rootdir[BUFSIZ];
1.1       noro       20:
                     21: int win_ox_launch()
                     22: {
                     23:        int cs,ss,cn,sn;
                     24:        char control_port_str[BUFSIZ];
                     25:        char server_port_str[BUFSIZ];
1.3     ! noro       26:        static int launched=0;
1.1       noro       27:
                     28:        if ( launched ) return 0;
                     29:
                     30:        control_port_str[0] = 0;
                     31:        server_port_str[0] = 0;
                     32:        do {
                     33:                generate_port(0,control_port_str);
                     34:                generate_port(0,server_port_str);
                     35:                cs = try_bind_listen(0,control_port_str);
                     36:                if ( cs < 0 ) continue;
                     37:                ss = try_bind_listen(0,server_port_str);
                     38:                if ( ss < 0 ) continue;
                     39:                win_spawn_server(control_port_str,server_port_str);
                     40:                cs = try_accept(0,cs);
                     41:                if ( cs < 0 ) continue;
                     42:                ss = try_accept(0,ss);
                     43:                if ( ss < 0 ) continue;
                     44:        } while ( cs < 0 || ss < 0 );
                     45:
                     46:        /* client mode */
                     47:        cn = get_iofp(cs,control_port_str,0);
                     48:        sn = get_iofp(ss,server_port_str,0);
                     49:        /* get_iofp returns -1 if the laucher could not spawn the server */
                     50:        if ( sn < 0 ) {
                     51:                /* we should terminate the launcher */
                     52:                ox_send_cmd(cn,SM_shutdown); ox_flush_stream_force(cn);
                     53:                return -1;
                     54:        }
                     55:
                     56:        /* register server to the server list */
                     57:        control_port = cn;
                     58:        server_port = sn;
                     59:        launched = 1;
                     60:        return 0;
                     61: }
                     62:
1.3     ! noro       63: void win_get_rootdir();
1.2       noro       64:
1.1       noro       65: void win_spawn_server(char *control_port_str,char *server_port_str)
                     66: {
                     67:        char AsirExe[BUFSIZ];
                     68:        char AsirExePath[BUFSIZ];
                     69:        char *av[BUFSIZ];
                     70:
1.2       noro       71: //     strcpy(rootdir,"c:\\program files\\asir");
1.3     ! noro       72: //     sprintf(AsirExe,"%s\\bin\\engine.exe",rootdir);
        !            73:        sprintf(AsirExe,"c:\\Program Files\\asir\\bin\\engine.exe",rootdir);
1.1       noro       74:        sprintf(AsirExePath,"\"%s\"",AsirExe);
                     75:        av[0] = "ox_launch";
                     76:        av[1] = "127.0.0.1";
                     77:        av[2] = "0";
                     78:        av[3] = control_port_str;
                     79:        av[4] = server_port_str;
                     80:        av[5] = "ox_asir_wfep";
                     81:        av[6] = "1";
                     82:        av[7] = AsirExePath;
                     83:        av[8] = 0;
                     84:
                     85:        _spawnv(_P_NOWAIT,AsirExe,av);
                     86: }
                     87:
1.3     ! noro       88: void win_get_rootdir()
1.2       noro       89: {
                     90:        char *slash;
                     91:
1.3     ! noro       92:        GetCurrentDirectory(BUFSIZ,rootdir);
        !            93:        slash = strrchr(rootdir,'\\');
1.2       noro       94:        if ( slash ) *slash = 0;
                     95: }
                     96:
1.3     ! noro       97: // ret=1 : data, ret=0 : void, ret=-1 : terminate
        !            98:
        !            99: int win_pop_string(Obj *obj)
        !           100: {
        !           101:        int id,serial;
        !           102:
        !           103:        serial = ox_recv(server_port,&id,obj);
        !           104:        if ( serial < 0 ) return -1;
        !           105:
        !           106:        if ( id == OX_DATA )
        !           107:                return 1;
        !           108:        else {
        !           109:                if ( id == OX_SYNC_BALL ) {
        !           110:                        ox_send_sync(server_port);
        !           111:                        ox_flush_stream_force(server_port);
        !           112:                }
        !           113:                *obj = 0;
        !           114:                return 0;
        !           115:        }
        !           116: }
        !           117:
        !           118: /* ret=1 => data, ret=0 => void, ret=-1 => terminated */
        !           119:
        !           120: int win_pop_one(Obj *obj)
1.1       noro      121: {
                    122:        int id,serial;
                    123:
1.3     ! noro      124:        serial = ox_recv(server_port,&id,obj);
        !           125:        if ( serial < 0 ) return -1;
1.1       noro      126:
                    127:        if ( id == OX_DATA ) {
1.3     ! noro      128:                return 1;
1.1       noro      129:        } else if ( id == OX_SYNC_BALL ) {
                    130:                ox_send_sync(server_port);
                    131:                ox_flush_stream_force(server_port);
1.3     ! noro      132:                return 0;
        !           133:        } else return 0;
1.1       noro      134: }
                    135:
                    136: void win_execute_string(char *cmd)
                    137: {
                    138:        struct oSTRING str;
                    139:
                    140:        OID(&str) = O_STR;
                    141:        BDY(&str) = cmd;
                    142:        ox_send_data(server_port,&str);
                    143:        ox_send_cmd(server_port,SM_executeStringByLocalParser);
                    144:        ox_send_cmd(server_port,SM_popString);
                    145:        ox_flush_stream_force(server_port);
                    146: }
                    147:
                    148: void ox_reset()
                    149: {
                    150:        USINT t;
                    151:        int id;
                    152:        Obj obj;
                    153:
                    154:        ox_send_cmd(control_port,SM_control_reset_connection);
                    155:        ox_flush_stream_force(control_port);
                    156:        ox_recv(control_port,&id,&obj); t = (USINT)obj;
                    157:        Sleep(100);
                    158:        ox_send_cmd(server_port,SM_nop);
                    159:        ox_flush_stream_force(server_port);
                    160: }
                    161:
                    162: void ox_shutdown()
                    163: {
                    164:        terminate = 1;
                    165:        ox_send_cmd(server_port,SM_shutdown);
                    166:        Sleep(100);
                    167:        ox_send_cmd(control_port,SM_shutdown);
                    168: }
                    169:
1.3     ! noro      170: void free_obj(Obj obj)
        !           171: {
        !           172:        NODE n,n1;
        !           173:
        !           174:        if ( !obj ) return;
        !           175:        switch ( OID(obj) ) {
        !           176:                case O_USINT:
        !           177:                        break;
        !           178:                case O_STR:
        !           179:                        free(BDY((STRING)obj));
        !           180:                        break;
        !           181:                case O_LIST:
        !           182:                        n = BDY((LIST)obj);
        !           183:                        while ( n ) {
        !           184:                                free_obj(BDY(n));
        !           185:                                n1 = NEXT(n);
        !           186:                                free(n);
        !           187:                                n = n1;
        !           188:                        }
        !           189:                        break;
        !           190:                case O_ERR:
        !           191:                        free_obj(BDY((LIST)obj));
        !           192:                        break;
        !           193:                default:
        !           194:                        break;
        !           195:        }
        !           196:        free(obj);
        !           197: }
        !           198:

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