=================================================================== RCS file: /home/cvs/OpenXM/src/kxx/oxmain.c,v retrieving revision 1.19 retrieving revision 1.25 diff -u -p -r1.19 -r1.25 --- OpenXM/src/kxx/oxmain.c 2004/09/17 08:46:10 1.19 +++ OpenXM/src/kxx/oxmain.c 2006/06/05 04:40:15 1.25 @@ -1,4 +1,12 @@ -/* $OpenXM: OpenXM/src/kxx/oxmain.c,v 1.18 2004/09/17 07:27:28 takayama Exp $ */ +/* $OpenXM: OpenXM/src/kxx/oxmain.c,v 1.24 2006/06/05 00:25:50 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,7 @@ #include #include #include +#include #include #include #include @@ -33,10 +42,12 @@ 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(); void *sGC_malloc(int n) { return (void *)malloc(n); @@ -59,6 +70,9 @@ 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 */ @@ -118,6 +132,19 @@ main(int argc, char *argv[]) { if (i 0 ) parentServerMain(fdControl,fdStream); @@ -249,6 +296,12 @@ main(int argc, char *argv[]) { 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(); @@ -269,7 +322,7 @@ 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); } @@ -277,7 +330,8 @@ 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"); @@ -315,6 +369,7 @@ parentServerMain(int fdControl, int fdStream) { extern OxTerminateMode; extern void myServerExit(); + signal(SIGCHLD,mywait); if (OxTerminateMode) { /* OxTerminateMode cannot be used if you run ox by xterm -exec ox ... @@ -370,6 +425,7 @@ void myServerExit() { childServerMain(int fdControl, int fdStream) { int i; + struct rlimit res; close(fdControl); /* close(0); dup(fdStream); */ dup2(fdStream,3); dup2(fdStream,4); @@ -409,7 +465,15 @@ 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); + } + if (IgnoreSIGINT) { signal(SIGINT, SIG_IGN); fprintf(stderr,"SIGING\n");} + if (PacketMonitor) { if (execle(ServerName,ServerName,"-monitor",NULL,environ)) { fprintf(stderr,"%s cannot be executed with -monitor.\n",ServerName); @@ -471,5 +535,16 @@ static void couldNotFind(char *s) { } +static void mywait() { + 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); +}