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