=================================================================== RCS file: /home/cvs/OpenXM/src/kxx/oxserver00.c,v retrieving revision 1.11 retrieving revision 1.25 diff -u -p -r1.11 -r1.25 --- OpenXM/src/kxx/oxserver00.c 2003/11/18 11:08:27 1.11 +++ OpenXM/src/kxx/oxserver00.c 2020/10/07 07:47:23 1.25 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM/src/kxx/oxserver00.c,v 1.10 2003/08/22 16:08:23 ohara Exp $ */ +/* $OpenXM: OpenXM/src/kxx/oxserver00.c,v 1.24 2016/08/28 02:43:15 takayama Exp $ */ /* nullserver01 */ #include #include @@ -8,6 +8,7 @@ #include #include #include +#include /* -lnsl -lsocket /usr/ucblib/libucb.a */ #include "ox_kan.h" #include "serversm.h" @@ -15,21 +16,33 @@ int OxCritical = 0; int OxInterruptFlag = 0; int PacketMonitor = 0; +int NoExecution = 0; extern int SerialOX; /* Serial number of the packets sent. */ extern int SerialCurrent; /* Current Serial number of the recieved packet. */ extern int OXprintMessage; /* print oxmessages? */ +extern int Calling_ctrlC_hook; +extern int RestrictedMode, RestrictedMode_saved; -#if defined(__CYGWIN__) +#if defined(__CYGWIN__) || defined(__MSYS__) sigjmp_buf EnvOfChildServer; #else jmp_buf EnvOfChildServer; #endif +void nullserver(int fdStreamIn,int fdStreamOut); +int nullserverCommand(ox_stream ostreamIn,ox_stream ostreamOut); +int nullserver_simplest(int fd); +int KSexecuteString(char *s); // kan96xx/Kan/datatype.h +void cancelAlarm(); // nullstackmachine.c +char *traceShowStack(); // kan96xx/Kan/extern.h +void traceClearStack(); // kan96xx/Kan/extern.h + int JmpMessage = 0; +extern int Lisplike; static char *getSuffix(char *s); -main(int argc, char *argv[]) { +void main(int argc, char *argv[]) { char *s; char *forAsir[] = {"callsm1.sm1","callsm1b.sm1"}; char *gnuplot[] = {"callsm1.sm1","gnuplot.sm1"}; @@ -43,6 +56,12 @@ main(int argc, char *argv[]) { if (strcmp(argv[1],"-monitor")==0) { fprintf(stderr,"Taking the packet monitor.\n"); PacketMonitor = 1; + }else if (strcmp(argv[1],"-lispLike")==0) { + fprintf(stderr,"Output lispLike expression.\n"); + Lisplike = 1; + }else if (strcmp(argv[1],"-noexec")==0) { + fprintf(stderr,"I do not execute commands.\n"); + NoExecution = 1; }else{ fprintf(stderr,"Unknown option. Possible options are -monitor\n"); } @@ -82,22 +101,22 @@ static char *getSuffix(char *s) { } return(s); } -nullserver(int fdStreamIn,int fdStreamOut) { +void nullserver(int fdStreamIn,int fdStreamOut) { int mtag; int message = 1; ox_stream ostreamIn; ox_stream ostreamOut; char sreason[1024]; extern void controlResetHandler(); -#if defined(__CYGWIN__) +#if defined(__CYGWIN__) || defined(__MSYS__) extern sigjmp_buf EnvOfStackMachine; #else extern jmp_buf EnvOfStackMachine; #endif int engineByteOrder; - /* for debug */ - PacketMonitor = 1; + /* for debug, use -monitor + PacketMonitor = 1; */ fflush(NULL); engineByteOrder = oxTellMyByteOrder(fdStreamOut,fdStreamIn); @@ -121,27 +140,35 @@ nullserver(int fdStreamIn,int fdStreamOut) { if (PacketMonitor) fp2watch(ostreamOut,stdout); } + /* fprintf(stderr,"Hello world.\n"); OXprintMessage = 1; + JmpMessage = 1; */ + aaa : ; #if defined(__CYGWIN__) - if (sigsetjmp(EnvOfChildServer,1)) { + if (MYSIGSETJMP(EnvOfChildServer,1)) { #else - if (setjmp(EnvOfChildServer)) { + if (MYSETJMP(EnvOfChildServer)) { #endif fprintf(stderr,"childServerMain: jump here.\n"); if (OxInterruptFlag == 0) { fprintf(stderr," ?! \n"); fflush(NULL); } - KSexecuteString(" ctrlC-hook "); /* Execute User Defined functions. */ + if (!Calling_ctrlC_hook) { + Calling_ctrlC_hook = 1; RestrictedMode = 0; + KSexecuteString(" ctrlC-hook "); /* Execute User Defined functions. */ + RestrictedMode = RestrictedMode_saved; + } + Calling_ctrlC_hook = 0; KSexecuteString(" (Computation is interrupted.) "); - signal(SIGUSR1,controlResetHandler); goto aaa; + mysignal(SIGUSR1,controlResetHandler); goto aaa; } else { if (JmpMessage) fprintf(stderr,"Set EnvOfChildServer.\n"); - signal(SIGUSR1,controlResetHandler); + mysignal(SIGUSR1,controlResetHandler); } #if defined(__CYGWIN__) - if (sigsetjmp(EnvOfStackMachine,1)) { + if (MYSIGSETJMP(EnvOfStackMachine,1)) { #else - if (setjmp(EnvOfStackMachine)) { + if (MYSETJMP(EnvOfStackMachine)) { #endif fprintf(stderr,"childServerMain: jump here by EnvOfStackMachine or timeout.\n"); if (OxInterruptFlag == 0) { @@ -157,12 +184,17 @@ nullserver(int fdStreamIn,int fdStreamOut) { */ Sm1_pushError2(SerialCurrent,-1,"Global jump by sm1 error"); - KSexecuteString(" ctrlC-hook "); /* Execute User Defined functions. */ - signal(SIGUSR1,controlResetHandler); goto aaa ; + if (!Calling_ctrlC_hook) { + Calling_ctrlC_hook = 1; RestrictedMode = 0; + KSexecuteString(" ctrlC-hook "); /* Execute User Defined functions. */ + RestrictedMode = RestrictedMode_saved; + } + Calling_ctrlC_hook = 0; + mysignal(SIGUSR1,controlResetHandler); goto aaa ; } else { if (JmpMessage) fprintf(stderr,"Set EnvOfStackMachine.\n"); - if (signal(SIGUSR1,SIG_IGN) != SIG_IGN) { - signal(SIGUSR1,controlResetHandler); + if (mysignal(SIGUSR1,SIG_IGN) != SIG_IGN) { + mysignal(SIGUSR1,controlResetHandler); } } @@ -222,7 +254,7 @@ nullserver(int fdStreamIn,int fdStreamOut) { } } -nullserverCommand(ox_stream ostreamIn,ox_stream ostreamOut) { +int nullserverCommand(ox_stream ostreamIn,ox_stream ostreamOut) { int id; int mtag; int n; @@ -237,52 +269,47 @@ nullserverCommand(ox_stream ostreamIn,ox_stream ostrea message = OXprintMessage; /* message_body */ id = oxGetInt32(ostreamIn); /* get the function_id */ - if (message) {fprintf(stderr,"\nfunction_id is %d\n",id);} + if (message) {fprintf(stderr,"\nfunction_id is %d; %s\n",id,oxFIDtoStr(id));} switch( id ) { case SM_mathcap: - if (message) fprintf(stderr," mathcap\n"); mathresult = (struct mathCap *)Sm1_mathcap(); oxPushMathCap(mathresult); break; case SM_setMathCap: - if (message) fprintf(stderr," setMathCap\n"); Sm1_setMathCap(ostreamOut); break; case SM_pops: - if (message) fprintf(stderr," pops \n"); Sm1_pops(); break; case SM_getsp: - if (message) fprintf(stderr," getsp \n"); Sm1_getsp(); break; case SM_dupErrors: - if (message) fprintf(stderr," dupErrors \n"); Sm1_dupErrors(); break; case SM_pushCMOtag: - if (message) fprintf(stderr," pushCMOtag \n"); Sm1_pushCMOtag(SerialCurrent); break; case SM_setName: - if (message) fprintf(stderr," setName \n"); iresult = Sm1_setName(); if (iresult < 0) { Sm1_pushError2(SerialCurrent,-1,"setName"); } break; case SM_evalName: - if (message) fprintf(stderr," evalName \n"); iresult = Sm1_evalName(); if (iresult < 0) { Sm1_pushError2(SerialCurrent,-1,"evalName"); } break; case SM_executeStringByLocalParser: - if (message) fprintf(stderr," executeStringByLocalParser\n"); OxCritical = 0; - iresult = Sm1_executeStringByLocalParser(); - OxCritical = 1; signal(SIGUSR1,controlResetHandler); + if (NoExecution) { + iresult = 0; + }else{ + iresult = Sm1_executeStringByLocalParser(); + } + OxCritical = 1; mysignal(SIGUSR1,controlResetHandler); if (iresult < 0) { emsg = Sm1_popErrorMessage("executeString: "); Sm1_pushError2(SerialCurrent,-1,emsg); @@ -290,24 +317,39 @@ nullserverCommand(ox_stream ostreamIn,ox_stream ostrea } break; case SM_executeFunction: - if (message) fprintf(stderr," executeFunction\n"); OxCritical = 0; - iresult = Sm1_executeStringByLocalParser(); - OxCritical = 1; signal(SIGUSR1,controlResetHandler); + if (NoExecution) { + iresult = 0; + }else{ + iresult = Sm1_executeStringByLocalParser(); + } + OxCritical = 1; mysignal(SIGUSR1,controlResetHandler); if (iresult < 0) { emsg = Sm1_popErrorMessage("executeFunction: "); Sm1_pushError2(SerialCurrent,-1,emsg); return(-1); } break; + case SM_executeFunctionWithOptionalArgument: + OxCritical = 0; + if (NoExecution) { + iresult = 0; + }else{ + iresult = Sm1_executeStringByLocalParser(); + } + OxCritical = 1; mysignal(SIGUSR1,controlResetHandler); + if (iresult < 0) { + emsg = Sm1_popErrorMessage("executeFunctionWithOptionalArgument: "); + Sm1_pushError2(SerialCurrent,-1,emsg); + return(-1); + } + break; case SM_popCMO: - if (message) fprintf(stderr,"popCMO. Start to sending data.\n",n); oxSendOXheader(ostreamOut,OX_DATA,SerialOX++); n=Sm1_popCMO(ostreamOut,SerialCurrent); if (message) fprintf(stderr,"Done.\n"); break; case SM_popString: - if (message) fprintf(stderr,"popString. send data from the stack.\n",n); oxSendOXheader(ostreamOut,OX_DATA,SerialOX++); oxSendCmoString(ostreamOut,Sm1_popString()); if (message) fprintf(stderr,"Done.\n"); @@ -321,6 +363,8 @@ nullserverCommand(ox_stream ostreamIn,ox_stream ostrea fprintf(stderr,"This command has not yet been implemented.\n"); return(-1); break; + case SM_nop: + break; default: fprintf(stderr,"Fatal error. Unknown function_id %d\n",id); return(-1); @@ -330,11 +374,11 @@ nullserverCommand(ox_stream ostreamIn,ox_stream ostrea } -nullserver_simplest(int fd) { +int nullserver_simplest(int fd) { int c; while(1) { c = readOneByte(fd); - if (c == '@') { return; } + if (c == '@') { return 0; } } } @@ -342,17 +386,18 @@ nullserver_simplest(int fd) { void controlResetHandler(sig) int sig; { - signal(sig,SIG_IGN); + mysignal(sig,SIG_IGN); cancelAlarm(); fprintf(stderr,"From controlResetHandler. OxCritical = %d\n",OxCritical); OxInterruptFlag = 1; if (OxCritical) { return; }else{ -#if defined(__CYGWIN__) - siglongjmp(EnvOfChildServer,2); /* returns 2 for ctrl-C */ + (void) traceShowStack(); traceClearStack(); +#if defined(__CYGWIN__) || defined(__MSYS__) + MYSIGLONGJMP(EnvOfChildServer,2); /* returns 2 for ctrl-C */ #else - longjmp(EnvOfChildServer,2); /* returns 2 for ctrl-C */ + MYLONGJMP(EnvOfChildServer,2); /* returns 2 for ctrl-C */ #endif } }