version 1.8, 2000/07/13 05:09:03 |
version 1.16.2.1, 2000/11/08 08:31:55 |
|
|
/* $OpenXM: OpenXM_contrib2/asir2000/io/tcpf.c,v 1.7 2000/03/19 12:35:20 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/tcpf.c,v 1.16 2000/11/07 06:35:39 noro Exp $ |
|
*/ |
#if INET |
#if INET |
#include "ca.h" |
#include "ca.h" |
#include "parse.h" |
#include "parse.h" |
|
|
#include "ox.h" |
#include "ox.h" |
|
|
#if defined(VISUAL) |
#if defined(VISUAL) |
|
#include <stdlib.h> |
#include <winsock.h> |
#include <winsock.h> |
|
#include <process.h> |
#endif |
#endif |
|
|
#define OX_XTERM "ox_xterm" |
#define OX_XTERM "ox_xterm" |
Line 27 static struct m_c { |
|
Line 76 static struct m_c { |
|
} *m_c_tab; |
} *m_c_tab; |
|
|
static int m_c_i,m_c_s; |
static int m_c_i,m_c_s; |
|
int I_am_server; |
|
|
#if MPI |
#if MPI |
extern int mpi_nprocs; |
extern int mpi_nprocs; |
#define valid_mctab_index(ind)\ |
#define valid_mctab_index(ind)\ |
if((ind)<0||(ind)>=mpi_nprocs){error("invalid server id");} |
if((ind)<0||(ind)>=mpi_nprocs){error("invalid server id");} |
|
#define check_valid_mctab_index(ind)\ |
|
if((ind)<0||(ind)>=mpi_nprocs){(ind)=-1;} |
#else |
#else |
#define valid_mctab_index(ind)\ |
#define valid_mctab_index(ind)\ |
if((ind)<0||(ind)>=m_c_i||\ |
if((ind)<0||(ind)>=m_c_i||\ |
((m_c_tab[ind].m<0)&&(m_c_tab[ind].c<0))){error("invalid server id");} |
((m_c_tab[ind].m<0)&&(m_c_tab[ind].c<0))){error("invalid server id");} |
|
#define check_valid_mctab_index(ind)\ |
|
if((ind)<0||(ind)>=m_c_i||\ |
|
((m_c_tab[ind].m<0)&&(m_c_tab[ind].c<0))){(ind)=-1;} |
#endif |
#endif |
|
|
int register_server(); |
int register_server(); |
|
|
} |
} |
|
|
/* |
/* |
try_accept(sock,port) |
try_accept(sock) |
*/ |
*/ |
|
|
void Ptry_accept(arg,rp) |
void Ptry_accept(arg,rp) |
|
|
use_unix = 0; |
use_unix = 0; |
else |
else |
use_unix = 1; |
use_unix = 1; |
s = try_accept(use_unix,QTOS((Q)ARG0(arg))); |
s = try_accept(QTOS((Q)ARG0(arg))); |
STOQ(s,*rp); |
STOQ(s,*rp); |
} |
} |
|
|
|
|
/* client mode */ |
/* client mode */ |
cn = get_iofp(cs,cport_str,0); |
cn = get_iofp(cs,cport_str,0); |
sn = get_iofp(ss,sport_str,0); |
sn = get_iofp(ss,sport_str,0); |
|
/* get_iofp returns -1 if the laucher could not spawn the server */ |
|
if ( sn < 0 ) { |
|
/* we should terminate the launcher */ |
|
ox_send_cmd(cn,SM_shutdown); ox_flush_stream_force(cn); |
|
STOQ(-1,*rp); |
|
return; |
|
} |
|
|
/* register server to the server list */ |
/* register server to the server list */ |
ind = register_server(use_unix,cn,sn); |
ind = register_server(use_unix,cn,sn); |
|
|
cs = try_connect(use_unix,host,control_port_str); |
cs = try_connect(use_unix,host,control_port_str); |
ss = try_connect(use_unix,host,server_port_str); |
ss = try_connect(use_unix,host,server_port_str); |
} else { |
} else { |
cs = try_accept(use_unix,cs); |
cs = try_accept(cs); |
ss = try_accept(use_unix,ss); |
ss = try_accept(ss); |
} |
} |
} 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 */ |
|
if ( sn < 0 ) { |
|
/* we should terminate the launcher */ |
|
ox_send_cmd(cn,SM_shutdown); ox_flush_stream_force(cn); |
|
STOQ(-1,*rp); |
|
return; |
|
} |
|
|
/* register server to the server list */ |
/* register server to the server list */ |
ind = register_server(use_unix,cn,sn); |
ind = register_server(use_unix,cn,sn); |
Line 425 char *control_port_str,*server_port_str; |
|
Line 494 char *control_port_str,*server_port_str; |
|
char cmd[BUFSIZ]; |
char cmd[BUFSIZ]; |
char localhost[BUFSIZ]; |
char localhost[BUFSIZ]; |
char *dname,*conn_str,*rsh; |
char *dname,*conn_str,*rsh; |
|
char dname_str[BUFSIZ]; |
|
char AsirExe[BUFSIZ]; |
|
STRING rootdir; |
|
char prog[BUFSIZ]; |
|
char *av[BUFSIZ]; |
|
|
dname = use_x ? (char *)getenv("DISPLAY") : 0; |
dname = use_x ? (char *)getenv("DISPLAY") : 0; |
conn_str = conn_to_serv ? "1" : "0"; |
conn_str = conn_to_serv ? "1" : "0"; |
rsh = use_ssh ? "ssh" : RSH; |
rsh = getenv("ASIR_RSH"); |
|
if ( !rsh ) |
|
rsh = use_ssh ? "ssh" : RSH; |
|
if ( !use_unix && dname && strstr(rsh,"ssh") ) { |
|
/* |
|
* if "ssh" is used to invoke a remote server, |
|
* we should not specify "-display". |
|
*/ |
|
use_ssh = 1; |
|
} |
gethostname(localhost,BUFSIZ); |
gethostname(localhost,BUFSIZ); |
#if !defined(VISUAL) |
#if defined(VISUAL) |
|
if ( !use_unix ) |
|
error("spawn_server : not implemented on Windows"); |
|
Pget_rootdir(&rootdir); |
|
sprintf(AsirExe,"%s\\bin\\engine.exe",BDY(rootdir)); |
|
strcpy(prog,server); |
|
server = strrchr(prog,'/')+1; |
|
av[0] = "ox_launch"; |
|
av[1] = "127.0.0.1"; |
|
av[2] = conn_str; |
|
av[3] = control_port_str; |
|
av[4] = server_port_str; |
|
av[5] = server; |
|
av[6] = use_x ? "1" : "0"; |
|
av[7] = 0; |
|
|
|
_spawnv(_P_NOWAIT,AsirExe,av); |
|
// _spawnv(_P_NOWAIT,"d:\\home\\noro\\engine2000\\debug\\engine.exe",av); |
|
// printf("ox_launch 127.0.0.1 %s %s %s %s 0\n",conn_str,control_port_str,server_port_str,server); |
|
#else |
if ( use_unix ) { |
if ( use_unix ) { |
if ( !fork() ) { |
if ( !fork() ) { |
setpgid(0,getpid()); |
setpgid(0,getpid()); |
if ( dname ) |
if ( dname ) |
execlp("xterm","xterm","-name",OX_XTERM,"-display",dname, |
execlp("xterm","xterm","-name",OX_XTERM,"-T","ox_launch:local","-display",dname, |
"-geometry","60x10","-e",launcher,".",conn_str, |
"-geometry","60x10","-e",launcher,".",conn_str, |
control_port_str,server_port_str,server,dname,0); |
control_port_str,server_port_str,server,dname,0); |
else |
else |
Line 446 char *control_port_str,*server_port_str; |
|
Line 548 char *control_port_str,*server_port_str; |
|
/* special support for java */ |
/* special support for java */ |
if ( dname ) |
if ( dname ) |
sprintf(cmd, |
sprintf(cmd, |
"%s -n %s \"(cd %s; xterm -name %s -display %s -geometry 60x10 -e java %s -host %s -control %s -data %s)>&/dev/null&\">/dev/null", |
"%s -n %s \"(cd %s; xterm -name %s %s -geometry 60x10 -e java %s -host %s -control %s -data %s)>&/dev/null&\">/dev/null", |
rsh,host,launcher,OX_XTERM,dname,server,localhost,control_port_str,server_port_str); |
rsh,host,launcher,OX_XTERM,dname,server,localhost,control_port_str,server_port_str); |
else |
else |
sprintf(cmd, |
sprintf(cmd, |
Line 456 char *control_port_str,*server_port_str; |
|
Line 558 char *control_port_str,*server_port_str; |
|
fprintf(stderr,"%s\n",cmd); |
fprintf(stderr,"%s\n",cmd); |
sleep(20); |
sleep(20); |
/* system(cmd); */ |
/* system(cmd); */ |
} else |
} else { |
#endif /* VISUAL */ |
|
{ |
|
if ( dname ) |
if ( dname ) |
|
if ( use_ssh ) |
sprintf(cmd, |
sprintf(cmd, |
"%s -n %s \"xterm -name %s -display %s -geometry 60x10 -e %s %s %s %s %s %s %s>&/dev/null&\">/dev/null", |
"%s -f -n %s \"xterm -name %s -title ox_launch:%s -geometry 60x10 -e %s %s %s %s %s %s %s >&/dev/null\">/dev/null", |
rsh,host,OX_XTERM,dname,launcher,localhost,conn_str, |
rsh,host,OX_XTERM,host,launcher,localhost,conn_str, |
|
control_port_str,server_port_str,server,"1"); |
|
else |
|
sprintf(cmd, |
|
"%s -n %s \"xterm -name %s -title ox_launch:%s -display %s -geometry 60x10 -e %s %s %s %s %s %s %s >&/dev/null&\">/dev/null", |
|
rsh,host,OX_XTERM,host,dname,launcher,localhost,conn_str, |
control_port_str,server_port_str,server,dname); |
control_port_str,server_port_str,server,dname); |
else |
else |
sprintf(cmd, |
sprintf(cmd, |
"%s -n %s \"%s %s %s %s %s %s %s>&/dev/null&\">/dev/null", |
"%s -n %s \"%s %s %s %s %s %s %s >&/dev/null&\">/dev/null", |
rsh,host,launcher,localhost,conn_str, |
rsh,host,launcher,localhost,conn_str, |
control_port_str,server_port_str,server,"0"); |
control_port_str,server_port_str,server,"0"); |
system(cmd); |
system(cmd); |
} |
} |
|
#endif /* VISUAL */ |
} |
} |
|
|
void Pox_launch(arg,rp) |
void Pox_launch(arg,rp) |
Line 548 int af_unix,m,c; |
|
Line 655 int af_unix,m,c; |
|
{ |
{ |
int s,i,ci; |
int s,i,ci; |
struct m_c *t; |
struct m_c *t; |
|
#define INIT_TAB_SIZ 64 |
|
|
if ( c < 0 ) |
if ( c < 0 ) |
return -1; |
return -1; |
if ( !m_c_tab ) { |
if ( !m_c_tab ) { |
s = BUFSIZ*sizeof(struct m_c); |
s = INIT_TAB_SIZ*sizeof(struct m_c); |
m_c_tab = (struct m_c *)MALLOC_ATOMIC(s); |
m_c_tab = (struct m_c *)MALLOC_ATOMIC(s); |
for ( i = 0; i < BUFSIZ; i++ ) { |
for ( i = 0; i < INIT_TAB_SIZ; i++ ) { |
m_c_tab[i].af_unix = 0; |
m_c_tab[i].af_unix = 0; |
m_c_tab[i].m = m_c_tab[i].c = -1; |
m_c_tab[i].m = m_c_tab[i].c = -1; |
} |
} |
m_c_s = BUFSIZ; |
m_c_s = INIT_TAB_SIZ; |
} |
} |
#if !MPI |
#if !MPI |
for ( i = 0; i < m_c_i; i++ ) |
for ( i = 0; i < m_c_i; i++ ) |
Line 571 int af_unix,m,c; |
|
Line 679 int af_unix,m,c; |
|
} |
} |
#endif |
#endif |
if ( m_c_i == m_c_s ) { |
if ( m_c_i == m_c_s ) { |
s = (m_c_s+BUFSIZ)*sizeof(struct m_c); |
s = (m_c_s+INIT_TAB_SIZ)*sizeof(struct m_c); |
t = (struct m_c *)MALLOC_ATOMIC(s); bzero(m_c_tab,s); |
t = (struct m_c *)MALLOC_ATOMIC(s); bzero(m_c_tab,s); |
bcopy(m_c_tab,t,m_c_s*sizeof(struct m_c)); |
bcopy(m_c_tab,t,m_c_s*sizeof(struct m_c)); |
for ( i = 0; i < BUFSIZ; i++ ) { |
for ( i = 0; i < INIT_TAB_SIZ; i++ ) { |
m_c_tab[m_c_s+i].af_unix = 0; |
m_c_tab[m_c_s+i].af_unix = 0; |
m_c_tab[m_c_s+i].m = m_c_tab[m_c_s+i].c = -1; |
m_c_tab[m_c_s+i].m = m_c_tab[m_c_s+i].c = -1; |
} |
} |
m_c_s += BUFSIZ; m_c_tab = t; |
m_c_s += INIT_TAB_SIZ; m_c_tab = t; |
} |
} |
m_c_tab[m_c_i].m = m; m_c_tab[m_c_i].c = c; |
m_c_tab[m_c_i].m = m; m_c_tab[m_c_i].c = c; |
m_c_tab[m_c_i].af_unix = af_unix; |
m_c_tab[m_c_i].af_unix = af_unix; |
|
|
*rp = 0; |
*rp = 0; |
} |
} |
#endif |
#endif |
|
|
|
void shutdown_all() { |
|
int s; |
|
int i,index; |
|
int status; |
|
|
|
for ( i = I_am_server?1:0; i < m_c_i; i++ ) { |
|
index = i; |
|
check_valid_mctab_index(index); |
|
if ( index < 0 ) |
|
continue; |
|
s = m_c_tab[index].m; |
|
ox_send_cmd(s,SM_shutdown); |
|
free_iofp(s); |
|
#if !MPI && !defined(VISUAL) |
|
if ( m_c_tab[index].af_unix ) |
|
wait(&status); |
|
#endif |
|
m_c_tab[index].m = 0; m_c_tab[index].c = 0; |
|
m_c_tab[index].af_unix = 0; |
|
} |
|
} |