=================================================================== RCS file: /home/cvs/OpenXM/src/kan96xx/Kan/shell.c,v retrieving revision 1.5 retrieving revision 1.13 diff -u -p -r1.5 -r1.13 --- OpenXM/src/kan96xx/Kan/shell.c 2003/12/04 05:27:19 1.5 +++ OpenXM/src/kan96xx/Kan/shell.c 2005/06/16 05:07:23 1.13 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM/src/kan96xx/Kan/shell.c,v 1.4 2003/12/03 23:26:39 takayama Exp $ */ +/* $OpenXM: OpenXM/src/kan96xx/Kan/shell.c,v 1.12 2004/10/14 10:08:09 takayama Exp $ */ #include #include #include @@ -41,7 +41,7 @@ static int AfterPt=0; static char *AfterDeleteFile[MAXFILES]; static int AfterD=0; -static int KeepTmpFiles = 1; +static int KeepTmpFiles = 0; extern int OX_P_stdin; extern int OX_P_stdout; @@ -53,54 +53,62 @@ struct object KoxShell(struct object ob) { /* A temporary help system */ void KoxShellHelp(char *key,FILE *fp) { - char *keys[]={"command","export","which","redirect","@@@@gatekeeper"}; + char *keys[]={"command","export","keep_tmp_files", + "killall","redirect","which","@@@@gatekeeper"}; int i; #define HSIZE 20 char *s[HSIZE]; if (key == NULL) { - fprintf(fp,"\n"); + fprintf(fp,"\n"); for (i=0; strcmp(keys[i],"@@@@gatekeeper") != 0; i++) { - fprintf(fp,"%s\n",keys[i]); - KoxShellHelp(keys[i],fp); - fprintf(fp,"\n",keys[i]); - } - return; + fprintf(fp,"%s\n",keys[i]); + KoxShellHelp(keys[i],fp); + fprintf(fp,"\n",keys[i]); + } + return; } for (i=0; i> or << which command-name path >>"); - } - return(rob); + if (n == 2) { + pathFinderErrorVerbose(0); + rob = KoxWhich(getoa(ob,1),KpoInteger(0)); + pathFinderErrorVerbose(-1); + }else if (n==3) { + pathFinderErrorVerbose(0); + rob = KoxWhich(getoa(ob,1),getoa(ob,2)); + pathFinderErrorVerbose(-1); + }else{ + errorKan1("%s\n","shell: << which command-name >> or << which command-name path >>"); + } + return(rob); }else if (strcmp(cmd,"export")==0) { - rob=oxsSetenv(ob); + rob=oxsSetenv(ob); + }else if (strcmp(cmd,"keep_tmp_files")==0) { + if (n != 2) errorKan1("%s\n","shell: << keep_tmp_files value >>"); + if (strcmp("0",KopString(getoa(ob,1))) == 0) { + KeepTmpFiles = 0; + }else{ + KeepTmpFiles = 1; + } + rob = KpoInteger(KeepTmpFiles); + }else if (strcmp(cmd,"killall")==0) { + /* It is called from ctrl-C hook of oxrfc103.sm1 */ + fprintf(stderr,"Killing all child processes (oxshell) ..."); + rob = KpoInteger(oxKillAll()); + fprintf(stderr,"\nDone.\n"); }else{ - rob = oxsExecuteBlocked(ob); + rob = oxsExecuteBlocked(ob); } return(rob); } /* Functions for ox_shell */ struct object KoxWhich(struct object cmdo,struct object patho) { - struct object rob; + struct object rob = OINIT; char *sss; rob = NullObject; if (cmdo.tag != Sdollar) errorKan1("%s\n","KoxWhich(str-obj,str-obj)"); @@ -152,9 +177,31 @@ struct object KoxWhich(struct object cmdo,struct objec return(rob); } +static int mysetenv(char *name, char *value, int overwrite); +static int myunsetenv(char *name); +static int mysetenv(char *name, char *value, int overwrite) { + char *s; + char *orig; + s = (char *)getenv(name); + if ((s == NULL) || overwrite) { + s = (char *) mymalloc(strlen(name)+strlen(value)+5); + if (s == 0) { fprintf(stderr,"No more memory.\n"); exit(10); } + strcpy(s,name); + strcat(s,"="); strcat(s,value); + return(putenv(s)); + } + return (0); +} + +/* bug on Solaris. It does not unsetenv. + libc4, libc5, glibc. It does unsetenv. */ +static myunsetenv(char *name) { + return(putenv(name)); +} + /* Example. [(export) (PATH) (=) (/usr/new/bin:$PATH)] */ static struct object oxsSetenv(struct object ob) { - struct object rob; + struct object rob = OINIT; int i,n; char *envp; char *new; @@ -164,26 +211,27 @@ static struct object oxsSetenv(struct object ob) { n = getoaSize(ob); if ((n != 4) && (n != 3)) errorKan1("%s\n","oxsSetenv requires an array of srings. Length must be 3 or 4."); for (i=0; i limit - 10) { - sold = s; limit *= 2; - s = (char *)mymalloc(limit); - if (s == NULL) errorKan1("%s\n","No more memory in oxsFileToVar()."); - strcpy(s,sold); - } + s[i] = c; s[i+1] = 0; + if (i > limit - 10) { + sold = s; limit *= 2; + s = (char *)mymalloc(limit); + if (s == NULL) errorKan1("%s\n","No more memory in oxsFileToVar()."); + strcpy(s,sold); + } i++; } fclose(fp); @@ -434,14 +488,14 @@ static char **oxsBuildArgv(struct object ob) { char *ext, *v; int usetmp=1; int win=0; - struct object ocmd; + struct object ocmd = OINIT; /* bug: win variable must be properly set on windows native. */ if (ob.tag != Sarray) errorKan1("%s\n","oxsBuildArgv() requires an array as an argument."); n = getoaSize(ob); for (i=0; i= MAXFILES) { - AfterPt=0; - errorKan1("%s\n","oxsBuildArgv(), Too may files to open."); - } - }else if (strcmp(type,"stringOut") == 0) { - argv[i] = generateTMPfileName2(v,ext,usetmp,win); - AfterDeleteFile[AfterD++] = argv[i]; - AfterReadFile[AfterPt] = argv[i]; - AfterSetVar[AfterPt] = v; - AfterPt++; - if (AfterPt >= MAXFILES) { - AfterPt=0; - errorKan1("%s\n","oxsBuildArgv(), Too may files to open."); - } - }else { - errorKan1("%s\n","This URI type has not yet been implemented."); - } - if (AfterD >= MAXFILES) { - AfterD=0; - errorKan1("%s\n","oxsBuildArgv(), Too may files to open."); - } - } + argv[i] = argv[i+1] = NULL; + s = KopString(getoa(ob,i)); + s = oxEvalEnvVar(s); + type = oxsIsURI(s); + if (type == NULL) { + argv[i] = s; + }else{ + /* Case when argv[i] is like "stringInOut:abc.poly" */ + v = oxsURIgetVarName(s); + ext = oxsURIgetExtension(s); + if (strcmp(type,"stringIn") == 0) { + argv[i] = oxsVarToFile(v,ext,argv[0],usetmp); + AfterDeleteFile[AfterD++] = argv[i]; + }else if (strcmp(type,"stringInOut") == 0) { + argv[i] = oxsVarToFile(v,ext,argv[0],usetmp); + AfterDeleteFile[AfterD++] = argv[i]; + AfterReadFile[AfterPt] = argv[i]; + AfterSetVar[AfterPt] = v; + AfterPt++; + if (AfterPt >= MAXFILES) { + AfterPt=0; + errorKan1("%s\n","oxsBuildArgv(), Too may files to open."); + } + }else if (strcmp(type,"stringOut") == 0) { + argv[i] = generateTMPfileName2(v,ext,usetmp,win); + AfterDeleteFile[AfterD++] = argv[i]; + AfterReadFile[AfterPt] = argv[i]; + AfterSetVar[AfterPt] = v; + AfterPt++; + if (AfterPt >= MAXFILES) { + AfterPt=0; + errorKan1("%s\n","oxsBuildArgv(), Too may files to open."); + } + }else { + errorKan1("%s\n","This URI type has not yet been implemented."); + } + if (AfterD >= MAXFILES) { + AfterD=0; + errorKan1("%s\n","oxsBuildArgv(), Too may files to open."); + } + } } return(argv); } @@ -512,33 +566,38 @@ static struct object oxsExecuteBlocked(struct object o { int r,i,n; char **argv; + int errorf; argv = oxsBuildArgv(ob); argv = oxsBuildArgvRedirect(argv); r=oxForkExecBlocked(argv); /* bug: what happen when NoX? */ /* if (1) { - for (i=0; argv[i] != NULL; i++) { - fprintf(stderr,"argv[%d]=%s\n",i,argv[i]); - } - errorKan1("%s\n","ForkExecBlocked failed."); + for (i=0; argv[i] != NULL; i++) { + fprintf(stderr,"argv[%d]=%s\n",i,argv[i]); + } + errorKan1("%s\n","ForkExecBlocked failed."); } */ + errorf=0; if (AfterPt > 0) { - for (i=0; i< AfterPt; i++) { - oxsFileToVar(AfterSetVar[i],AfterReadFile[i]); - } + for (i=0; i< AfterPt; i++) { + if (oxsFileToVar(AfterSetVar[i],AfterReadFile[i]) != 0) { + errorf=1; + } + } } AfterPt = 0; if (AfterD > 0) { - for (i=0; i< AfterD; i++) { - if (!KeepTmpFiles) { - oxDeleteFile(AfterDeleteFile[i]); + for (i=0; i< AfterD; i++) { + if (!KeepTmpFiles) { + oxDeleteFile(AfterDeleteFile[i]); } - } + } } AfterD = 0; + if (errorf) errorKan1("%s\n","Some errors in oxsFileToVar()."); return(KpoInteger(r)); } @@ -555,44 +614,44 @@ static char **oxsBuildArgvRedirect(char **argv) { j=0; /* bug: Critical area, do not make an interruption. */ for (i=0; i")==0) { - fname = argv[i+1]; - fp == NULL; - if (fname != NULL) { - fp = fopen(fname,"w"); - } + }else if (strcmp(argv[i],">")==0) { + fname = argv[i+1]; + fp == NULL; + if (fname != NULL) { + fp = fopen(fname,"w"); + } if (fp == NULL) { - oxResetRedirect(); - errorKan1("%s\n","oxsBuildArgvRedirect, cannot open the output file.\n"); - } - fclose(fp); /* touch */ - OX_P_stdout = open(fname,O_WRONLY); - i++; - }else if (strcmp(argv[i],"2>") == 0) { - fname = argv[i+1]; - fp == NULL; - if (fname != NULL) { - fp = fopen(fname,"w"); - } + oxResetRedirect(); + errorKan1("%s\n","oxsBuildArgvRedirect, cannot open the output file.\n"); + } + fclose(fp); /* touch */ + OX_P_stdout = open(fname,O_WRONLY); + i++; + }else if (strcmp(argv[i],"2>") == 0) { + fname = argv[i+1]; + fp == NULL; + if (fname != NULL) { + fp = fopen(fname,"w"); + } if (fp == NULL) { - oxResetRedirect(); - errorKan1("%s\n","oxsBuildArgvRedirect, cannot open the output (stderr) file.\n"); - } - fclose(fp); /* touch */ - OX_P_stderr = open(fname,O_WRONLY); - i++; - }else{ - newargv[j++] = argv[i]; - } + oxResetRedirect(); + errorKan1("%s\n","oxsBuildArgvRedirect, cannot open the output (stderr) file.\n"); + } + fclose(fp); /* touch */ + OX_P_stderr = open(fname,O_WRONLY); + i++; + }else{ + newargv[j++] = argv[i]; + } } return( newargv ); }