[BACK]Return to oxserver00.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / kxx

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>