/* $OpenXM: OpenXM/src/kan96xx/Kan/ext.c,v 1.29 2004/09/12 01:32:08 takayama Exp $ */ #include #include #include #include #include #include #include #include "datatype.h" #include "stackm.h" #include "extern.h" #include "extern2.h" #include #include "plugin.h" #include "kclass.h" #include #include #include "ox_pathfinder.h" extern int Quiet; extern char **environ; #define MYCP_SIZE 100 static int Mychildren[MYCP_SIZE]; static int Mycp = 0; static int Verbose_mywait = 0; static void mywait() { int status; int pid; int i,j; /* signal(SIGCHLD,SIG_IGN); */ pid = wait(&status); if ((!Quiet) && (Verbose_mywait)) fprintf(stderr,"Child process %d is exiting.\n",pid); for (i=0; i 0) Mycp--; } } signal(SIGCHLD,mywait); } #define SIZE_OF_ENVSTACK 5 #if defined(__CYGWIN__) #define JMP_BUF sigjmp_buf #else #define JMP_BUF jmp_buf #endif static JMP_BUF EnvStack[SIZE_OF_ENVSTACK]; static int Envp = 0; static void pushEnv(JMP_BUF jb) { if (Envp < SIZE_OF_ENVSTACK) { *(EnvStack[Envp]) = *jb; Envp++; }else{ fprintf(stderr,"Overflow of EnvStack.\n"); exit(2); } } static void popEnv(JMP_BUF jbp) { if (Envp <= 0) { fprintf(stderr,"Underflow of EnvStack.\n"); exit(3); }else{ Envp--; *jbp = *EnvStack[Envp]; } } static char *ext_generateUniqueFileName(char *s) { char *t; int i; struct stat statbuf; t = (char *)sGC_malloc(sizeof(char)*strlen(s)+4+2); for (i=0; i<1000; i++) { /* Give up if we failed for 1000 names. */ sprintf(t,"%s.%d",s,i); /* if (phc_overwrite) return(t); */ if (stat(t,&statbuf) < 0) { return(t); } } errorKan1("%s\n","ext_generateUniqueFileName: could not generate a unique file name. Exhausted all the names."); return(NULL); } struct object Kextension(struct object obj) { char *key; int size; struct object keyo; struct object rob = NullObject; struct object obj1,obj2,obj3,obj4; int m,i,pid, uid; int argListc, fdListc; char *abc; char *abc2; extern struct context *CurrentContextp; #if (__CYGWIN__) extern sigjmp_buf EnvOfStackMachine; #else extern jmp_buf EnvOfStackMachine; #endif extern void ctrlC(); extern int SigIgn; extern int DebugCMO; extern int OXprintMessage; struct stat buf; char **argv; FILE *fp; void (*oldsig)(); extern SecureMode; extern char *UD_str; extern int UD_attr; if (obj.tag != Sarray) errorKan1("%s\n","Kextension(): The argument must be an array."); size = getoaSize(obj); if (size < 1) errorKan1("%s\n","Kextension(): Empty array."); keyo = getoa(obj,0); if (keyo.tag != Sdollar) errorKan1("%s\n","Kextension(): No key word."); key = KopString(keyo); /* branch by they key word. */ if (strcmp(key,"parse")==0) { if (size != 2) errorKan1("%s\n","[(parse) string] extension."); obj1 = getoa(obj,1); if (obj1.tag != Sdollar) errorKan1("%s\n","[(parse) string] extension"); pushEnv(EnvOfStackMachine); m = KSexecuteString(obj1.lc.str); /* This is critical area. If you catch ctrl-c here, program crashes. */ oldsig = signal(SIGINT,SIG_IGN); popEnv(EnvOfStackMachine); /* OK! We passed the critical area. */ signal(SIGINT,oldsig); rob = KpoInteger(m); }else if (strcmp(key,"getpid") == 0) { rob = KpoInteger( (int) getpid() ); }else if (strcmp(key,"flush") == 0) { /* fflush(NULL); */ fflush(stdout); rob.tag = Snull; }else if (strcmp(key,"chattrs")==0) { if (size != 2) errorKan1("%s\n","[(chattrs) num] extension."); obj1 = getoa(obj,1); if (obj1.tag != Sinteger) errorKan1("%s\n","[(chattrs) num] extension."); m = KopInteger(obj1); /* if (!( m == 0 || m == PROTECT || m == ABSOLUTE_PROTECT || m == ATTR_INFIX)) errorKan1("%s\n","The number must be 0, 1 or 2.");*/ putUserDictionary2((char *)NULL,0,0,m | SET_ATTR_FOR_ALL_WORDS, CurrentContextp->userDictionary); }else if (strcmp(key,"keywords")==0) { if (size != 1) errorKan1("%s\n","[(keywords)] extension."); rob = showSystemDictionary(1); /* }else if (strcmp(key,"fork0")==0) { if (size != 2) errorKan1("%s\n","[(fork0) sss] extension."); m = fork(); if (m>0) { rob = KpoInteger(m); } else { system(KopString(getoa(obj,1))); exit(0); } */ }else if (strcmp(key,"defaultPolyRing")==0) { if (size != 2) errorKan1("%s\n","[(defaultPolyRing) n] extension."); rob = KdefaultPolyRing(getoa(obj,1)); }else if (strcmp(key,"getenv")==0) { if (size != 2) errorKan1("%s\n","[(getenv) envstr] extension."); obj1 = getoa(obj,1); if (obj1.tag != Sdollar) errorKan1("%s\n","[(getenv) envstr] extension"); abc = getenv(KopString(obj1)); #if defined(__CYGWIN__) if (abc == NULL) { abc2 = (char *)sGC_malloc(sizeof(char)*(strlen(KopString(obj1))+2)); strcpy(abc2,KopString(obj1)); for (i=0; i 0) { /* parent */ if (m&2) { /* Do not call singal to turn around a trouble on cygwin. BUG. */ }else{ signal(SIGCHLD,mywait); /* to kill Zombie */ } Mychildren[Mycp++] = pid; if (Mycp >= MYCP_SIZE-1) { errorKan1("%s\n","Child process table is full.\n"); Mycp = 0; } rob = KpoInteger(pid); /* Done */ }else{ /* Child */ for (i=0; i>>\n"); } execve(argv[0],argv,environ); /* This place will never be reached unless execv fails. */ fprintf(stderr,"forkExec fails: "); for (i=0; ilc).ival,(obj2.rc.op->rc).ival, m,CurrentContextp->userDictionary); }else if (strcmp(key,"or_attr")==0) { if (size != 3) errorKan1("%s\n","[(or_attr) num symbol] extension."); obj1 = getoa(obj,1); obj2 = getoa(obj,2); if (obj1.tag != Sinteger) errorKan1("%s\n","[(or_attr) num symbol] extension."); if (obj2.tag != Sstring) errorKan1("%s\n","[(or_attr) num symbol] extension."); m = KopInteger(obj1); rob = KfindUserDictionary(obj2.lc.str); if (rob.tag != NoObject.tag) { if (strcmp(UD_str,obj2.lc.str) == 0) { m |= UD_attr; }else errorKan1("%s\n","or_attr: internal error."); } rob = KpoInteger(m); putUserDictionary2(obj2.lc.str,(obj2.rc.op->lc).ival,(obj2.rc.op->rc).ival, m,CurrentContextp->userDictionary); }else if (strcmp(key,"getattr")==0) { if (size != 2) errorKan1("%s\n","[(getattr) symbol] extension."); obj1 = getoa(obj,1); if (obj1.tag != Sstring) errorKan1("%s\n","[(getattr) symbol] extension."); rob = KfindUserDictionary(obj1.lc.str); if (rob.tag != NoObject.tag) { if (strcmp(UD_str,obj1.lc.str) == 0) { rob = KpoInteger(UD_attr); }else errorKan1("%s\n","getattr: internal error."); }else rob = NullObject; }else if (strcmp(key,"getServerEnv")==0) { if (size != 2) errorKan1("%s\n","[(getServerEnv) serverName] extension."); obj1 = getoa(obj,1); if (obj1.tag != Sdollar) errorKan1("%s\n","[(getServerEnv) serverName] extension."); { char **se; int ii; int nn; se = getServerEnv(KopString(obj1)); if (se == NULL) { debugServerEnv(KopString(obj1)); rob = NullObject; }else{ for (ii=0,nn=0; se[ii] != NULL; ii++) nn++; rob = newObjectArray(nn); for (ii=0; ii