=================================================================== RCS file: /home/cvs/OpenXM/src/kxx/oxmain.c,v retrieving revision 1.1.1.1 retrieving revision 1.18 diff -u -p -r1.1.1.1 -r1.18 --- OpenXM/src/kxx/oxmain.c 1999/10/08 02:12:13 1.1.1.1 +++ OpenXM/src/kxx/oxmain.c 2004/09/17 07:27:28 1.18 @@ -1,5 +1,8 @@ +/* $OpenXM: OpenXM/src/kxx/oxmain.c,v 1.17 2004/03/03 02:31:50 takayama Exp $ */ /* nullserver01 */ #include +#include +#include #include #include #include @@ -7,29 +10,37 @@ #include #include #include +#include /* -lnsl -lsocket /usr/ucblib/libucb.a */ #include "ox_kan.h" #include "serversm.h" -#define SERVERNAME "/home/nobuki/kxx/ox_sm1" -/* -#define SERVERNAME "/home/nobuki/kxx/stdserver00" -#define SERVERNAME "/home/ftp/pub/OHP/ox_asir" -*/ +#define SERVERNAME "ox_sm1" +extern char **environ; int OxCritical = 0; int OxInterruptFlag = 0; +int OxTerminateMode = 0; int SerialCurrentControl; int MyServerPid; -char ServerName[1024]; +#define SERVERNAME_SIZE 4096 +char ServerName[SERVERNAME_SIZE]; int PacketMonitor = 0; int Quiet = 0; int LocalMode = 1; int NotifyPortnumber = 0; +int Do_not_use_control_stream_to_tell_no_server = 1; +static void errorToStartEngine(void); +static int findOxServer(char *server); +static void couldNotFind(char *s); +/* gcc -v -c hoge.c */ +void *sGC_malloc(int n) { + return (void *)malloc(n); +} main(int argc, char *argv[]) { int fd; @@ -43,11 +54,21 @@ main(int argc, char *argv[]) { int reverse = 0; extern int OpenedSocket; char portfile[1024]; - char *pass; + char *pass = NULL; + char *passControl = NULL; + char *passData = NULL; + int result; + int sleepingTime = 0; + extern int OxTerminateMode; + signal(SIGHUP,SIG_IGN); /* ignore x of xterm */ strcpy(sname,"localhost"); strcpy(ServerName,SERVERNAME); i = 1; + if (argc == 1) { + oxmainUsage(); + exit(10); + } while (i 0 ) parentServerMain(fdControl,fdStream); - else childServerMain(fdControl,fdStream); + else result=childServerMain(fdControl,fdStream); }else{ - childServerMain(fdControl,fdStream); + result=childServerMain(fdControl,fdStream); } - /* This line will be never executed. */ + /* This line will be never executed in case of success */ + if (result < 0 ) { + errorToStartEngine(); + } } /* non-reverse case. */ @@ -115,7 +180,7 @@ main(int argc, char *argv[]) { fdControl = socketOpen(sname,portControl); portControl = OpenedSocket; if (NotifyPortnumber) { - oxWritePortFile(0,portControl,portfile); + oxWritePortFile(0,portControl,portfile); } fdControl = socketAcceptLocal(fdControl); fprintf(stderr,"\n control port %d : Connected.\n",portControl); @@ -124,7 +189,7 @@ main(int argc, char *argv[]) { fdStream = socketOpen(sname,portStream); portStream = OpenedSocket; if (NotifyPortnumber) { - oxWritePortFile(1,portStream,portfile); + oxWritePortFile(1,portStream,portfile); } fdStream = socketAcceptLocal(fdStream); fprintf(stderr,"\n stream port %d : Connected.\n",portStream); @@ -134,7 +199,7 @@ main(int argc, char *argv[]) { fdControl = socketOpen(sname,portControl); portControl = OpenedSocket; if (NotifyPortnumber) { - oxWritePortFile(0,portControl,portfile); + oxWritePortFile(0,portControl,portfile); } fdControl = socketAccept(fdControl); fprintf(stderr,"\n control port %d : Connected.\n",portControl); @@ -143,7 +208,7 @@ main(int argc, char *argv[]) { fdStream = socketOpen(sname,portStream); portStream = OpenedSocket; if (NotifyPortnumber) { - oxWritePortFile(1,portStream,portfile); + oxWritePortFile(1,portStream,portfile); } fdStream = socketAccept(fdStream); fprintf(stderr,"\n stream port %d : Connected.\n",portStream); @@ -151,24 +216,58 @@ main(int argc, char *argv[]) { } - + result = 0; if (portControl != -1) { MyServerPid = fork(); if (MyServerPid > 0 ) parentServerMain(fdControl,fdStream); - else childServerMain(fdControl,fdStream); + else result = childServerMain(fdControl,fdStream); }else{ - childServerMain(fdControl,fdStream); + result = childServerMain(fdControl,fdStream); } + if (result < 0) errorToStartEngine(); +} +static void errorToStartEngine(void) { + fprintf(stderr,"Failed to start the engine. Childing process is terminating.\n"); + /* You have to tell to the control server that there is no engine. + And, the control server must tell the client that there is no + engine. + This part has not yet been implemented. + If you implement this, set Do_not_use_control_stream_to_tell_no_server to + zero. + */ + sleep(2); + exit(-1); } oxmainUsage() { fprintf(stderr,"Usage: \n"); fprintf(stderr," ox [-ox serverprogram -host name -data portnum -control portnum -monitor]\n"); - fprintf(stderr," [-insecure -portfile fname -reverse -pass xxxyyyzzz]"); + fprintf(stderr," [-insecure -portfile fname -reverse -passControl xxxyyyzzz -passData pppqqqrrr]"); + fprintf(stderr," [-finish]"); fprintf(stderr,"\n"); - fprintf(stderr,"Example 1: dc1% ./ox -ox ox_sm1 -host dc1.math.kobe-u.ac.jp -insecure -control 1300 -data 1200\n"); + fprintf(stderr,"-reverse: ox server connects to the client.\n"); + fprintf(stderr," The client must give a one time password to ox server to connect to the client with -pass* option.\n"); + fprintf(stderr," The one time password can be seen by ps command, so you must not use this one time password system on an untrustful host.\n"); + fprintf(stderr," The one time password should be sent by a safe communication line like ssh and the ox server should be started by ssh. Do not use rsh\n"); + fprintf(stderr," (The option -pass is obsolete.)\n"); + fprintf(stderr," If -reverse is not given, the client connect to the ox server\n"); + fprintf(stderr," See OpenXM/src/SSkan/Doc/ox.sm1, /sm1connectr\n"); + fprintf(stderr,"-insecure : \n"); + fprintf(stderr," If you access to the server from a localhost, you do not need one time password. However, if you access outside of the localhost, a one time password is required. To turn off this restriction, -insecure option is used.\n"); + fprintf(stderr,"\n"); + fprintf(stderr,"If ox fails to find the serverprogram, it tries to look for it in /usr/local/OpenXM/bin and $OpenXM_HOME/bin.\n"); + fprintf(stderr,"\n"); + fprintf(stderr,"Example 1:\n"); + fprintf(stderr,"(Start the ox server): dc1%% ox -ox ~/OpenXM/bin/ox_sm1 -host dc1.math.kobe-u.ac.jp -insecure -control 1200 -data 1300\n"); + fprintf(stderr,"(client): sm1\n "); + fprintf(stderr," (ox.sm1) run ; \n"); fprintf(stderr," sm1>[(dc1.math.kobe-u.ac.jp) 1300 1200] oxconnect /ox.ccc set\n"); + fprintf(stderr,"Example 2:\n"); + fprintf(stderr,"(Start the ox server): dc1%% ox -ox ~/OpenXM/bin/ox_sm1\n"); + fprintf(stderr,"(client): dc1%% sm1\n "); + fprintf(stderr," (ox.sm1) run ; \n"); + fprintf(stderr," sm1>[(localhost) 1300 1200] oxconnect /ox.ccc set\n"); fprintf(stderr,"\n"); } @@ -180,10 +279,21 @@ parentServerMain(int fdControl, int fdStream) { int r; int message = 1; int controlByteOrder; - + extern OxTerminateMode; extern void myServerExit(); - controlByteOrder = oxTellMyByteOrder(fdControl); + if (OxTerminateMode) { + /* + OxTerminateMode cannot be used if you run ox by xterm -exec ox ... + */ + if (fork()) { + close(fdControl); close(fdStream); + /* Parent */ + exit(0); /*Tell the caller that launching is successfully finished.*/ + } + } + + controlByteOrder = oxTellMyByteOrder(fdControl,fdControl); /* Set the network byte order. */ fprintf(stderr,"controlByteOrder=%x\n",controlByteOrder); @@ -208,7 +318,7 @@ parentServerMain(int fdControl, int fdStream) { r=kill(MyServerPid,SIGUSR1); if (message) printf("Result = %d\n",r); fflush(NULL); - oxSendResultOfControlInt32(fdControl,0); + /* oxSendResultOfControlInt32(fdControl,0); */ break; default: fprintf(stderr,"[control] Unknown control message.\n"); @@ -222,7 +332,7 @@ parentServerMain(int fdControl, int fdStream) { void myServerExit() { printf("Sending the kill signal to the child.\n"); kill(MyServerPid,SIGKILL); - exit(); + exit(0); } childServerMain(int fdControl, int fdStream) { @@ -230,19 +340,57 @@ childServerMain(int fdControl, int fdStream) { close(fdControl); /* close(0); dup(fdStream); */ dup2(fdStream,3); dup2(fdStream,4); -/*close(0); - #include - for (i=5; i + for (i=5; i