Annotation of OpenXM/src/kxx/oxserver00.c, Revision 1.1
1.1 ! maekawa 1: /* nullserver01 */
! 2: #include <stdio.h>
! 3: #include <sys/types.h>
! 4: #include <sys/socket.h>
! 5: #include <sys/time.h>
! 6: #include <netinet/in.h>
! 7: #include <netdb.h>
! 8: #include <signal.h>
! 9: #include <setjmp.h>
! 10: /* -lnsl -lsocket /usr/ucblib/libucb.a */
! 11: #include "ox_kan.h"
! 12: #include "serversm.h"
! 13:
! 14: int OxCritical = 0;
! 15: int OxInterruptFlag = 0;
! 16: int PacketMonitor = 0;
! 17:
! 18: extern int SerialOX; /* Serial number of the packets sent. */
! 19: extern int SerialCurrent; /* Current Serial number of the recieved packet. */
! 20: extern int OXprintMessage; /* print oxmessages? */
! 21:
! 22: jmp_buf EnvOfChildServer;
! 23:
! 24: int JmpMessage = 0;
! 25:
! 26: static char *getSuffix(char *s);
! 27: main(int argc, char *argv[]) {
! 28: char *s;
! 29: char *forAsir[] = {"callsm1.sm1","callsm1b.sm1"};
! 30: char *gnuplot[] = {"callsm1.sm1","gnuplot.sm1"};
! 31: char *phc[] = {"callsm1.sm1","phc.sm1"};
! 32: char *tigers[] = {"callsm1.sm1","tigers.sm1"};
! 33: char *basicCD[] = {"basicCD.sm1"};
! 34: /* If you change the above, you need to change the argc of Sm1_start below.
! 35: */
! 36:
! 37: if (argc > 1) {
! 38: if (strcmp(argv[1],"-monitor")==0) {
! 39: fprintf(stderr,"Taking the packet monitor.\n");
! 40: PacketMonitor = 1;
! 41: }else{
! 42: fprintf(stderr,"Unknown option. Possible options are -monitor\n");
! 43: }
! 44: }
! 45: /* Load initialization files if necessary. */
! 46: s = getSuffix(argv[0]);
! 47: if (strcmp(s,"forAsir") == 0) {
! 48: Sm1_start(2,forAsir,"ox_sm1_forAsir");
! 49: }else if (strcmp(s,"gnuplot") == 0) {
! 50: Sm1_start(2,gnuplot,"ox_sm1_gnuplot");
! 51: }else if (strcmp(s,"phc") == 0) {
! 52: Sm1_start(2,phc,"ox_sm1_phc");
! 53: }else if (strcmp(s,"tigers") == 0) {
! 54: Sm1_start(2,tigers,"ox_sm1_tigers");
! 55: }else if (strcmp(s,"basicCD") == 0) {
! 56: Sm1_start(1,basicCD,"basicCD");
! 57: }else { /* Default */
! 58: Sm1_start(0, NULL, "ox_sm1");
! 59: }
! 60:
! 61: nullserver(3);
! 62: }
! 63:
! 64: static char *getSuffix(char *s) {
! 65: /* getSuffix("ox_sm1_forAsir") returns "forAsir" */
! 66: /* getSuffix("ox_sm1_gnuplot") returns "gnuplot" */
! 67: int n,i,k;
! 68: n = strlen(s);
! 69: for (i=n-1; i>=0; i--) {
! 70: if (s[i] == '_') {
! 71: return( s+i+1 );
! 72: }
! 73: }
! 74: return(s);
! 75: }
! 76: nullserver(int fdStream) {
! 77: int mtag;
! 78: int message = 1;
! 79: ox_stream ostream;
! 80: char sreason[1024];
! 81: extern void controlResetHandler();
! 82: extern jmp_buf EnvOfStackMachine;
! 83: int engineByteOrder;
! 84:
! 85: engineByteOrder = oxTellMyByteOrder(fdStream);
! 86: /* Set the network byte order. */
! 87: fprintf(stderr,"engineByteOrder=%x\n",engineByteOrder);
! 88:
! 89: if (fdStream != -1) {
! 90: ostream = fp2open(fdStream);
! 91: if (ostream == NULL) {
! 92: fprintf(stderr,"fp2open(fdStream) failed.\n");
! 93: fdStream = -1;
! 94: }
! 95: if (PacketMonitor) fp2watch(ostream,stdout);
! 96: }
! 97: aaa : ;
! 98: if (setjmp(EnvOfChildServer)) {
! 99: fprintf(stderr,"childServerMain: jump here.\n");
! 100: if (OxInterruptFlag == 0) {
! 101: fprintf(stderr," ?! \n"); fflush(NULL);
! 102: }
! 103: signal(SIGUSR1,controlResetHandler); goto aaa;
! 104: } else {
! 105: if (JmpMessage) fprintf(stderr,"Set EnvOfChildServer.\n");
! 106: signal(SIGUSR1,controlResetHandler);
! 107: }
! 108:
! 109: if (setjmp(EnvOfStackMachine)) {
! 110: fprintf(stderr,"childServerMain: jump here by EnvOfStackMachine.\n");
! 111: if (OxInterruptFlag == 0) {
! 112: fprintf(stderr," ?! \n"); fflush(NULL);
! 113: }
! 114: /* In case of error in the stack machine, pop the error info
! 115: and send the error packet. */
! 116: /* oxSendOXheader(ostream,OX_DATA,SerialOX++);
! 117: oxSendCmoError(ostream);
! 118: oxSendOXheader(ostream,OX_DATA,SerialOX++);
! 119: sprintf(sreason,"Jump here by sm1 error.");
! 120: oxSendCmoError2(ostream,sreason);
! 121: */
! 122: Sm1_pushError2(SerialCurrent,-1,"Global jump by sm1 error");
! 123:
! 124: signal(SIGUSR1,controlResetHandler); goto aaa ;
! 125: } else {
! 126: if (JmpMessage) fprintf(stderr,"Set EnvOfStackMachine.\n");
! 127: if (signal(SIGUSR1,SIG_IGN) != SIG_IGN) {
! 128: signal(SIGUSR1,controlResetHandler);
! 129: }
! 130: }
! 131:
! 132: while (1) {
! 133: message = OXprintMessage;
! 134: if (OxInterruptFlag) {
! 135: OxCritical = 1;
! 136: if (message) {fprintf(stderr,"Clearing the read buffer.\n");fflush(NULL); }
! 137: fp2clearReadBuf(ostream); /* clear the read buffer */
! 138: if (message) {fprintf(stderr,"Throwing OX_SYNC_BALL\n"); fflush(NULL);}
! 139: oxSendSyncBall(ostream);
! 140: if (message) {fprintf(stderr,"Waiting for OX_SYNC_BALL\n");fflush(NULL);}
! 141: oxWaitSyncBall(ostream);
! 142: if (message) {fprintf(stderr,"Done changing OX_SYNC_BALL\n"); fflush(NULL);}
! 143: OxInterruptFlag = 0;
! 144: OxCritical = 0;
! 145: goto aaa ;
! 146: }
! 147: OxCritical = 0;
! 148: if (fp2select(ostream,-1)) {
! 149: /* If there is an data in the ostream, then read data in the buffer and
! 150: read data in the communication stream. */
! 151: OxCritical = 1;
! 152: }else{
! 153: /* interrupted system call */
! 154: /* This part is never reached. */
! 155: }
! 156: OxCritical = 1;
! 157: mtag = oxGetOXheader(ostream,&SerialCurrent); /* get the message_tag */
! 158: if (message) {
! 159: fprintf(stderr,"\nmtag is %d (serial=%d) : ",mtag,SerialCurrent);
! 160: switch(mtag) {
! 161: case OX_COMMAND: fprintf(stderr," OX_COMMAND \n"); break;
! 162: case OX_DATA: fprintf(stderr," OX_DATA \n"); break;
! 163: case OX_SYNC_BALL: fprintf(stderr," OX_SYNC_BALL \n"); break;
! 164: case -1: fprintf(stderr," End of file. Exiting the server child.\n");
! 165: exit(); break;
! 166: default: fprintf(stderr," ?! \n"); break;
! 167: }
! 168: }
! 169: /*sleep(2); /* for dubug OX_SYNC_BALL */
! 170: switch(mtag) {
! 171: case OX_COMMAND:
! 172: nullserverCommand(ostream);
! 173: goto aaa ; /* We always reset the jump vector. cf. memo1.txt 1998 2/13*/
! 174: break;
! 175: case OX_DATA:
! 176: Sm1_pushCMO(ostream);
! 177: break;
! 178: case OX_SYNC_BALL:
! 179: /* if (OxInterruptFlag) think about it later. */
! 180: break;
! 181: default:
! 182: fprintf(stderr,"Fatal error in server.\n");
! 183: break;
! 184: }
! 185: }
! 186: }
! 187:
! 188: nullserverCommand(ox_stream ostream) {
! 189: int id;
! 190: int mtag;
! 191: int n;
! 192: char *name;
! 193: char *sresult;
! 194: struct mathCap *mathresult;
! 195: int iresult;
! 196: int message = 1;
! 197: char *emsg;
! 198: extern void controlResetHandler();
! 199:
! 200: message = OXprintMessage;
! 201: /* message_body */
! 202: id = oxGetInt32(ostream); /* get the function_id */
! 203: if (message) {fprintf(stderr,"\nfunction_id is %d\n",id);}
! 204: switch( id ) {
! 205: case SM_mathcap:
! 206: if (message) fprintf(stderr," mathcap\n");
! 207: mathresult = (struct mathCap *)Sm1_mathcap();
! 208: oxPushMathCap(mathresult);
! 209: break;
! 210: case SM_setMathCap:
! 211: if (message) fprintf(stderr," setMathCap\n");
! 212: Sm1_setMathCap(ostream);
! 213: break;
! 214: case SM_pops:
! 215: if (message) fprintf(stderr," pops \n");
! 216: Sm1_pops();
! 217: break;
! 218: case SM_getsp:
! 219: if (message) fprintf(stderr," getsp \n");
! 220: Sm1_getsp();
! 221: break;
! 222: case SM_dupErrors:
! 223: if (message) fprintf(stderr," dupErrors \n");
! 224: Sm1_dupErrors();
! 225: break;
! 226: case SM_setName:
! 227: if (message) fprintf(stderr," setName \n");
! 228: iresult = Sm1_setName();
! 229: if (iresult < 0) {
! 230: Sm1_pushError2(SerialCurrent,-1,"setName");
! 231: }
! 232: break;
! 233: case SM_evalName:
! 234: if (message) fprintf(stderr," evalName \n");
! 235: iresult = Sm1_evalName();
! 236: if (iresult < 0) {
! 237: Sm1_pushError2(SerialCurrent,-1,"evalName");
! 238: }
! 239: break;
! 240: case SM_executeStringByLocalParser:
! 241: if (message) fprintf(stderr," executeStringByLocalParser\n");
! 242: OxCritical = 0;
! 243: iresult = Sm1_executeStringByLocalParser();
! 244: OxCritical = 1; signal(SIGUSR1,controlResetHandler);
! 245: if (iresult < 0) {
! 246: emsg = Sm1_popErrorMessage("executeString: ");
! 247: Sm1_pushError2(SerialCurrent,-1,emsg);
! 248: return(-1);
! 249: }
! 250: break;
! 251: case SM_executeFunction:
! 252: if (message) fprintf(stderr," executeFunction\n");
! 253: OxCritical = 0;
! 254: iresult = Sm1_executeStringByLocalParser();
! 255: OxCritical = 1; signal(SIGUSR1,controlResetHandler);
! 256: if (iresult < 0) {
! 257: emsg = Sm1_popErrorMessage("executeFunction: ");
! 258: Sm1_pushError2(SerialCurrent,-1,emsg);
! 259: return(-1);
! 260: }
! 261: break;
! 262: case SM_popCMO:
! 263: if (message) fprintf(stderr,"popCMO. Start to sending data.\n",n);
! 264: oxSendOXheader(ostream,OX_DATA,SerialOX++);
! 265: n=Sm1_popCMO(ostream,SerialCurrent);
! 266: if (message) fprintf(stderr,"Done.\n");
! 267: break;
! 268: case SM_popString:
! 269: if (message) fprintf(stderr,"popString. send data from the stack.\n",n);
! 270: oxSendOXheader(ostream,OX_DATA,SerialOX++);
! 271: oxSendCmoString(ostream,Sm1_popString());
! 272: if (message) fprintf(stderr,"Done.\n");
! 273: break;
! 274: case SM_shutdown:
! 275: case SM_beginBlock:
! 276: case SM_endBlock:
! 277: fprintf(stderr,"This command has not yet been implemented.\n");
! 278: return(-1);
! 279: break;
! 280: default:
! 281: fprintf(stderr,"Fatal error. Unknown function_id %d\n",id);
! 282: return(-1);
! 283: break;
! 284: }
! 285: return(0);
! 286: }
! 287:
! 288:
! 289: nullserver_simplest(int fd) {
! 290: int c;
! 291: while(1) {
! 292: c = readOneByte(fd);
! 293: if (c == '@') { return; }
! 294: }
! 295: }
! 296:
! 297:
! 298: void controlResetHandler(sig)
! 299: int sig;
! 300: {
! 301: signal(sig,SIG_IGN);
! 302: fprintf(stderr,"From controlResetHandler. OxCritical = %d\n",OxCritical);
! 303: OxInterruptFlag = 1;
! 304: if (OxCritical) {
! 305: return;
! 306: }else{
! 307: longjmp(EnvOfChildServer,2); /* returns 2 for ctrl-C */
! 308: }
! 309: }
! 310:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>