| version 1.6, 2001/08/09 22:13:58 | version 1.8, 2001/08/21 14:12:46 | 
|  |  | 
| /* $OpenXM: OpenXM/src/kan96xx/Kan/ext.c,v 1.5 2001/05/04 01:06:23 takayama Exp $ */ | /* $OpenXM: OpenXM/src/kan96xx/Kan/ext.c,v 1.7 2001/08/10 13:48:38 takayama Exp $ */ | 
| #include <stdio.h> | #include <stdio.h> | 
| #include <sys/types.h> | #include <sys/types.h> | 
| #include <sys/stat.h> | #include <sys/stat.h> | 
| 
| Line 188  struct object Kextension(struct object obj) |  | 
| Line 188  struct object Kextension(struct object obj) |  | 
| if (obj2.tag != Sarray) errorKan1("%s\n","[(forkExec) argList fdList sigblock] extension. array fdList."); | if (obj2.tag != Sarray) errorKan1("%s\n","[(forkExec) argList fdList sigblock] extension. array fdList."); | 
| obj3 = getoa(obj,3); | obj3 = getoa(obj,3); | 
| if (obj3.tag != Sinteger) errorKan1("%s\n","[(forkExec) argList fdList sigblock] extension. integer sigblock."); | if (obj3.tag != Sinteger) errorKan1("%s\n","[(forkExec) argList fdList sigblock] extension. integer sigblock."); | 
| m = KopInteger(obj3);  /* m == 1 : block ctrl-C. */ | m = KopInteger(obj3);  /* m&1 : block ctrl-C. */ | 
| argListc = getoaSize(obj1); | argListc = getoaSize(obj1); | 
| fdListc =  getoaSize(obj2); | fdListc =  getoaSize(obj2); | 
| if ((pid = fork()) > 0) { | if ((pid = fork()) > 0) { | 
| /* parent */ | /* parent */ | 
| if (m&3) { | if (m&2) { | 
| /* Do not call singal to turn around a trouble on cygwin. BUG. */ | /* Do not call singal to turn around a trouble on cygwin. BUG. */ | 
| }else{ | }else{ | 
| signal(SIGCHLD,mywait); /* to kill Zombie */ | signal(SIGCHLD,mywait); /* to kill Zombie */ | 
| 
| Line 212  struct object Kextension(struct object obj) |  | 
| Line 212  struct object Kextension(struct object obj) |  | 
| close(KopInteger(getoa(obj2,i))); | close(KopInteger(getoa(obj2,i))); | 
| } | } | 
| /* execl */ | /* execl */ | 
| if ((m&1) == 1) { | if (m&1) { | 
| { | { | 
| sigset_t sss; | sigset_t sss; | 
| sigemptyset(&sss); | sigemptyset(&sss); | 
| 
| Line 229  struct object Kextension(struct object obj) |  | 
| Line 229  struct object Kextension(struct object obj) |  | 
| argv[i] = KopString(getoa(obj1,i)); | argv[i] = KopString(getoa(obj1,i)); | 
| argv[i+1] = NULL; | argv[i+1] = NULL; | 
| } | } | 
|  |  | 
|  | if (m&4) { | 
|  | fprintf(stderr,"execv %s\n",argv[0]); | 
|  | sleep(5); | 
|  | fprintf(stderr,">>>\n"); | 
|  | } | 
| execv(argv[0],argv); | execv(argv[0],argv); | 
| /* This place will never be reached unless execv fails. */ | /* This place will never be reached unless execv fails. */ | 
| fprintf(stderr,"forkExec fails: "); | fprintf(stderr,"forkExec fails: "); | 
| 
| Line 273  struct object Kextension(struct object obj) |  | 
| Line 279  struct object Kextension(struct object obj) |  | 
| errorKan1("%s\n","The number must be 0, 1 or 2."); | errorKan1("%s\n","The number must be 0, 1 or 2."); | 
| putUserDictionary2(obj2.lc.str,(obj2.rc.op->lc).ival,(obj2.rc.op->rc).ival, | putUserDictionary2(obj2.lc.str,(obj2.rc.op->lc).ival,(obj2.rc.op->rc).ival, | 
| m,CurrentContextp->userDictionary); | m,CurrentContextp->userDictionary); | 
|  | }else if (strcmp(key,"ostype")==0) { | 
|  | rob = newObjectArray(1); | 
|  | /* Hard encode the OS type. */ | 
|  | #if defined(__CYGWIN__) | 
|  | putoa(rob,0,KpoString("windows")); | 
|  | #else | 
|  | putoa(rob,0,KpoString("unix")); | 
|  | #endif | 
| } | } | 
| #include "plugin.hh" | #include "plugin.hh" | 
| else{ | else{ |