=================================================================== RCS file: /home/cvs/OpenXM/src/kxx/oxmain.c,v retrieving revision 1.18 retrieving revision 1.30 diff -u -p -r1.18 -r1.30 --- OpenXM/src/kxx/oxmain.c 2004/09/17 07:27:28 1.18 +++ OpenXM/src/kxx/oxmain.c 2020/10/07 07:47:23 1.30 @@ -1,4 +1,12 @@ -/* $OpenXM: OpenXM/src/kxx/oxmain.c,v 1.17 2004/03/03 02:31:50 takayama Exp $ */ +/* $OpenXM: OpenXM/src/kxx/oxmain.c,v 1.29 2016/09/26 11:43:38 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 @@ -6,6 +14,8 @@ #include #include #include +#include +#include #include #include #include @@ -17,6 +27,13 @@ #define SERVERNAME "ox_sm1" +void oxmainUsage(); +void parentServerMain(int fdControl, int fdStream); +int childServerMain(int fdControl, int fdStream); +void unlockCtrlCForOx(); +void restoreLockCtrlCForOx(); + + extern char **environ; int OxCritical = 0; int OxInterruptFlag = 0; @@ -33,16 +50,19 @@ int Quiet = 0; int LocalMode = 1; int NotifyPortnumber = 0; int Do_not_use_control_stream_to_tell_no_server = 1; +int IgnoreSIGINT = 1; +int Ox_protocol_1999 = 0; 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[]) { +void main(int argc, char *argv[]) { int fd; int size; char sname[1024]; @@ -59,9 +79,13 @@ main(int argc, char *argv[]) { char *passData = NULL; int result; int sleepingTime = 0; + int authEncoding=0; + FILE *fp; + char *stmp; extern int OxTerminateMode; - signal(SIGHUP,SIG_IGN); /* ignore x of xterm */ + int sighup[]={SIGHUP,-1}; + block_signal(sighup); /* ignore x of xterm */ strcpy(sname,"localhost"); strcpy(ServerName,SERVERNAME); i = 1; @@ -118,6 +142,21 @@ main(int argc, char *argv[]) { if (i 0 ) parentServerMain(fdControl,fdStream); @@ -215,7 +276,44 @@ main(int argc, char *argv[]) { } } + 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(); @@ -236,15 +334,16 @@ static void errorToStartEngine(void) { If you implement this, set Do_not_use_control_stream_to_tell_no_server to zero. */ - sleep(2); + sleep(10); exit(-1); } -oxmainUsage() { +void oxmainUsage() { fprintf(stderr,"Usage: \n"); fprintf(stderr," ox [-ox serverprogram -host name -data portnum -control portnum -monitor]\n"); fprintf(stderr," [-insecure -portfile fname -reverse -passControl xxxyyyzzz -passData pppqqqrrr]"); - fprintf(stderr," [-finish]"); + 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"); @@ -271,7 +370,7 @@ oxmainUsage() { fprintf(stderr,"\n"); } -parentServerMain(int fdControl, int fdStream) { +void parentServerMain(int fdControl, int fdStream) { int id; int mtag; int size; @@ -279,9 +378,11 @@ parentServerMain(int fdControl, int fdStream) { int r; int message = 1; int controlByteOrder; - extern OxTerminateMode; - extern void myServerExit(); + extern int OxTerminateMode; + extern void myServerExit(int m); + int sigchld[]={SIGCHLD,-1}; + unblock_signal(sigchld); if (OxTerminateMode) { /* OxTerminateMode cannot be used if you run ox by xterm -exec ox ... @@ -297,8 +398,11 @@ parentServerMain(int fdControl, int fdStream) { /* Set the network byte order. */ fprintf(stderr,"controlByteOrder=%x\n",controlByteOrder); - - signal(SIGINT,myServerExit); + /* int sigint[]={SIGINT,-1}; + set_signal(sigint[0],myServerExit); + unblock_signal(sigint); + */ + mysignal(SIGINT,SIG_IGN); while(1) { mtag = oxfdGetOXheader(fdControl,&SerialCurrentControl); /* get the message_tag */ @@ -308,35 +412,40 @@ parentServerMain(int fdControl, int fdStream) { switch( id ) { case SM_control_kill: if (message) printf("[control] control_kill\n"); - oxSendResultOfControl(fdControl); + /* oxSendResultOfControl(fdControl); */ sleep(2); - myServerExit(); + myServerExit(0); break; case SM_control_reset_connection: if (message) printf("[control] control_reset_connection.\n"); if (message) printf("Sending the SIGUSR1 signal to %d: ",MyServerPid); r=kill(MyServerPid,SIGUSR1); if (message) printf("Result = %d\n",r); + if (Ox_protocol_1999) { + if (message) printf("[obsolete protocol of ox-rfc-100 in 1999] Sending the result packet to the control channel. r=%d\n",r); + oxSendResultOfControlInt32(fdControl,0); + } fflush(NULL); /* 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(0); } -childServerMain(int fdControl, int fdStream) { +int childServerMain(int fdControl, int fdStream) { int i; + struct rlimit res; close(fdControl); /* close(0); dup(fdStream); */ dup2(fdStream,3); dup2(fdStream,4); @@ -376,7 +485,17 @@ childServerMain(int fdControl, int fdStream) { putenv(s); } } + getrlimit(RLIMIT_STACK,&res); + if (res.rlim_cur < 65536000) { + fprintf(stderr,"RLIMIT_STACK is increased to 65Mbytes by setrlimit.\n"); + res.rlim_cur = 65536000; + setrlimit(RLIMIT_STACK,&res); + } + // int sigint[]={SIGINT,-1}; + // if (IgnoreSIGINT) { block_signal(sigint); fprintf(stderr,"SIGING\n");} + if (IgnoreSIGINT) { mysignal(SIGINT,SIG_IGN); fprintf(stderr,"SIG_ING\n");} + if (PacketMonitor) { if (execle(ServerName,ServerName,"-monitor",NULL,environ)) { fprintf(stderr,"%s cannot be executed with -monitor.\n",ServerName); @@ -395,8 +514,8 @@ childServerMain(int fdControl, int fdStream) { /* These are dummy. It is defined in stackmachine.c */ -unlockCtrlCForOx() { ; } -restoreLockCtrlCForOx() { ; } +void unlockCtrlCForOx() { ; } +void restoreLockCtrlCForOx() { ; } static int findOxServer(char *server) { char *p; @@ -438,5 +557,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); +}