Annotation of OpenXM_contrib2/asir2018/io/tcpf_win_mini.c, Revision 1.1
1.1 ! noro 1: /* $OpenXM$ */
! 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);
! 15: void win_get_rootdir();
! 16: int win_pop_string(Obj *);
! 17: void free_obj(Obj obj);
! 18: extern int terminate;
! 19: static char rootdir[BUFSIZ];
! 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];
! 26: static int launched=0;
! 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:
! 63: void win_spawn_server(char *control_port_str,char *server_port_str)
! 64: {
! 65: char AsirExe[BUFSIZ];
! 66: char AsirExePath[BUFSIZ];
! 67: char *av[BUFSIZ];
! 68:
! 69: // strcpy(rootdir,"c:\\program files\\asir");
! 70: // sprintf(AsirExe,"%s\\bin\\engine.exe",rootdir);
! 71: sprintf(AsirExe,"c:\\Program Files\\asir\\bin\\engine.exe",rootdir);
! 72: sprintf(AsirExePath,"\"%s\"",AsirExe);
! 73: av[0] = "ox_launch";
! 74: av[1] = "127.0.0.1";
! 75: av[2] = "0";
! 76: av[3] = control_port_str;
! 77: av[4] = server_port_str;
! 78: av[5] = "ox_asir_wfep";
! 79: av[6] = "1";
! 80: av[7] = AsirExePath;
! 81: av[8] = 0;
! 82:
! 83: _spawnv(_P_NOWAIT,AsirExe,av);
! 84: }
! 85:
! 86: void win_get_rootdir()
! 87: {
! 88: char *slash;
! 89:
! 90: GetModuleFileName(NULL,rootdir,BUFSIZ);
! 91: slash = strrchr(rootdir,'\\');
! 92: *slash = 0;
! 93: slash = strrchr(rootdir,'\\');
! 94: if ( slash ) *slash = 0;
! 95: }
! 96:
! 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)
! 121: {
! 122: int id,serial;
! 123:
! 124: serial = ox_recv(server_port,&id,obj);
! 125: if ( serial < 0 ) return -1;
! 126:
! 127: if ( id == OX_DATA ) {
! 128: return 1;
! 129: } else if ( id == OX_SYNC_BALL ) {
! 130: ox_send_sync(server_port);
! 131: ox_flush_stream_force(server_port);
! 132: return 0;
! 133: } else return 0;
! 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:
! 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>