| version 1.3, 1999/11/04 02:12:31 | version 1.14, 2003/11/20 07:18:41 | 
|  |  | 
| /*  $OpenXM: OpenXM/src/kxx/oxmain.c,v 1.2 1999/10/30 02:24:27 takayama Exp $  */ | /*  $OpenXM: OpenXM/src/kxx/oxmain.c,v 1.13 2003/11/18 11:08:27 takayama Exp $  */ | 
| /* nullserver01 */ | /* nullserver01 */ | 
| #include <stdio.h> | #include <stdio.h> | 
|  | #include <fcntl.h> | 
|  | #include <unistd.h> | 
| #include <sys/types.h> | #include <sys/types.h> | 
| #include <sys/socket.h> | #include <sys/socket.h> | 
| #include <sys/time.h> | #include <sys/time.h> | 
|  |  | 
| #include <netdb.h> | #include <netdb.h> | 
| #include <signal.h> | #include <signal.h> | 
| #include <setjmp.h> | #include <setjmp.h> | 
|  | #include <stdlib.h> | 
| /* -lnsl -lsocket /usr/ucblib/libucb.a */ | /* -lnsl -lsocket /usr/ucblib/libucb.a */ | 
| #include "ox_kan.h" | #include "ox_kan.h" | 
| #include "serversm.h" | #include "serversm.h" | 
|  |  | 
| #define SERVERNAME "/usr/local/OpenXM/bin/ox_sm1" | #define SERVERNAME "ox_sm1" | 
|  |  | 
|  | extern char **environ; | 
| int OxCritical = 0; | int OxCritical = 0; | 
| int OxInterruptFlag = 0; | int OxInterruptFlag = 0; | 
|  | int OxTerminateMode = 0; | 
|  |  | 
| int SerialCurrentControl; | int SerialCurrentControl; | 
|  |  | 
| int MyServerPid; | int MyServerPid; | 
| char ServerName[1024]; | #define SERVERNAME_SIZE 4096 | 
|  | char ServerName[SERVERNAME_SIZE]; | 
| int PacketMonitor = 0; | int PacketMonitor = 0; | 
| int Quiet = 0; | int Quiet = 0; | 
|  |  | 
| int LocalMode = 1; | int LocalMode = 1; | 
| int NotifyPortnumber = 0; | 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); | 
|  | #if defined(__CYGWIN__) | 
|  | int errno; | 
|  | #endif | 
|  | /*  gcc -v -c hoge.c */ | 
|  |  | 
|  |  | 
| main(int argc, char *argv[]) { | main(int argc, char *argv[]) { | 
| int fd; | int fd; | 
| int size; | int size; | 
| 
| Line 40  main(int argc, char *argv[]) { |  | 
| Line 53  main(int argc, char *argv[]) { |  | 
| int reverse = 0; | int reverse = 0; | 
| extern int OpenedSocket; | extern int OpenedSocket; | 
| char portfile[1024]; | char portfile[1024]; | 
| char *pass; | char *pass = NULL; | 
|  | int result; | 
|  | int sleepingTime = 0; | 
|  | extern int OxTerminateMode; | 
|  |  | 
| strcpy(sname,"localhost"); | strcpy(sname,"localhost"); | 
| strcpy(ServerName,SERVERNAME); | strcpy(ServerName,SERVERNAME); | 
| i = 1; | i = 1; | 
| if (argc == 1) { | if (argc == 1) { | 
| oxmainUsage(); | oxmainUsage(); | 
| exit(); | exit(10); | 
| } | } | 
| while (i<argc) { | while (i<argc) { | 
| if (strcmp(argv[i],"-host") == 0) { | if (strcmp(argv[i],"-host") == 0) { | 
| 
| Line 68  main(int argc, char *argv[]) { |  | 
| Line 84  main(int argc, char *argv[]) { |  | 
| LocalMode = 0; | LocalMode = 0; | 
| }else if (strcmp(argv[i],"-reverse") == 0) { | }else if (strcmp(argv[i],"-reverse") == 0) { | 
| reverse = 1; | reverse = 1; | 
|  | }else if (strcmp(argv[i],"-finish") == 0) { | 
|  | OxTerminateMode = 1; | 
| }else if (strcmp(argv[i],"-portfile") == 0) { | }else if (strcmp(argv[i],"-portfile") == 0) { | 
| i++; | i++; | 
| if (i<argc) { | if (i<argc) { | 
| sscanf(argv[i],"%s",portfile); | sscanf(argv[i],"%s",portfile); | 
| portControl = 0; | portControl = 0; | 
| portStream = 0; | portStream = 0; | 
| NotifyPortnumber = 1; | NotifyPortnumber = 1; | 
| } | } | 
| }else if (strcmp(argv[i],"-pass") == 0) { | }else if (strcmp(argv[i],"-pass") == 0) { | 
| i++; | i++; | 
| if (i<argc) { | if (i<argc) { | 
| pass = argv[i]; | pass = argv[i]; | 
| } | } | 
|  | }else if (strcmp(argv[i],"-wait") == 0) { | 
|  | i++; | 
|  | if (i<argc) { | 
|  | sscanf(argv[i],"%d",&sleepingTime); | 
|  | } | 
| }else { | }else { | 
| fprintf(stderr,"Unknown option %s.\n",argv[i]); | fprintf(stderr,"Unknown option %s.\n",argv[i]); | 
| oxmainUsage(); exit(10); | oxmainUsage(); exit(10); | 
| 
| Line 88  main(int argc, char *argv[]) { |  | 
| Line 111  main(int argc, char *argv[]) { |  | 
| i++; | i++; | 
| } | } | 
|  |  | 
|  | if (Do_not_use_control_stream_to_tell_no_server) { | 
|  | if (findOxServer(ServerName) < 0) { | 
|  | fprintf(stderr,"Sleeping five seconds...\n"); | 
|  | sleep(5); | 
|  | exit(-1); | 
|  | } | 
|  | } | 
|  |  | 
|  | if (sleepingTime) { | 
|  | fprintf(stderr,"Waiting to connect for %d seconds...\n",sleepingTime); | 
|  | sleep(sleepingTime); | 
|  | fprintf(stderr,"\nTrying to connect\n"); | 
|  | } | 
|  |  | 
| if (reverse) { | if (reverse) { | 
| /* The order is very important. */ | /* The order is very important. */ | 
| fdControl = socketConnectWithPass(sname,portControl,pass); | fdControl = socketConnectWithPass(sname,portControl,pass); | 
| fdStream = socketConnectWithPass(sname,portStream,pass); | fdStream = socketConnectWithPass(sname,portStream,pass); | 
|  |  | 
| fprintf(stderr,"Connected: control = %d, data = %d.\n",fdControl,fdStream); | fprintf(stderr,"Connected: control = %d, data = %d.\n",fdControl,fdStream); | 
|  | result = 0; | 
|  |  | 
|  |  | 
| if (portControl != -1) { | if (portControl != -1) { | 
| MyServerPid = fork(); | MyServerPid = fork(); | 
| if (MyServerPid > 0 ) parentServerMain(fdControl,fdStream); | if (MyServerPid > 0 ) parentServerMain(fdControl,fdStream); | 
| else childServerMain(fdControl,fdStream); | else result=childServerMain(fdControl,fdStream); | 
| }else{ | }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. */ | /* non-reverse case. */ | 
| 
| Line 116  main(int argc, char *argv[]) { |  | 
| Line 159  main(int argc, char *argv[]) { |  | 
| fdControl = socketOpen(sname,portControl); | fdControl = socketOpen(sname,portControl); | 
| portControl = OpenedSocket; | portControl = OpenedSocket; | 
| if (NotifyPortnumber) { | if (NotifyPortnumber) { | 
| oxWritePortFile(0,portControl,portfile); | oxWritePortFile(0,portControl,portfile); | 
| } | } | 
| fdControl = socketAcceptLocal(fdControl); | fdControl = socketAcceptLocal(fdControl); | 
| fprintf(stderr,"\n control port %d : Connected.\n",portControl); | fprintf(stderr,"\n control port %d : Connected.\n",portControl); | 
| 
| Line 125  main(int argc, char *argv[]) { |  | 
| Line 168  main(int argc, char *argv[]) { |  | 
| fdStream = socketOpen(sname,portStream); | fdStream = socketOpen(sname,portStream); | 
| portStream = OpenedSocket; | portStream = OpenedSocket; | 
| if (NotifyPortnumber) { | if (NotifyPortnumber) { | 
| oxWritePortFile(1,portStream,portfile); | oxWritePortFile(1,portStream,portfile); | 
| } | } | 
| fdStream = socketAcceptLocal(fdStream); | fdStream = socketAcceptLocal(fdStream); | 
| fprintf(stderr,"\n stream port %d : Connected.\n",portStream); | fprintf(stderr,"\n stream port %d : Connected.\n",portStream); | 
| 
| Line 135  main(int argc, char *argv[]) { |  | 
| Line 178  main(int argc, char *argv[]) { |  | 
| fdControl = socketOpen(sname,portControl); | fdControl = socketOpen(sname,portControl); | 
| portControl = OpenedSocket; | portControl = OpenedSocket; | 
| if (NotifyPortnumber) { | if (NotifyPortnumber) { | 
| oxWritePortFile(0,portControl,portfile); | oxWritePortFile(0,portControl,portfile); | 
| } | } | 
| fdControl = socketAccept(fdControl); | fdControl = socketAccept(fdControl); | 
| fprintf(stderr,"\n control port %d : Connected.\n",portControl); | fprintf(stderr,"\n control port %d : Connected.\n",portControl); | 
| 
| Line 144  main(int argc, char *argv[]) { |  | 
| Line 187  main(int argc, char *argv[]) { |  | 
| fdStream = socketOpen(sname,portStream); | fdStream = socketOpen(sname,portStream); | 
| portStream = OpenedSocket; | portStream = OpenedSocket; | 
| if (NotifyPortnumber) { | if (NotifyPortnumber) { | 
| oxWritePortFile(1,portStream,portfile); | oxWritePortFile(1,portStream,portfile); | 
| } | } | 
| fdStream = socketAccept(fdStream); | fdStream = socketAccept(fdStream); | 
| fprintf(stderr,"\n stream port %d : Connected.\n",portStream); | fprintf(stderr,"\n stream port %d : Connected.\n",portStream); | 
| 
| Line 152  main(int argc, char *argv[]) { |  | 
| Line 195  main(int argc, char *argv[]) { |  | 
| } | } | 
|  |  | 
|  |  | 
|  | result = 0; | 
| if (portControl != -1) { | if (portControl != -1) { | 
| MyServerPid = fork(); | MyServerPid = fork(); | 
| if (MyServerPid > 0 ) parentServerMain(fdControl,fdStream); | if (MyServerPid > 0 ) parentServerMain(fdControl,fdStream); | 
| else childServerMain(fdControl,fdStream); | else result = childServerMain(fdControl,fdStream); | 
| }else{ | }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() { | oxmainUsage() { | 
| fprintf(stderr,"Usage: \n"); | fprintf(stderr,"Usage: \n"); | 
| fprintf(stderr,"  ox [-ox serverprogram -host name -data portnum -control portnum -monitor]\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 -pass xxxyyyzzz]"); | 
|  | fprintf(stderr," [-finish]"); | 
| fprintf(stderr,"\n"); | fprintf(stderr,"\n"); | 
| fprintf(stderr,"-reverse: ox server connects to the client.\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,"          See OpenXM/src/SSkan/Doc/ox.sm1, /sm1connectr\n"); | fprintf(stderr,"          See OpenXM/src/SSkan/Doc/ox.sm1, /sm1connectr\n"); | 
| fprintf(stderr,"-insecure : \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,"          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,"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,"(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,"(client):  sm1\n "); | 
| 
| Line 197  parentServerMain(int fdControl, int fdStream) { |  | 
| Line 257  parentServerMain(int fdControl, int fdStream) { |  | 
| int r; | int r; | 
| int message = 1; | int message = 1; | 
| int controlByteOrder; | int controlByteOrder; | 
|  | extern OxTerminateMode; | 
| extern void myServerExit(); | 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. */ | /* Set the network byte order. */ | 
| fprintf(stderr,"controlByteOrder=%x\n",controlByteOrder); | fprintf(stderr,"controlByteOrder=%x\n",controlByteOrder); | 
|  |  | 
| 
| Line 225  parentServerMain(int fdControl, int fdStream) { |  | 
| Line 296  parentServerMain(int fdControl, int fdStream) { |  | 
| r=kill(MyServerPid,SIGUSR1); | r=kill(MyServerPid,SIGUSR1); | 
| if (message) printf("Result = %d\n",r); | if (message) printf("Result = %d\n",r); | 
| fflush(NULL); | fflush(NULL); | 
| oxSendResultOfControlInt32(fdControl,0); | /*      oxSendResultOfControlInt32(fdControl,0); */ | 
| break; | break; | 
| default: | default: | 
| fprintf(stderr,"[control] Unknown control message.\n"); | fprintf(stderr,"[control] Unknown control message.\n"); | 
| 
| Line 239  parentServerMain(int fdControl, int fdStream) { |  | 
| Line 310  parentServerMain(int fdControl, int fdStream) { |  | 
| void myServerExit() { | void myServerExit() { | 
| printf("Sending the kill signal to the child.\n"); | printf("Sending the kill signal to the child.\n"); | 
| kill(MyServerPid,SIGKILL); | kill(MyServerPid,SIGKILL); | 
| exit(); | exit(0); | 
| } | } | 
|  |  | 
| childServerMain(int fdControl, int fdStream) { | childServerMain(int fdControl, int fdStream) { | 
| 
| Line 247  childServerMain(int fdControl, int fdStream) { |  | 
| Line 318  childServerMain(int fdControl, int fdStream) { |  | 
| close(fdControl);   /* close(0); dup(fdStream); */ | close(fdControl);   /* close(0); dup(fdStream); */ | 
| dup2(fdStream,3); | dup2(fdStream,3); | 
| dup2(fdStream,4); | dup2(fdStream,4); | 
| /*close(0); | /*close(0); | 
| #include <sys/param.h> | #include <sys/param.h> | 
| for (i=5; i<NOFILE; i++) close(i); | for (i=5; i<NOFILE; i++) close(i); | 
| */ | */ | 
|  | if (!Do_not_use_control_stream_to_tell_no_server) { | 
|  | if (findOxServer(ServerName) < 0) { | 
|  | return(-1); | 
|  | } | 
|  | } | 
|  | fprintf(stderr,"childServerMain: Starting the server %s\n",ServerName); fflush(NULL); | 
|  |  | 
|  | /* | 
|  | { | 
|  | int i; | 
|  | i=0; | 
|  | while (environ[i] != NULL) { | 
|  | fprintf(stderr,"%s ",environ[i++]); | 
|  | } | 
|  | fprintf(stderr,"\n"); | 
|  | } | 
|  | */ | 
|  | /* bug: xterm of potato does not seem to pass the LD_LIBRARY_PATH. | 
|  | So, the new gc does not work. | 
|  | it is an workaround for OpenXM */ | 
|  | if (getenv("LD_LIBRARY_PATH") == (char *)NULL) { | 
|  | char *s,*o; | 
|  | fprintf(stderr,"Hmm... LD_LIBRARY_PATH does not seem to be set.\n"); | 
|  | o = getenv("OpenXM_HOME"); | 
|  | if (o == NULL) { | 
|  | fprintf(stderr,"Giving up to set the LD_LIBRARY_PATH variable.\n"); | 
|  | }else{ | 
|  | s = (char *)malloc(strlen(o)+64); | 
|  | sprintf(s,"LD_LIBRARY_PATH=%s/lib",o); | 
|  | putenv(s); | 
|  | } | 
|  | } | 
|  |  | 
| if (PacketMonitor) { | if (PacketMonitor) { | 
| if (execl(ServerName,ServerName,"-monitor",NULL)) { | if (execle(ServerName,ServerName,"-monitor",NULL,environ)) { | 
| fprintf(stderr,"%s cannot be executed with -monitor.\n",ServerName); | fprintf(stderr,"%s cannot be executed with -monitor.\n",ServerName); | 
|  | fflush(NULL); | 
|  | return(-1); | 
| } | } | 
| }else { | }else { | 
| if (execl(ServerName,ServerName,NULL)) { | if (execle(ServerName,ServerName,NULL,environ)) { | 
| fprintf(stderr,"%s cannot be executed.\n",ServerName); | fprintf(stderr,"%s cannot be executed.\n",ServerName); | 
|  | fflush(NULL); | 
|  | return(-1); | 
| } | } | 
| } | } | 
|  | /* never reached. */ | 
| } | } | 
|  |  | 
|  |  | 
| 
| Line 267  childServerMain(int fdControl, int fdStream) { |  | 
| Line 376  childServerMain(int fdControl, int fdStream) { |  | 
| unlockCtrlCForOx() { ; } | unlockCtrlCForOx() { ; } | 
| restoreLockCtrlCForOx() { ; } | restoreLockCtrlCForOx() { ; } | 
|  |  | 
|  | static int findOxServer(char *server) { | 
|  | char *p; | 
|  | char *p2; | 
|  | if (strlen(server) == 0) return(-1); | 
|  | /* 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); | 
|  | } | 
|  | fprintf(stderr,"The server %s was not found. Trying to find it under OpenXM/bin\n",server); | 
|  | p = getenv("OpenXM_HOME"); | 
|  | if (p == NULL) { | 
|  | p = "/usr/local/OpenXM"; | 
|  | } | 
|  | 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 (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); | 
|  | } | 
|  |  | 
|  | static void couldNotFind(char *s) { | 
|  | fprintf(stderr,"OX server %s could not be found.\n",s); | 
|  | } | 
|  |  | 
|  |  | 
|  |  |