Annotation of OpenXM/src/kxx/oxserver00.c, Revision 1.25
1.25 ! takayama 1: /* $OpenXM: OpenXM/src/kxx/oxserver00.c,v 1.24 2016/08/28 02:43:15 takayama Exp $ */
1.1 maekawa 2: /* nullserver01 */
3: #include <stdio.h>
4: #include <sys/types.h>
5: #include <sys/socket.h>
6: #include <sys/time.h>
7: #include <netinet/in.h>
8: #include <netdb.h>
9: #include <signal.h>
10: #include <setjmp.h>
1.22 takayama 11: #include <stdlib.h>
1.1 maekawa 12: /* -lnsl -lsocket /usr/ucblib/libucb.a */
13: #include "ox_kan.h"
14: #include "serversm.h"
15:
16: int OxCritical = 0;
17: int OxInterruptFlag = 0;
18: int PacketMonitor = 0;
1.13 takayama 19: int NoExecution = 0;
1.1 maekawa 20:
21: extern int SerialOX; /* Serial number of the packets sent. */
22: extern int SerialCurrent; /* Current Serial number of the recieved packet. */
23: extern int OXprintMessage; /* print oxmessages? */
1.15 takayama 24: extern int Calling_ctrlC_hook;
1.16 takayama 25: extern int RestrictedMode, RestrictedMode_saved;
1.1 maekawa 26:
1.18 takayama 27: #if defined(__CYGWIN__) || defined(__MSYS__)
1.7 takayama 28: sigjmp_buf EnvOfChildServer;
29: #else
1.1 maekawa 30: jmp_buf EnvOfChildServer;
1.7 takayama 31: #endif
1.1 maekawa 32:
1.25 ! takayama 33: void nullserver(int fdStreamIn,int fdStreamOut);
! 34: int nullserverCommand(ox_stream ostreamIn,ox_stream ostreamOut);
! 35: int nullserver_simplest(int fd);
! 36: int KSexecuteString(char *s); // kan96xx/Kan/datatype.h
! 37: void cancelAlarm(); // nullstackmachine.c
! 38: char *traceShowStack(); // kan96xx/Kan/extern.h
! 39: void traceClearStack(); // kan96xx/Kan/extern.h
! 40:
1.1 maekawa 41: int JmpMessage = 0;
1.12 takayama 42: extern int Lisplike;
1.1 maekawa 43:
44: static char *getSuffix(char *s);
1.25 ! takayama 45: void main(int argc, char *argv[]) {
1.1 maekawa 46: char *s;
47: char *forAsir[] = {"callsm1.sm1","callsm1b.sm1"};
48: char *gnuplot[] = {"callsm1.sm1","gnuplot.sm1"};
49: char *phc[] = {"callsm1.sm1","phc.sm1"};
50: char *tigers[] = {"callsm1.sm1","tigers.sm1"};
51: char *basicCD[] = {"basicCD.sm1"};
52: /* If you change the above, you need to change the argc of Sm1_start below.
1.5 takayama 53: */
1.1 maekawa 54:
55: if (argc > 1) {
56: if (strcmp(argv[1],"-monitor")==0) {
57: fprintf(stderr,"Taking the packet monitor.\n");
58: PacketMonitor = 1;
1.12 takayama 59: }else if (strcmp(argv[1],"-lispLike")==0) {
60: fprintf(stderr,"Output lispLike expression.\n");
61: Lisplike = 1;
1.13 takayama 62: }else if (strcmp(argv[1],"-noexec")==0) {
63: fprintf(stderr,"I do not execute commands.\n");
64: NoExecution = 1;
1.1 maekawa 65: }else{
66: fprintf(stderr,"Unknown option. Possible options are -monitor\n");
67: }
68: }
69: /* Load initialization files if necessary. */
70: s = getSuffix(argv[0]);
71: if (strcmp(s,"forAsir") == 0) {
72: Sm1_start(2,forAsir,"ox_sm1_forAsir");
73: }else if (strcmp(s,"gnuplot") == 0) {
74: Sm1_start(2,gnuplot,"ox_sm1_gnuplot");
75: }else if (strcmp(s,"phc") == 0) {
76: Sm1_start(2,phc,"ox_sm1_phc");
77: }else if (strcmp(s,"tigers") == 0) {
78: Sm1_start(2,tigers,"ox_sm1_tigers");
79: }else if (strcmp(s,"basicCD") == 0) {
80: Sm1_start(1,basicCD,"basicCD");
81: }else { /* Default */
82: Sm1_start(0, NULL, "ox_sm1");
83: }
84:
1.11 takayama 85: nullserver(3,4);
1.1 maekawa 86: }
87:
88: static char *getSuffix(char *s) {
89: /* getSuffix("ox_sm1_forAsir") returns "forAsir" */
1.6 takayama 90: /* getSuffix("ox_sm1_forAsir.exe") returns "forAsir" */
1.1 maekawa 91: /* getSuffix("ox_sm1_gnuplot") returns "gnuplot" */
92: int n,i,k;
93: n = strlen(s);
1.6 takayama 94: if (n > 5 && (strcmp(".exe",&(s[n-4]))==0 || strcmp(".EXE",&(s[n-4]))==0)) {
95: s[n-4] = '\0';
96: }
1.1 maekawa 97: for (i=n-1; i>=0; i--) {
98: if (s[i] == '_') {
99: return( s+i+1 );
100: }
101: }
102: return(s);
103: }
1.25 ! takayama 104: void nullserver(int fdStreamIn,int fdStreamOut) {
1.1 maekawa 105: int mtag;
106: int message = 1;
1.11 takayama 107: ox_stream ostreamIn;
108: ox_stream ostreamOut;
1.1 maekawa 109: char sreason[1024];
110: extern void controlResetHandler();
1.18 takayama 111: #if defined(__CYGWIN__) || defined(__MSYS__)
1.7 takayama 112: extern sigjmp_buf EnvOfStackMachine;
113: #else
1.1 maekawa 114: extern jmp_buf EnvOfStackMachine;
1.7 takayama 115: #endif
1.1 maekawa 116: int engineByteOrder;
117:
1.12 takayama 118: /* for debug, use -monitor
119: PacketMonitor = 1; */
1.11 takayama 120:
1.4 takayama 121: fflush(NULL);
1.11 takayama 122: engineByteOrder = oxTellMyByteOrder(fdStreamOut,fdStreamIn);
1.1 maekawa 123: /* Set the network byte order. */
124: fprintf(stderr,"engineByteOrder=%x\n",engineByteOrder);
125:
1.11 takayama 126: if (fdStreamIn != -1) {
127: ostreamIn = fp2open(fdStreamIn);
128: if (ostreamIn == NULL) {
129: fprintf(stderr,"fp2open(fdStreamIn) failed.\n");
130: fdStreamIn = -1;
131: }
132: if (PacketMonitor) fp2watch(ostreamIn,stdout);
133: }
134: if (fdStreamOut != -1) {
135: ostreamOut = fp2open(fdStreamOut);
136: if (ostreamOut == NULL) {
137: fprintf(stderr,"fp2open(fdStreamOut) failed.\n");
138: fdStreamOut = -1;
1.1 maekawa 139: }
1.11 takayama 140: if (PacketMonitor) fp2watch(ostreamOut,stdout);
1.1 maekawa 141: }
1.11 takayama 142:
1.21 takayama 143: /* fprintf(stderr,"Hello world.\n"); OXprintMessage = 1;
144: JmpMessage = 1; */
1.18 takayama 145:
1.1 maekawa 146: aaa : ;
1.7 takayama 147: #if defined(__CYGWIN__)
1.18 takayama 148: if (MYSIGSETJMP(EnvOfChildServer,1)) {
1.7 takayama 149: #else
1.18 takayama 150: if (MYSETJMP(EnvOfChildServer)) {
1.7 takayama 151: #endif
1.1 maekawa 152: fprintf(stderr,"childServerMain: jump here.\n");
153: if (OxInterruptFlag == 0) {
154: fprintf(stderr," ?! \n"); fflush(NULL);
155: }
1.15 takayama 156: if (!Calling_ctrlC_hook) {
1.16 takayama 157: Calling_ctrlC_hook = 1; RestrictedMode = 0;
1.15 takayama 158: KSexecuteString(" ctrlC-hook "); /* Execute User Defined functions. */
1.16 takayama 159: RestrictedMode = RestrictedMode_saved;
1.15 takayama 160: }
161: Calling_ctrlC_hook = 0;
1.9 takayama 162: KSexecuteString(" (Computation is interrupted.) ");
1.23 takayama 163: mysignal(SIGUSR1,controlResetHandler); goto aaa;
1.1 maekawa 164: } else {
165: if (JmpMessage) fprintf(stderr,"Set EnvOfChildServer.\n");
1.23 takayama 166: mysignal(SIGUSR1,controlResetHandler);
1.1 maekawa 167: }
1.7 takayama 168: #if defined(__CYGWIN__)
1.18 takayama 169: if (MYSIGSETJMP(EnvOfStackMachine,1)) {
1.7 takayama 170: #else
1.18 takayama 171: if (MYSETJMP(EnvOfStackMachine)) {
1.7 takayama 172: #endif
1.9 takayama 173: fprintf(stderr,"childServerMain: jump here by EnvOfStackMachine or timeout.\n");
1.1 maekawa 174: if (OxInterruptFlag == 0) {
175: fprintf(stderr," ?! \n"); fflush(NULL);
176: }
177: /* In case of error in the stack machine, pop the error info
178: and send the error packet. */
179: /* oxSendOXheader(ostream,OX_DATA,SerialOX++);
1.5 takayama 180: oxSendCmoError(ostream);
181: oxSendOXheader(ostream,OX_DATA,SerialOX++);
182: sprintf(sreason,"Jump here by sm1 error.");
183: oxSendCmoError2(ostream,sreason);
1.1 maekawa 184: */
185: Sm1_pushError2(SerialCurrent,-1,"Global jump by sm1 error");
186:
1.15 takayama 187: if (!Calling_ctrlC_hook) {
1.16 takayama 188: Calling_ctrlC_hook = 1; RestrictedMode = 0;
1.15 takayama 189: KSexecuteString(" ctrlC-hook "); /* Execute User Defined functions. */
1.16 takayama 190: RestrictedMode = RestrictedMode_saved;
1.15 takayama 191: }
192: Calling_ctrlC_hook = 0;
1.23 takayama 193: mysignal(SIGUSR1,controlResetHandler); goto aaa ;
1.1 maekawa 194: } else {
195: if (JmpMessage) fprintf(stderr,"Set EnvOfStackMachine.\n");
1.23 takayama 196: if (mysignal(SIGUSR1,SIG_IGN) != SIG_IGN) {
197: mysignal(SIGUSR1,controlResetHandler);
1.1 maekawa 198: }
199: }
200:
201: while (1) {
1.11 takayama 202: message = OXprintMessage;
1.1 maekawa 203: if (OxInterruptFlag) {
204: OxCritical = 1;
205: if (message) {fprintf(stderr,"Clearing the read buffer.\n");fflush(NULL); }
1.11 takayama 206: fp2clearReadBuf(ostreamIn); /* clear the read buffer */
1.1 maekawa 207: if (message) {fprintf(stderr,"Throwing OX_SYNC_BALL\n"); fflush(NULL);}
1.11 takayama 208: oxSendSyncBall(ostreamOut);
1.1 maekawa 209: if (message) {fprintf(stderr,"Waiting for OX_SYNC_BALL\n");fflush(NULL);}
1.11 takayama 210: oxWaitSyncBall(ostreamIn);
1.1 maekawa 211: if (message) {fprintf(stderr,"Done changing OX_SYNC_BALL\n"); fflush(NULL);}
212: OxInterruptFlag = 0;
213: OxCritical = 0;
214: goto aaa ;
215: }
216: OxCritical = 0;
1.11 takayama 217: if (fp2select(ostreamIn,-1)) {
1.1 maekawa 218: /* If there is an data in the ostream, then read data in the buffer and
219: read data in the communication stream. */
220: OxCritical = 1;
221: }else{
222: /* interrupted system call */
223: /* This part is never reached. */
224: }
225: OxCritical = 1;
1.11 takayama 226: mtag = oxGetOXheader(ostreamIn,&SerialCurrent); /* get the message_tag */
1.1 maekawa 227: if (message) {
228: fprintf(stderr,"\nmtag is %d (serial=%d) : ",mtag,SerialCurrent);
229: switch(mtag) {
230: case OX_COMMAND: fprintf(stderr," OX_COMMAND \n"); break;
231: case OX_DATA: fprintf(stderr," OX_DATA \n"); break;
232: case OX_SYNC_BALL: fprintf(stderr," OX_SYNC_BALL \n"); break;
233: case -1: fprintf(stderr," End of file. Exiting the server child.\n");
1.10 ohara 234: exit(0); break;
1.1 maekawa 235: default: fprintf(stderr," ?! \n"); break;
236: }
237: }
238: /*sleep(2); /* for dubug OX_SYNC_BALL */
239: switch(mtag) {
240: case OX_COMMAND:
1.11 takayama 241: nullserverCommand(ostreamIn,ostreamOut);
1.1 maekawa 242: goto aaa ; /* We always reset the jump vector. cf. memo1.txt 1998 2/13*/
243: break;
244: case OX_DATA:
1.11 takayama 245: Sm1_pushCMO(ostreamIn);
1.1 maekawa 246: break;
247: case OX_SYNC_BALL:
248: /* if (OxInterruptFlag) think about it later. */
249: break;
250: default:
251: fprintf(stderr,"Fatal error in server.\n");
252: break;
253: }
254: }
255: }
256:
1.25 ! takayama 257: int nullserverCommand(ox_stream ostreamIn,ox_stream ostreamOut) {
1.1 maekawa 258: int id;
259: int mtag;
260: int n;
261: char *name;
262: char *sresult;
263: struct mathCap *mathresult;
264: int iresult;
265: int message = 1;
266: char *emsg;
267: extern void controlResetHandler();
268:
1.11 takayama 269: message = OXprintMessage;
1.1 maekawa 270: /* message_body */
1.11 takayama 271: id = oxGetInt32(ostreamIn); /* get the function_id */
1.12 takayama 272: if (message) {fprintf(stderr,"\nfunction_id is %d; %s\n",id,oxFIDtoStr(id));}
1.1 maekawa 273: switch( id ) {
274: case SM_mathcap:
275: mathresult = (struct mathCap *)Sm1_mathcap();
276: oxPushMathCap(mathresult);
277: break;
278: case SM_setMathCap:
1.11 takayama 279: Sm1_setMathCap(ostreamOut);
1.1 maekawa 280: break;
281: case SM_pops:
282: Sm1_pops();
283: break;
284: case SM_getsp:
285: Sm1_getsp();
286: break;
287: case SM_dupErrors:
288: Sm1_dupErrors();
289: break;
1.3 takayama 290: case SM_pushCMOtag:
291: Sm1_pushCMOtag(SerialCurrent);
1.5 takayama 292: break;
1.1 maekawa 293: case SM_setName:
294: iresult = Sm1_setName();
295: if (iresult < 0) {
296: Sm1_pushError2(SerialCurrent,-1,"setName");
297: }
298: break;
299: case SM_evalName:
300: iresult = Sm1_evalName();
301: if (iresult < 0) {
302: Sm1_pushError2(SerialCurrent,-1,"evalName");
303: }
304: break;
305: case SM_executeStringByLocalParser:
306: OxCritical = 0;
1.13 takayama 307: if (NoExecution) {
308: iresult = 0;
309: }else{
310: iresult = Sm1_executeStringByLocalParser();
311: }
1.23 takayama 312: OxCritical = 1; mysignal(SIGUSR1,controlResetHandler);
1.1 maekawa 313: if (iresult < 0) {
314: emsg = Sm1_popErrorMessage("executeString: ");
315: Sm1_pushError2(SerialCurrent,-1,emsg);
316: return(-1);
317: }
318: break;
319: case SM_executeFunction:
320: OxCritical = 0;
1.13 takayama 321: if (NoExecution) {
322: iresult = 0;
323: }else{
324: iresult = Sm1_executeStringByLocalParser();
325: }
1.23 takayama 326: OxCritical = 1; mysignal(SIGUSR1,controlResetHandler);
1.1 maekawa 327: if (iresult < 0) {
328: emsg = Sm1_popErrorMessage("executeFunction: ");
1.14 takayama 329: Sm1_pushError2(SerialCurrent,-1,emsg);
330: return(-1);
331: }
332: break;
333: case SM_executeFunctionWithOptionalArgument:
334: OxCritical = 0;
335: if (NoExecution) {
336: iresult = 0;
337: }else{
338: iresult = Sm1_executeStringByLocalParser();
339: }
1.23 takayama 340: OxCritical = 1; mysignal(SIGUSR1,controlResetHandler);
1.14 takayama 341: if (iresult < 0) {
342: emsg = Sm1_popErrorMessage("executeFunctionWithOptionalArgument: ");
1.1 maekawa 343: Sm1_pushError2(SerialCurrent,-1,emsg);
344: return(-1);
345: }
346: break;
347: case SM_popCMO:
1.11 takayama 348: oxSendOXheader(ostreamOut,OX_DATA,SerialOX++);
349: n=Sm1_popCMO(ostreamOut,SerialCurrent);
1.1 maekawa 350: if (message) fprintf(stderr,"Done.\n");
351: break;
352: case SM_popString:
1.11 takayama 353: oxSendOXheader(ostreamOut,OX_DATA,SerialOX++);
354: oxSendCmoString(ostreamOut,Sm1_popString());
1.1 maekawa 355: if (message) fprintf(stderr,"Done.\n");
356: break;
357: case SM_shutdown:
1.5 takayama 358: fprintf(stderr,"Shutting down the engine.\n");
359: exit(0);
360: break;
1.1 maekawa 361: case SM_beginBlock:
362: case SM_endBlock:
363: fprintf(stderr,"This command has not yet been implemented.\n");
364: return(-1);
365: break;
1.24 takayama 366: case SM_nop:
367: break;
1.1 maekawa 368: default:
369: fprintf(stderr,"Fatal error. Unknown function_id %d\n",id);
370: return(-1);
371: break;
372: }
373: return(0);
374: }
375:
376:
1.25 ! takayama 377: int nullserver_simplest(int fd) {
1.1 maekawa 378: int c;
379: while(1) {
380: c = readOneByte(fd);
1.17 takayama 381: if (c == '@') { return 0; }
1.1 maekawa 382: }
383: }
384:
385:
386: void controlResetHandler(sig)
1.5 takayama 387: int sig;
1.1 maekawa 388: {
1.23 takayama 389: mysignal(sig,SIG_IGN);
1.8 takayama 390: cancelAlarm();
1.1 maekawa 391: fprintf(stderr,"From controlResetHandler. OxCritical = %d\n",OxCritical);
392: OxInterruptFlag = 1;
393: if (OxCritical) {
394: return;
395: }else{
1.15 takayama 396: (void) traceShowStack(); traceClearStack();
1.19 takayama 397: #if defined(__CYGWIN__) || defined(__MSYS__)
398: MYSIGLONGJMP(EnvOfChildServer,2); /* returns 2 for ctrl-C */
1.7 takayama 399: #else
1.20 takayama 400: MYLONGJMP(EnvOfChildServer,2); /* returns 2 for ctrl-C */
1.7 takayama 401: #endif
1.1 maekawa 402: }
403: }
404:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>