=================================================================== RCS file: /home/cvs/OpenXM/src/kxx/oxmain.c,v retrieving revision 1.5 retrieving revision 1.26 diff -u -p -r1.5 -r1.26 --- OpenXM/src/kxx/oxmain.c 2000/07/30 09:55:40 1.5 +++ OpenXM/src/kxx/oxmain.c 2016/03/30 09:20:40 1.26 @@ -1,22 +1,35 @@ -/* $OpenXM: OpenXM/src/kxx/oxmain.c,v 1.4 2000/01/31 01:34:23 takayama Exp $ */ +/* $OpenXM: OpenXM/src/kxx/oxmain.c,v 1.25 2006/06/05 04:40:15 takayama Exp $ */ +/* Note on IntelMac. [2006.06.05] + SIGINT does not seem to be blocked on the rosetta emulator of ppc + on the IntelMac's. "ox" should be universal binary. + A dirty hack to generate a universal binary of ox is as follows. + (1) Add -arch ppc -arch i386 to CFLAGS in src/kxx/Makefile + and src/kan96xx/plugin/Makefile + (2) Build ox +*/ /* nullserver01 */ #include #include +#include #include #include #include +#include #include #include #include #include +#include /* -lnsl -lsocket /usr/ucblib/libucb.a */ #include "ox_kan.h" #include "serversm.h" #define SERVERNAME "ox_sm1" +extern char **environ; int OxCritical = 0; int OxInterruptFlag = 0; +int OxTerminateMode = 0; int SerialCurrentControl; @@ -29,10 +42,16 @@ int Quiet = 0; int LocalMode = 1; int NotifyPortnumber = 0; int Do_not_use_control_stream_to_tell_no_server = 1; +int IgnoreSIGINT = 1; static void errorToStartEngine(void); static int findOxServer(char *server); static void couldNotFind(char *s); +/* gcc -v -c hoge.c */ +static void mywait(int m); +void *sGC_malloc(int n) { + return (void *)malloc(n); +} main(int argc, char *argv[]) { int fd; @@ -46,15 +65,24 @@ 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; + int authEncoding=0; + FILE *fp; + char *stmp; + extern int OxTerminateMode; + int sighup[]={SIGHUP,-1}; + block_signal(sighup); /* ignore x of xterm */ strcpy(sname,"localhost"); strcpy(ServerName,SERVERNAME); i = 1; if (argc == 1) { oxmainUsage(); - exit(); + exit(10); } while (i 0 ) parentServerMain(fdControl,fdStream); @@ -120,9 +213,9 @@ main(int argc, char *argv[]) { result=childServerMain(fdControl,fdStream); } /* This line will be never executed in case of success */ - if (result < 0 ) { - errorToStartEngine(); - } + if (result < 0 ) { + errorToStartEngine(); + } } /* non-reverse case. */ @@ -137,7 +230,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); @@ -146,7 +239,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); @@ -156,7 +249,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); @@ -165,14 +258,51 @@ 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); } } + if (passControl != NULL) { + char *s; int mm; + fprintf(stderr,"passControl\n"); + mm = strlen(passControl); + s = (char *) malloc(mm+1); + if (s == NULL) {fprintf(stderr,"No more memory.\n"); exit(1); } + if (read(fdControl,s,mm+1) < 0) { + fprintf(stderr,"Read error to read passControl\n"); sleep(5); exit(1); + } + s[mm] = 0; + if (strcmp(s,passControl) != 0) { + fprintf(stderr,"s=%s and passControl=%s do not match.\n",s,passControl); sleep(5); exit(1); + } + free(s); + } + if (passData != NULL) { + char *s; int mm; + mm = strlen(passData); + fprintf(stderr,"passData\n"); + s = (char *) malloc(mm+1); + if (s == NULL) {fprintf(stderr,"No more memory.\n"); exit(1); } + if (read(fdStream,s,mm+1) < 0) { + fprintf(stderr,"Read error to read passData\n"); + errorToStartEngine(); + } + if (strcmp(s,passData) != 0) { + fprintf(stderr,"s=%s and passData=%s do not match.\n",s,passData); + errorToStartEngine(); + } + free(s); + } + if ((fdControl < 0) || (fdStream < 0)) { + fprintf(stderr,"Waiting for 10 seconds to show an error.\n"); + sleep(10); + } + + result = 0; if (portControl != -1) { MyServerPid = fork(); @@ -187,25 +317,28 @@ main(int argc, char *argv[]) { 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); + 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(10); 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] [-wait seconds] [-authEncoding [file]]"); + fprintf(stderr," [-ignoreSIGINT [1|0]]"); fprintf(stderr,"\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 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"); @@ -234,15 +367,29 @@ parentServerMain(int fdControl, int fdStream) { int r; int message = 1; int controlByteOrder; + extern OxTerminateMode; + extern void myServerExit(int m); - extern void myServerExit(); - - controlByteOrder = oxTellMyByteOrder(fdControl); + int sigchld[]={SIGCHLD,-1}; + unblock_signal(sigchld); + 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); - - signal(SIGINT,myServerExit); + int sigint[]={SIGINT,-1}; + set_signal(sigint,myServerExit); + unblock_signal(sigint); while(1) { mtag = oxfdGetOXheader(fdControl,&SerialCurrentControl); /* get the message_tag */ @@ -254,7 +401,7 @@ parentServerMain(int fdControl, int fdStream) { if (message) printf("[control] control_kill\n"); oxSendResultOfControl(fdControl); sleep(2); - myServerExit(); + myServerExit(0); break; case SM_control_reset_connection: if (message) printf("[control] control_reset_connection.\n"); @@ -262,49 +409,86 @@ 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"); fprintf(stderr,"Shutdown the server."); - myServerExit(); + myServerExit(0); break; } } } -void myServerExit() { +void myServerExit(int m) { printf("Sending the kill signal to the child.\n"); kill(MyServerPid,SIGKILL); - exit(); + exit(0); } childServerMain(int fdControl, int fdStream) { int i; + struct rlimit res; close(fdControl); /* close(0); dup(fdStream); */ dup2(fdStream,3); dup2(fdStream,4); /*close(0); - #include - for (i=5; i + for (i=5; i= 0) { - fprintf(stderr,"Starting OX server : %s\n",server); - close(fd); - return(0); + /* fd = open(server,O_RDONLY); */ + if (access(server,X_OK&R_OK) == 0) { + fprintf(stderr,"Starting OX server : %s\n",server); + return(0); } if (server[0] == '/') { - couldNotFind(server); - return(-1); + couldNotFind(server); + return(-1); } fprintf(stderr,"The server %s was not found. Trying to find it under OpenXM/bin\n",server); p = getenv("OpenXM_HOME"); @@ -339,16 +520,15 @@ static int findOxServer(char *server) { p2 = (char *) malloc(sizeof(char)*(strlen(p)+strlen("/bin/")+3+strlen(server))); if (p2 == NULL) { fprintf(stderr,"No more memory.\n"); exit(10); } strcpy(p2,p); strcat(p2,"/bin/"); strcat(p2,server); - fd = open(p2,O_RDONLY); - if (fd >= 0) { - fprintf(stderr,"Starting OX server : %s\n",p2); - if (strlen(p2) < SERVERNAME_SIZE) strcpy(server,p2); - else { - couldNotFind("Too long ox server name."); - return(-1); - } - close(fd); - return(0); + /* fd = open(p2,O_RDONLY); */ + if (access(p2,X_OK&R_OK) == 0) { + fprintf(stderr,"Starting OX server : %s\n",p2); + if (strlen(p2) < SERVERNAME_SIZE) strcpy(server,p2); + else { + couldNotFind("Too long ox server name."); + return(-1); + } + return(0); } couldNotFind(p2); return(-1); @@ -359,5 +539,16 @@ static void couldNotFind(char *s) { } +static void mywait(int m) { + int status; + int pid; + int i,j; + /* signal(SIGCHLD,SIG_IGN); */ + pid = wait(&status); + fprintf(stderr,"Control: child process %d is exiting.\n",pid); + fprintf(stderr,"Control: Shutting down the control server.\n"); + sleep(2); + exit(0); +}