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