version 1.4, 2013/08/20 14:22:33 |
version 1.5, 2018/03/29 01:32:54 |
|
|
/* $OpenXM: OpenXM_contrib2/asir2000/io/tcpf_win_mini.c,v 1.3 2006/09/29 09:02:49 noro Exp $ */ |
/* $OpenXM: OpenXM_contrib2/asir2000/io/tcpf_win_mini.c,v 1.4 2013/08/20 14:22:33 ohara Exp $ */ |
|
|
#include "ca.h" |
#include "ca.h" |
#include "parse.h" |
#include "parse.h" |
Line 20 static char rootdir[BUFSIZ]; |
|
Line 20 static char rootdir[BUFSIZ]; |
|
|
|
int win_ox_launch() |
int win_ox_launch() |
{ |
{ |
int cs,ss,cn,sn; |
int cs,ss,cn,sn; |
char control_port_str[BUFSIZ]; |
char control_port_str[BUFSIZ]; |
char server_port_str[BUFSIZ]; |
char server_port_str[BUFSIZ]; |
static int launched=0; |
static int launched=0; |
|
|
if ( launched ) return 0; |
if ( launched ) return 0; |
|
|
control_port_str[0] = 0; |
control_port_str[0] = 0; |
server_port_str[0] = 0; |
server_port_str[0] = 0; |
do { |
do { |
generate_port(0,control_port_str); |
generate_port(0,control_port_str); |
generate_port(0,server_port_str); |
generate_port(0,server_port_str); |
cs = try_bind_listen(0,control_port_str); |
cs = try_bind_listen(0,control_port_str); |
if ( cs < 0 ) continue; |
if ( cs < 0 ) continue; |
ss = try_bind_listen(0,server_port_str); |
ss = try_bind_listen(0,server_port_str); |
if ( ss < 0 ) continue; |
if ( ss < 0 ) continue; |
win_spawn_server(control_port_str,server_port_str); |
win_spawn_server(control_port_str,server_port_str); |
cs = try_accept(0,cs); |
cs = try_accept(0,cs); |
if ( cs < 0 ) continue; |
if ( cs < 0 ) continue; |
ss = try_accept(0,ss); |
ss = try_accept(0,ss); |
if ( ss < 0 ) continue; |
if ( ss < 0 ) continue; |
} while ( cs < 0 || ss < 0 ); |
} while ( cs < 0 || ss < 0 ); |
|
|
/* client mode */ |
/* client mode */ |
cn = get_iofp(cs,control_port_str,0); |
cn = get_iofp(cs,control_port_str,0); |
sn = get_iofp(ss,server_port_str,0); |
sn = get_iofp(ss,server_port_str,0); |
/* get_iofp returns -1 if the laucher could not spawn the server */ |
/* get_iofp returns -1 if the laucher could not spawn the server */ |
if ( sn < 0 ) { |
if ( sn < 0 ) { |
/* we should terminate the launcher */ |
/* we should terminate the launcher */ |
ox_send_cmd(cn,SM_shutdown); ox_flush_stream_force(cn); |
ox_send_cmd(cn,SM_shutdown); ox_flush_stream_force(cn); |
return -1; |
return -1; |
} |
} |
|
|
/* register server to the server list */ |
/* register server to the server list */ |
control_port = cn; |
control_port = cn; |
server_port = sn; |
server_port = sn; |
launched = 1; |
launched = 1; |
return 0; |
return 0; |
} |
} |
|
|
void win_spawn_server(char *control_port_str,char *server_port_str) |
void win_spawn_server(char *control_port_str,char *server_port_str) |
{ |
{ |
char AsirExe[BUFSIZ]; |
char AsirExe[BUFSIZ]; |
char AsirExePath[BUFSIZ]; |
char AsirExePath[BUFSIZ]; |
char *av[BUFSIZ]; |
char *av[BUFSIZ]; |
|
|
// strcpy(rootdir,"c:\\program files\\asir"); |
// strcpy(rootdir,"c:\\program files\\asir"); |
// sprintf(AsirExe,"%s\\bin\\engine.exe",rootdir); |
// sprintf(AsirExe,"%s\\bin\\engine.exe",rootdir); |
sprintf(AsirExe,"c:\\Program Files\\asir\\bin\\engine.exe",rootdir); |
sprintf(AsirExe,"c:\\Program Files\\asir\\bin\\engine.exe",rootdir); |
sprintf(AsirExePath,"\"%s\"",AsirExe); |
sprintf(AsirExePath,"\"%s\"",AsirExe); |
av[0] = "ox_launch"; |
av[0] = "ox_launch"; |
av[1] = "127.0.0.1"; |
av[1] = "127.0.0.1"; |
av[2] = "0"; |
av[2] = "0"; |
av[3] = control_port_str; |
av[3] = control_port_str; |
av[4] = server_port_str; |
av[4] = server_port_str; |
av[5] = "ox_asir_wfep"; |
av[5] = "ox_asir_wfep"; |
av[6] = "1"; |
av[6] = "1"; |
av[7] = AsirExePath; |
av[7] = AsirExePath; |
av[8] = 0; |
av[8] = 0; |
|
|
_spawnv(_P_NOWAIT,AsirExe,av); |
_spawnv(_P_NOWAIT,AsirExe,av); |
} |
} |
|
|
void win_get_rootdir() |
void win_get_rootdir() |
{ |
{ |
char *slash; |
char *slash; |
|
|
GetModuleFileName(NULL,rootdir,BUFSIZ); |
GetModuleFileName(NULL,rootdir,BUFSIZ); |
slash = strrchr(rootdir,'\\'); |
slash = strrchr(rootdir,'\\'); |
*slash = 0; |
*slash = 0; |
slash = strrchr(rootdir,'\\'); |
slash = strrchr(rootdir,'\\'); |
if ( slash ) *slash = 0; |
if ( slash ) *slash = 0; |
} |
} |
|
|
// ret=1 : data, ret=0 : void, ret=-1 : terminate |
// ret=1 : data, ret=0 : void, ret=-1 : terminate |
|
|
int win_pop_string(Obj *obj) |
int win_pop_string(Obj *obj) |
{ |
{ |
int id,serial; |
int id,serial; |
|
|
serial = ox_recv(server_port,&id,obj); |
serial = ox_recv(server_port,&id,obj); |
if ( serial < 0 ) return -1; |
if ( serial < 0 ) return -1; |
|
|
if ( id == OX_DATA ) |
if ( id == OX_DATA ) |
return 1; |
return 1; |
else { |
else { |
if ( id == OX_SYNC_BALL ) { |
if ( id == OX_SYNC_BALL ) { |
ox_send_sync(server_port); |
ox_send_sync(server_port); |
ox_flush_stream_force(server_port); |
ox_flush_stream_force(server_port); |
} |
} |
*obj = 0; |
*obj = 0; |
return 0; |
return 0; |
} |
} |
} |
} |
|
|
/* ret=1 => data, ret=0 => void, ret=-1 => terminated */ |
/* ret=1 => data, ret=0 => void, ret=-1 => terminated */ |
|
|
int win_pop_one(Obj *obj) |
int win_pop_one(Obj *obj) |
{ |
{ |
int id,serial; |
int id,serial; |
|
|
serial = ox_recv(server_port,&id,obj); |
serial = ox_recv(server_port,&id,obj); |
if ( serial < 0 ) return -1; |
if ( serial < 0 ) return -1; |
|
|
if ( id == OX_DATA ) { |
if ( id == OX_DATA ) { |
return 1; |
return 1; |
} else if ( id == OX_SYNC_BALL ) { |
} else if ( id == OX_SYNC_BALL ) { |
ox_send_sync(server_port); |
ox_send_sync(server_port); |
ox_flush_stream_force(server_port); |
ox_flush_stream_force(server_port); |
return 0; |
return 0; |
} else return 0; |
} else return 0; |
} |
} |
|
|
void win_execute_string(char *cmd) |
void win_execute_string(char *cmd) |
{ |
{ |
struct oSTRING str; |
struct oSTRING str; |
|
|
OID(&str) = O_STR; |
OID(&str) = O_STR; |
BDY(&str) = cmd; |
BDY(&str) = cmd; |
ox_send_data(server_port,&str); |
ox_send_data(server_port,&str); |
ox_send_cmd(server_port,SM_executeStringByLocalParser); |
ox_send_cmd(server_port,SM_executeStringByLocalParser); |
ox_send_cmd(server_port,SM_popString); |
ox_send_cmd(server_port,SM_popString); |
ox_flush_stream_force(server_port); |
ox_flush_stream_force(server_port); |
} |
} |
|
|
void ox_reset() |
void ox_reset() |
{ |
{ |
USINT t; |
USINT t; |
int id; |
int id; |
Obj obj; |
Obj obj; |
|
|
ox_send_cmd(control_port,SM_control_reset_connection); |
ox_send_cmd(control_port,SM_control_reset_connection); |
ox_flush_stream_force(control_port); |
ox_flush_stream_force(control_port); |
ox_recv(control_port,&id,&obj); t = (USINT)obj; |
ox_recv(control_port,&id,&obj); t = (USINT)obj; |
Sleep(100); |
Sleep(100); |
ox_send_cmd(server_port,SM_nop); |
ox_send_cmd(server_port,SM_nop); |
ox_flush_stream_force(server_port); |
ox_flush_stream_force(server_port); |
} |
} |
|
|
void ox_shutdown() |
void ox_shutdown() |
{ |
{ |
terminate = 1; |
terminate = 1; |
ox_send_cmd(server_port,SM_shutdown); |
ox_send_cmd(server_port,SM_shutdown); |
Sleep(100); |
Sleep(100); |
ox_send_cmd(control_port,SM_shutdown); |
ox_send_cmd(control_port,SM_shutdown); |
} |
} |
|
|
void free_obj(Obj obj) |
void free_obj(Obj obj) |
{ |
{ |
NODE n,n1; |
NODE n,n1; |
|
|
if ( !obj ) return; |
if ( !obj ) return; |
switch ( OID(obj) ) { |
switch ( OID(obj) ) { |
case O_USINT: |
case O_USINT: |
break; |
break; |
case O_STR: |
case O_STR: |
free(BDY((STRING)obj)); |
free(BDY((STRING)obj)); |
break; |
break; |
case O_LIST: |
case O_LIST: |
n = BDY((LIST)obj); |
n = BDY((LIST)obj); |
while ( n ) { |
while ( n ) { |
free_obj(BDY(n)); |
free_obj(BDY(n)); |
n1 = NEXT(n); |
n1 = NEXT(n); |
free(n); |
free(n); |
n = n1; |
n = n1; |
} |
} |
break; |
break; |
case O_ERR: |
case O_ERR: |
free_obj(BDY((LIST)obj)); |
free_obj(BDY((LIST)obj)); |
break; |
break; |
default: |
default: |
break; |
break; |
} |
} |
free(obj); |
free(obj); |
} |
} |
|
|