Annotation of OpenXM/src/kan96xx/Kan/shell.c, Revision 1.15
1.15 ! takayama 1: /* $OpenXM: OpenXM/src/kan96xx/Kan/shell.c,v 1.14 2005/07/03 11:08:54 ohara Exp $ */
1.1 takayama 2: #include <stdio.h>
1.14 ohara 3: #include <string.h>
1.1 takayama 4: #include <sys/types.h>
5: #include <sys/stat.h>
6: #include <fcntl.h>
7: #include <stdlib.h>
8: #include <unistd.h>
9: #include <sys/wait.h>
10: #include "datatype.h"
11: #include "stackm.h"
12: #include "extern.h"
13: #include "extern2.h"
14: #include <signal.h>
15: #include "plugin.h"
16: #include "kclass.h"
17: #include <ctype.h>
18: #include "ox_pathfinder.h"
19:
1.2 takayama 20: static struct object KoxShell_test1(struct object ob);
1.3 takayama 21: static struct object oxsExecuteBlocked(struct object ob);
22: static struct object oxsSetenv(struct object ob);
23: static char *oxsIsURI(char *s);
24: static char *oxsURIgetVarName(char *s);
25: static char *oxsURIgetExtension(char *s);
1.5 takayama 26: static char *oxsURIgetFileName(char *s);
27: static char *oxsRemoveOpt(char *s);
28: static char *oxsGetOpt(char *s);
1.3 takayama 29: static char *oxsVarToFile(char *v,char *extension,char *comamnd,int tmp);
30: static int oxsFileToVar(char *v,char *fname);
31: static char **oxsBuildArgv(struct object ob);
1.5 takayama 32: static char **oxsBuildArgvRedirect(char **argv);
1.3 takayama 33: static struct object testmain(struct object ob);
34:
35: #define mymalloc(n) sGC_malloc(n)
36: #define nomemory(n) errorKan1("%s\n","No more memory in shell.c");
37:
38: #define MAXFILES 256
39: static char *AfterReadFile[MAXFILES];
40: static char *AfterSetVar[MAXFILES];
41: static int AfterPt=0;
42: static char *AfterDeleteFile[MAXFILES];
43: static int AfterD=0;
1.2 takayama 44:
1.8 takayama 45: static int KeepTmpFiles = 0;
1.5 takayama 46:
47: extern int OX_P_stdin;
48: extern int OX_P_stdout;
49: extern int OX_P_stderr;
50:
1.2 takayama 51: struct object KoxShell(struct object ob) {
52: return KoxShell_test1(ob);
53: }
54:
1.3 takayama 55: /* A temporary help system */
56: void KoxShellHelp(char *key,FILE *fp) {
1.7 takayama 57: char *keys[]={"command","export","keep_tmp_files",
58: "killall","redirect","which","@@@@gatekeeper"};
1.3 takayama 59: int i;
60: #define HSIZE 20
61: char *s[HSIZE];
62: if (key == NULL) {
1.6 takayama 63: fprintf(fp,"\n");
1.3 takayama 64: for (i=0; strcmp(keys[i],"@@@@gatekeeper") != 0; i++) {
1.6 takayama 65: fprintf(fp,"%s\n",keys[i]);
66: KoxShellHelp(keys[i],fp);
67: fprintf(fp,"\n",keys[i]);
68: }
69: return;
1.3 takayama 70: }
71: for (i=0; i<HSIZE; i++) s[i] = NULL;
72: if (strcmp(key,"export")==0) {
1.6 takayama 73: s[0] = "export env_name = value";
74: s[1] = "export env_name = ";
75: s[2] = "Example: [(export) (PATH) (=) (/usr/new/bin:${PATH})] oxshell";
76: s[3] = NULL;
1.3 takayama 77: }else if (strcmp(key,"which")==0) {
1.6 takayama 78: s[0] = "which cmd_name";
79: s[1] = "which cmd_name path";
80: s[2] = "Example: [(which) (ls)] oxshell";
1.3 takayama 81: s[3] = NULL;
82: }else if (strcmp(key,"command")==0) {
1.6 takayama 83: s[0] = "Executing a command";
84: s[1] = "cmdname arg1 arg2 ... ";
85: s[2] = "Example 1: /afo (Hello! ) def [(cat) (stringIn://afo)] oxshell";
86: s[3] = "Example 2: [(polymake) (stringInOut://afo.poly) (FACETS)] oxshell";
1.3 takayama 87: s[4] = NULL;
1.5 takayama 88: }else if (strcmp(key,"redirect")==0) {
1.6 takayama 89: s[0] = "The following redirect operators are implemented.";
90: s[1] = "< > 2>";
91: s[2] = "Example 1: [(ls) (hoge) (2>) (stringOut://afo)] oxshell\n afo ::";
92: s[3] = "Example 2: [(cp) ] addStdoutStderr oxshell\n [@@@stdout @@@stderr] ::";
1.5 takayama 93: s[4] = NULL;
1.7 takayama 94: }else if (strcmp(key,"killall")==0) {
95: s[0] = "Kill all the processes envoked by oxshell";
96: s[1] = NULL;
97: }else if (strcmp(key,"keep_tmp_files")==0) {
98: s[0] = "keep_tmp_files value";
99: s[1] = "If value is zero, then temporary files are removed after execution.";
1.15 ! takayama 100: s[2] = "Example 1: [(keep_tmp_files) (1)] oxshell ; temporary files will be kept in /tmp or $TMP or ...";
! 101: s[3] = NULL;
1.3 takayama 102: }else{
103: }
104: i = 0;
105: while (s[i] != NULL) {
1.6 takayama 106: fprintf(fp,"%s\n",s[i++]);
1.3 takayama 107: }
108: }
109:
110:
1.2 takayama 111: static struct object KoxShell_test1(struct object ob) {
112: /* A simple shell. It does not implement a parser. */
1.13 takayama 113: struct object rob = OINIT;
1.2 takayama 114: char *cmd;
115: char *arg1,*arg2;
116: int i,n;
117: rob = NullObject; cmd = NULL; arg1=NULL; arg2=NULL;
118: if (ob.tag != Sarray) errorKan1("%s\n","KoxShell requires an array as an argument.");
119: n = getoaSize(ob);
120: for (i=0; i<n; i++) {
1.6 takayama 121: if (getoa(ob,i).tag != Sdollar) errorKan1("%s\n","KoxShell requires an array of string as an argument.");
1.2 takayama 122: }
123:
124: if (n == 0) return(rob);
125: cmd = KopString(getoa(ob,0));
1.3 takayama 126: if (strcmp(cmd,"testmain")==0) {
127: rob = testmain(ob);
128: }else if (strcmp(cmd,"which")==0) {
1.6 takayama 129: if (n == 2) {
1.12 takayama 130: pathFinderErrorVerbose(0);
1.6 takayama 131: rob = KoxWhich(getoa(ob,1),KpoInteger(0));
1.12 takayama 132: pathFinderErrorVerbose(-1);
1.6 takayama 133: }else if (n==3) {
1.12 takayama 134: pathFinderErrorVerbose(0);
1.6 takayama 135: rob = KoxWhich(getoa(ob,1),getoa(ob,2));
1.12 takayama 136: pathFinderErrorVerbose(-1);
1.6 takayama 137: }else{
138: errorKan1("%s\n","shell: << which command-name >> or << which command-name path >>");
139: }
140: return(rob);
1.2 takayama 141: }else if (strcmp(cmd,"export")==0) {
1.6 takayama 142: rob=oxsSetenv(ob);
1.7 takayama 143: }else if (strcmp(cmd,"keep_tmp_files")==0) {
144: if (n != 2) errorKan1("%s\n","shell: << keep_tmp_files value >>");
145: if (strcmp("0",KopString(getoa(ob,1))) == 0) {
146: KeepTmpFiles = 0;
147: }else{
148: KeepTmpFiles = 1;
149: }
150: rob = KpoInteger(KeepTmpFiles);
151: }else if (strcmp(cmd,"killall")==0) {
152: /* It is called from ctrl-C hook of oxrfc103.sm1 */
153: fprintf(stderr,"Killing all child processes (oxshell) ...");
154: rob = KpoInteger(oxKillAll());
155: fprintf(stderr,"\nDone.\n");
1.2 takayama 156: }else{
1.6 takayama 157: rob = oxsExecuteBlocked(ob);
1.2 takayama 158: }
159: return(rob);
160: }
1.1 takayama 161:
162: /* Functions for ox_shell */
163: struct object KoxWhich(struct object cmdo,struct object patho) {
1.13 takayama 164: struct object rob = OINIT;
1.1 takayama 165: char *sss;
166: rob = NullObject;
167: if (cmdo.tag != Sdollar) errorKan1("%s\n","KoxWhich(str-obj,str-obj)");
168: if (patho.tag == Sdollar) {
169: sss=oxWhich(KopString(cmdo),KopString(patho));
170: if (sss != NULL) rob=KpoString(sss);
171: else{
172: sss=getCommandPath(KopString(cmdo));
173: if (sss != NULL) rob=KpoString(sss);
174: }
175: }else{
176: sss=getCommandPath(KopString(cmdo));
177: if (sss != NULL) rob=KpoString(sss);
178: }
179: return(rob);
180: }
181:
1.10 takayama 182: static int mysetenv(char *name, char *value, int overwrite);
183: static int myunsetenv(char *name);
184: static int mysetenv(char *name, char *value, int overwrite) {
185: char *s;
186: char *orig;
187: s = (char *)getenv(name);
188: if ((s == NULL) || overwrite) {
1.11 takayama 189: s = (char *) mymalloc(strlen(name)+strlen(value)+5);
1.10 takayama 190: if (s == 0) { fprintf(stderr,"No more memory.\n"); exit(10); }
191: strcpy(s,name);
192: strcat(s,"="); strcat(s,value);
193: return(putenv(s));
194: }
195: return (0);
196: }
197:
198: /* bug on Solaris. It does not unsetenv.
199: libc4, libc5, glibc. It does unsetenv. */
200: static myunsetenv(char *name) {
201: return(putenv(name));
202: }
203:
1.3 takayama 204: /* Example. [(export) (PATH) (=) (/usr/new/bin:$PATH)] */
205: static struct object oxsSetenv(struct object ob) {
1.13 takayama 206: struct object rob = OINIT;
1.3 takayama 207: int i,n;
208: char *envp;
209: char *new;
210: int r;
211: rob = NullObject;
212: if (ob.tag != Sarray) errorKan1("%s\n","oxsSetenv requires an array of srings.");
213: n = getoaSize(ob);
214: if ((n != 4) && (n != 3)) errorKan1("%s\n","oxsSetenv requires an array of srings. Length must be 3 or 4.");
215: for (i=0; i<n; i++) {
1.6 takayama 216: if (getoa(ob,i).tag != Sdollar) errorKan1("%s\n","oxsSetenv requires an array of srings. Length must be 3 or 4.");
1.3 takayama 217: }
218:
219: if (strcmp(KopString(getoa(ob,2)),"=") != 0) {
1.6 takayama 220: errorKan1("%s\n","oxsSetenv, example [(export) (PATH) (=) (/usr/new/bin:$PATH)] oxshell");
1.3 takayama 221: }
222: envp = KopString(getoa(ob,1));
223: if (n == 4) {
1.6 takayama 224: new = KopString(getoa(ob,3));
225: /* printf("%s\n",new); */
226: new = oxEvalEnvVar(new);
227: /* printf("%s\n",new); */
1.10 takayama 228: r = mysetenv(envp,new,1);
1.3 takayama 229: }else{
1.10 takayama 230: myunsetenv(envp); r = 0;
231: /* bug: On Solaris, unsetenv will not work. */
1.3 takayama 232: }
233: if (r != 0) errorKan1("%s\n","setenv failed.");
234: new = (char *) getenv(envp);
235: if (new != NULL) {
1.6 takayama 236: rob = KpoString((char *) getenv(envp));
1.3 takayama 237: }
238: return(rob);
239: }
240:
241: /* s="stringIn://abc.poly" ==> stringIn
242: s="stringInOut://abc.poly" ==> stringInOut
243: */
244: char *oxsIsURI(char *s) {
245: int n,i,j;
246: char *u;
247: if (s == NULL) return((char *)NULL);
1.5 takayama 248: s = oxsRemoveOpt(s);
1.3 takayama 249: n = strlen(s);
250: for (i=0; i<n-3;i++) {
251: if ((s[i] == ':') && (s[i+1] == '/') && (s[i+2] == '/')) {
252: u = (char *) mymalloc(i+1);
253: if (u == NULL) nomemory(1);
254: u[0]=0;
255: for (j=0; j<i; j++) {
256: u[j] = s[j]; u[j+1]=0;
257: }
258: return(u);
259: }
260: }
261: return(NULL);
262: }
1.1 takayama 263:
1.3 takayama 264: /* s="stringIn://abc.poly" ==> abc
265: s="stringInOut://abc.poly" ==> abc
266: s="stringInOut://abc" ==> abc
267: */
268: char *oxsURIgetVarName(char *s) {
269: int n,i,j;
270: char *u;
271: if (s == NULL) return((char *)NULL);
1.5 takayama 272: s = oxsRemoveOpt(s);
1.3 takayama 273: n = strlen(s);
274: for (i=0; i<n-3;i++) {
275: if ((s[i] == ':') && (s[i+1] == '/') && (s[i+2] == '/')) {
276: u = (char *) mymalloc(n-i+1);
277: if (u == NULL) nomemory(1);
278: u[0]=0;
279: for (j=i+3; j<n; j++) {
280: if (s[j] == '.') break;
281: u[j-i-3] = s[j]; u[j-i-3+1]=0;
282: }
283: return(u);
284: }
285: }
286: return(NULL);
287: }
288:
289: /* s="stringIn://abc.poly" ==> poly
290: s="stringInOut://abc.poly" ==> poly
291: s="stringInOut://abc" ==> NULL
292: */
293: char *oxsURIgetExtension(char *s) {
294: int n,i,j,k;
295: char *u;
296: if (s == NULL) return((char *)NULL);
1.5 takayama 297: s = oxsRemoveOpt(s);
1.3 takayama 298: n = strlen(s);
299: for (i=0; i<n-3;i++) {
300: if ((s[i] == ':') && (s[i+1] == '/') && (s[i+2] == '/')) {
301: for (j=i+3; j<n; j++) {
302: if (s[j] == '.') {
303: u = (char *) mymalloc(n-j+2);
304: if (u == NULL) nomemory(1);
305: u[0]=0;
306: for (k=j+1; k<n; k++) {
307: u[k-j-1] = s[k]; u[k-j] = 0;
308: }
309: return(u);
310: }
311: }
312: }
313: }
314: return(NULL);
315: }
316:
1.5 takayama 317: /* stringInOut://abc.poly=:file://pqr.txt */
318: static char *oxsRemoveOpt(char *s) {
319: int n,i,j;
320: char *u;
321: if (s == NULL) return((char *)NULL);
322: n = strlen(s);
323: for (i=0; i<n-1;i++) {
324: if ((s[i] == '=') && (s[i+1] == ':')) {
325: u = (char *) mymalloc(i+1);
326: if (u == NULL) nomemory(1);
327: u[0]=0;
328: for (j=0; j<i; j++) {
329: u[j] = s[j]; u[j+1]=0;
330: }
331: return(u);
332: }
333: }
334: return(s);
335: }
336:
337: /* stringInOut://abc.poly=:file://pqr.txt */
338: /* stringInOut://abc.poly */
339: char *oxsGetOpt(char *s) {
340: int n,i,j;
341: char *u;
342: if (s == NULL) return((char *)NULL);
343: n = strlen(s);
344: for (i=0; i<n-1;i++) {
345: if ((s[i] == '=') && (s[i+1] == ':')) {
346: u = (char *) mymalloc(n-i+1);
347: if (u == NULL) nomemory(1);
348: u[0]=0;
349: for (j=i+2; j<n; j++) {
350: u[j-i-2] = s[j]; u[j-i-2+1]=0;
351: }
352: return(u);
353: }
354: }
355: return(NULL);
356: }
357:
358: char *oxsURIgetFileName(char *s) {
359: int n,i,j;
360: char *u;
361: if (s == NULL) return((char *)NULL);
362: s = oxsRemoveOpt(s);
363: n = strlen(s);
364: for (i=0; i<n-3;i++) {
365: if ((s[i] == ':') && (s[i+1] == '/') && (s[i+2] == '/')) {
366: u = (char *) mymalloc(n-i+1);
367: if (u == NULL) nomemory(1);
368: u[0]=0;
369: for (j=i+3; j<n; j++) {
370: u[j-i-3] = s[j]; u[j-i-3+1]=0;
371: }
372: return(u);
373: }
374: }
375: return(NULL);
376: }
377:
378:
1.3 takayama 379: static struct object testmain(struct object ob) {
1.13 takayama 380: struct object rob = OINIT;
1.3 takayama 381: char *s;
1.13 takayama 382: struct object ot = OINIT;
1.3 takayama 383: char **av;
384: int i;
385: rob = NullObject;
386:
387: /* Try sm1 -s " /hoge (hogehoge) def [(testmain)] oxshell afo message " */
388:
389: ot = newObjectArray(3);
390: getoa(ot,0)=KpoString("cat");
391: getoa(ot,1)=KpoString("stringInOut://hoge.poly");
392: getoa(ot,2)=KpoString("${HOME}/t.t");
393: av=oxsBuildArgv(ot);
394: for (i=0; av[i] != NULL; i++) {
1.6 takayama 395: printf("%s\n",av[i]);
1.3 takayama 396: }
397: printf("------------------------------\n");
398:
399: s=oxsVarToFile("hoge","poly","polymake",0);
400: printf("%s\n",s);
401: oxsFileToVar("afo",s);
402: return(rob);
403: }
404:
405: char *oxsVarToFile(char *v,char *ext,char *command,int usetmp) {
406: char *fname;
407: int winname;
408: FILE *fp;
409: int n,i,prevc,c;
410: char *prog;
1.13 takayama 411: struct object vv = OINIT;
1.3 takayama 412:
413: /*bug; winname must be automatically set by looking at command.
414: If command is win32-native-application, then winname=1; else winname=0.
415: For example, if command=="gnuplot32" then winmame=1; else winname=0;
416: */
417: winname = 0;
418:
419: fname = generateTMPfileName2(v,ext,usetmp,winname);
420: if (fname == NULL) errorKan1("%s\n","generateTMPfileName2() is failed.");
421: if (v == NULL) errorKan1("%s\n","oxsVarToFile(), v is NULL.");
422: vv = KfindUserDictionary(v);
423: if (vv.tag != Sdollar) errorKan1("%s\n","oxsVarToFile(), value is not a string object or the object is not found in the dictionary.");
424: prog = KopString(vv);
425:
426: fp = fopen(fname,"w");
427: if (fp == NULL) errorKan1("%s\n","oxsVarToFile(), fail to open a file.");
428: n = strlen(prog);
429: prevc = 0;
430: for (i=0; i<n ; i++) {
1.6 takayama 431: c = prog[i];
432: if (winname) {
433: if ((c == '\n') && (prevc != 0xd)) {
434: fputc(0xd,fp); fputc(c,fp);
435: }
436: }else{
437: fputc(c,fp);
438: }
439: prevc = c;
1.3 takayama 440: }
441: if (fclose(fp) != 0) errorKan1("%s\n","oxsVarToFile(), fail to close the file.");
442:
443: return(fname);
444: }
445:
446: int oxsFileToVar(char *v,char *fname) {
447: FILE *fp;
448: char *s, *sold;
449: int limit;
450: int c,i;
451:
1.9 takayama 452: if (v == NULL) {
453: /* errorKan1("%s\n","oxsFileToVar(), v is NULL."); */
454: fprintf(stderr,"oxsFileToVar(), v is NULL.");
455: return(-1);
456: }
1.3 takayama 457: limit = 1024;
458: fp = fopen(fname,"r");
459: if (fp == NULL) {
1.6 takayama 460: fprintf(stderr,"Filename=%s\n",fname);
1.9 takayama 461: /* errorKan1("%s\n","oxsFileToVar(), the file cannot be opened."); */
462: fprintf(stderr,"oxsFileToVar(), the file cannot be opened.");
463: return(-1);
1.3 takayama 464: }
465: s = (char *)mymalloc(limit);
466: if (s == NULL) errorKan1("%s\n","No more memory in oxsFileToVar().");
467:
468: i = 0;
469: while ((c=fgetc(fp)) != EOF) {
1.6 takayama 470: s[i] = c; s[i+1] = 0;
471: if (i > limit - 10) {
472: sold = s; limit *= 2;
473: s = (char *)mymalloc(limit);
474: if (s == NULL) errorKan1("%s\n","No more memory in oxsFileToVar().");
475: strcpy(s,sold);
476: }
1.3 takayama 477: i++;
478: }
479: fclose(fp);
480:
481: KputUserDictionary(v,KpoString(s));
482: return(0);
483: }
484:
485: static char **oxsBuildArgv(struct object ob) {
486: int n,i;
487: char **argv;
488: char *s;
489: char *type;
490: char *ext, *v;
491: int usetmp=1;
492: int win=0;
1.13 takayama 493: struct object ocmd = OINIT;
1.3 takayama 494:
495: /* bug: win variable must be properly set on windows native. */
496:
497: if (ob.tag != Sarray) errorKan1("%s\n","oxsBuildArgv() requires an array as an argument.");
498: n = getoaSize(ob);
499: for (i=0; i<n; i++) {
1.6 takayama 500: if (getoa(ob,i).tag != Sdollar) errorKan1("%s\n","oxsBuildArgv() requires an array of string as an argument.");
1.3 takayama 501: }
502:
503: argv = (char **) mymalloc(sizeof(char *)*(n+2));
504: argv[0] = (char *)NULL;
505: if (n == 0) return(argv);
506:
507: s = KopString(getoa(ob,0));
508: s = oxEvalEnvVar(s);
1.4 takayama 509: ocmd = KoxWhich(KpoString(s),KpoInteger(0));
510: if (ocmd.tag != Sdollar) {
1.6 takayama 511: argv[0] = NULL;
1.4 takayama 512: }else{
1.6 takayama 513: argv[0] = KopString(ocmd);
1.4 takayama 514: }
1.3 takayama 515: argv[1] = (char *)NULL;
516: if (argv[0] == NULL) {
1.6 takayama 517: fprintf(stderr,"cmdname=%s\n",s);
518: errorKan1("%s\n","oxsBuildArgv() Command is not found.\n");
1.3 takayama 519: }
520: for (i=1; i<n; i++) {
1.6 takayama 521: argv[i] = argv[i+1] = NULL;
522: s = KopString(getoa(ob,i));
523: s = oxEvalEnvVar(s);
524: type = oxsIsURI(s);
525: if (type == NULL) {
526: argv[i] = s;
527: }else{
528: /* Case when argv[i] is like "stringInOut:abc.poly" */
529: v = oxsURIgetVarName(s);
530: ext = oxsURIgetExtension(s);
531: if (strcmp(type,"stringIn") == 0) {
532: argv[i] = oxsVarToFile(v,ext,argv[0],usetmp);
533: AfterDeleteFile[AfterD++] = argv[i];
534: }else if (strcmp(type,"stringInOut") == 0) {
535: argv[i] = oxsVarToFile(v,ext,argv[0],usetmp);
536: AfterDeleteFile[AfterD++] = argv[i];
537: AfterReadFile[AfterPt] = argv[i];
538: AfterSetVar[AfterPt] = v;
539: AfterPt++;
540: if (AfterPt >= MAXFILES) {
541: AfterPt=0;
542: errorKan1("%s\n","oxsBuildArgv(), Too may files to open.");
543: }
544: }else if (strcmp(type,"stringOut") == 0) {
545: argv[i] = generateTMPfileName2(v,ext,usetmp,win);
546: AfterDeleteFile[AfterD++] = argv[i];
547: AfterReadFile[AfterPt] = argv[i];
548: AfterSetVar[AfterPt] = v;
549: AfterPt++;
550: if (AfterPt >= MAXFILES) {
551: AfterPt=0;
552: errorKan1("%s\n","oxsBuildArgv(), Too may files to open.");
553: }
554: }else {
555: errorKan1("%s\n","This URI type has not yet been implemented.");
556: }
557: if (AfterD >= MAXFILES) {
558: AfterD=0;
559: errorKan1("%s\n","oxsBuildArgv(), Too may files to open.");
560: }
561: }
1.3 takayama 562: }
563: return(argv);
564: }
565:
566:
567: static struct object oxsExecuteBlocked(struct object ob)
568: {
569: int r,i,n;
570: char **argv;
1.9 takayama 571: int errorf;
1.3 takayama 572:
573: argv = oxsBuildArgv(ob);
1.5 takayama 574: argv = oxsBuildArgvRedirect(argv);
1.3 takayama 575: r=oxForkExecBlocked(argv); /* bug: what happen when NoX? */
576: /*
577: if (1) {
1.6 takayama 578: for (i=0; argv[i] != NULL; i++) {
579: fprintf(stderr,"argv[%d]=%s\n",i,argv[i]);
580: }
581: errorKan1("%s\n","ForkExecBlocked failed.");
1.3 takayama 582: }
583: */
1.9 takayama 584: errorf=0;
1.3 takayama 585: if (AfterPt > 0) {
1.6 takayama 586: for (i=0; i< AfterPt; i++) {
1.9 takayama 587: if (oxsFileToVar(AfterSetVar[i],AfterReadFile[i]) != 0) {
588: errorf=1;
589: }
1.6 takayama 590: }
1.3 takayama 591: }
592: AfterPt = 0;
593:
594: if (AfterD > 0) {
1.6 takayama 595: for (i=0; i< AfterD; i++) {
596: if (!KeepTmpFiles) {
597: oxDeleteFile(AfterDeleteFile[i]);
1.5 takayama 598: }
1.6 takayama 599: }
1.3 takayama 600: }
601: AfterD = 0;
1.9 takayama 602: if (errorf) errorKan1("%s\n","Some errors in oxsFileToVar().");
1.3 takayama 603:
604: return(KpoInteger(r));
1.5 takayama 605: }
606:
607: static char **oxsBuildArgvRedirect(char **argv) {
608: char **newargv;
609: int n,i,j;
610: FILE *fp;
611: char *fname;
612:
613: n = 0; while (argv[n] != NULL) n++;
614: newargv = (char **) mymalloc(sizeof(char *)*(n+1));
615: for (i=0; i<=n; i++) newargv[i]=(char *)NULL;
616: j=0;
617: /* bug: Critical area, do not make an interruption. */
618: for (i=0; i<n; i++) {
1.6 takayama 619: if (strcmp(argv[i],"<")==0) {
620: fname=argv[i+1];
621: OX_P_stdin = open(fname,O_RDONLY);
622: if (OX_P_stdin < 0) {
623: OX_P_stdin = -1;
624: oxResetRedirect();
625: errorKan1("%s\n","oxsBuildArgvRedirect fails to open the input file.");
626: }
1.5 takayama 627: i++;
1.6 takayama 628: }else if (strcmp(argv[i],">")==0) {
629: fname = argv[i+1];
630: fp == NULL;
631: if (fname != NULL) {
632: fp = fopen(fname,"w");
633: }
1.5 takayama 634: if (fp == NULL) {
1.6 takayama 635: oxResetRedirect();
636: errorKan1("%s\n","oxsBuildArgvRedirect, cannot open the output file.\n");
637: }
638: fclose(fp); /* touch */
639: OX_P_stdout = open(fname,O_WRONLY);
640: i++;
641: }else if (strcmp(argv[i],"2>") == 0) {
642: fname = argv[i+1];
643: fp == NULL;
644: if (fname != NULL) {
645: fp = fopen(fname,"w");
646: }
1.5 takayama 647: if (fp == NULL) {
1.6 takayama 648: oxResetRedirect();
649: errorKan1("%s\n","oxsBuildArgvRedirect, cannot open the output (stderr) file.\n");
650: }
651: fclose(fp); /* touch */
652: OX_P_stderr = open(fname,O_WRONLY);
653: i++;
654: }else{
655: newargv[j++] = argv[i];
656: }
1.5 takayama 657: }
658: return( newargv );
1.3 takayama 659: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>