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