=================================================================== RCS file: /home/cvs/OpenXM/src/util/ox_pathfinder.c,v retrieving revision 1.1 retrieving revision 1.7 diff -u -p -r1.1 -r1.7 --- OpenXM/src/util/ox_pathfinder.c 2003/07/21 11:36:10 1.1 +++ OpenXM/src/util/ox_pathfinder.c 2003/09/08 02:43:47 1.7 @@ -1,5 +1,6 @@ -/* $OpenXM$ */ +/* $OpenXM: OpenXM/src/util/ox_pathfinder.c,v 1.6 2003/07/22 07:39:57 takayama Exp $ */ /* Moved from misc-2003/07/cygwin/test.c */ + #include #include #include @@ -9,6 +10,8 @@ #include #include #include +#include +#include #include "ox_pathfinder.h" extern char **environ; @@ -22,14 +25,73 @@ static char *get_ox_sm1_path(); static char *get_ox_path(); static char *get_oxc_path(); static char *get_oxlog_path(); -static char **setOXenv(); -static int forkExec(char **argv); -static void usage(); +static int getFileSize(char *fn); -static int Verbose_get_home = 1; + +static int Verbose_get_home = 0; static int NoX = 0; + +#define nomemory(a) {fprintf(stderr,"(%d) no more memory.\n",a);exit(10);} +#define mymalloc(a) sGC_malloc(a) + +int ox_pathfinderNoX(int f) { + if (f < 0) return NoX; + NoX = f; + return f; +} +int ox_pathfinderVerbose(int f) { + extern Verbose_get_home; + if (f < 0) return Verbose_get_home; + Verbose_get_home = f; + return f; +} + +/* test main */ +/* +main() { + char *outfile; + char *cpp; + char *argv[10]; + int n; + char *sfile = "ox_pathfinder.c"; + if (getFileSize(sfile) < 0) { + fprintf(stderr,"The source file is not found.\n"); return -1; + } + cpp = getCppPath(); + if (cpp == NULL) { + fprintf(stderr,"cpp is not found.\n"); return -1; + } + printf("%s\n",cpp); + outfile = generateTMPfileName("seed"); + if (outfile == NULL) { + fprintf(stderr,"Failed to generate a temporary file name.\n"); return -1; + } + printf("%s\n",outfile); + if ((char *)strstr(cpp,"/asir/bin/cpp.exe") == NULL) { + argv[0] = cpp; + argv[1] = "-P"; + argv[2] = "-lang-c++"; + argv[3] = sfile; + argv[4] = outfile; + argv[5] = NULL; + }else{ + argv[0] = cpp; + argv[1] = cygwinPathToWinPath(sfile); + argv[2] = cygwinPathToWinPath(outfile); + argv[3] = NULL; + } + n=oxForkExecBlocked(argv); +} + +void *sGC_malloc(int s) { return (void *) malloc(s); } +*/ + +/* -------- end of test main ----------- */ + +/* See kxx/ox100start.c for main */ + #define MYFORKCP_SIZE 100 static int Myforkchildren[MYFORKCP_SIZE]; static int Myforkcp=0; @@ -51,48 +113,86 @@ static void myforkwait() { signal(SIGCHLD,myforkwait); } -#define nomemory(a) {fprintf(stderr,"(%d) no more memory.\n",a);exit(10);} -#define mymalloc(a) malloc(a) +int oxForkExec(char **argv) { + int pid; + char **eee; + int m; + m = 0; + if (argv == NULL) { + fprintf(stderr,"Cannot fork and exec.\n"); return -1; + } + if ((pid = fork()) > 0) { + if (m&2) { + /* Do not call singal to turn around a trouble on cygwin. BUG. */ + }else{ + signal(SIGCHLD,myforkwait); /* to kill Zombie */ + } + Myforkchildren[Myforkcp++] = pid; + if (Myforkcp >= MYFORKCP_SIZE-1) { + fprintf(stderr,"Child process table is full.\n"); + Myforkcp = 0; + } + }else{ + /* close the specified files */ + if (m&1) { + sigset_t sss; + sigemptyset(&sss); + sigaddset(&sss,SIGINT); + sigprocmask(SIG_BLOCK,&sss,NULL); + } + if (NoX) { + FILE *null; + null = fopen("/dev/null","wb"); + dup2(fileno(null),1); + dup2(fileno(null),2); + } + execve(argv[0],argv,environ); + /* This place will never be reached unless execv fails. */ + fprintf(stderr,"oxForkExec fails: "); + exit(3); + } +} -/* See kxx/ox100start.c for main. */ - -static int forkExec(char **argv) { +int oxForkExecBlocked(char **argv) { int pid; char **eee; int m; + int status; m = 0; if (argv == NULL) { fprintf(stderr,"Cannot fork and exec.\n"); return -1; } if ((pid = fork()) > 0) { if (m&2) { - /* Do not call singal to turn around a trouble on cygwin. BUG. */ - }else{ - signal(SIGCHLD,myforkwait); /* to kill Zombie */ - } - Myforkchildren[Myforkcp++] = pid; - if (Myforkcp >= MYFORKCP_SIZE-1) { - fprintf(stderr,"Child process table is full.\n"); - Myforkcp = 0; - } + /* Do not call singal to turn around a trouble on cygwin. BUG. */ + }else{ + signal(SIGCHLD,myforkwait); /* to kill Zombie */ + } + Myforkchildren[Myforkcp++] = pid; + if (Myforkcp >= MYFORKCP_SIZE-1) { + fprintf(stderr,"Child process table is full.\n"); + Myforkcp = 0; + } + waitpid(pid,&status,0); /* block */ + return status; }else{ /* close the specified files */ - if (m&1) { + if (m&1) { sigset_t sss; sigemptyset(&sss); sigaddset(&sss,SIGINT); sigprocmask(SIG_BLOCK,&sss,NULL); - } - eee = setOXenv(); - if (NoX) { - FILE *null; - null = fopen("/dev/null","wb"); - dup2(fileno(null),1); - dup2(fileno(null),2); - } + } + if (NoX) { + FILE *null; + null = fopen("/dev/null","wb"); + dup2(fileno(null),1); + dup2(fileno(null),2); + } execve(argv[0],argv,environ); /* This place will never be reached unless execv fails. */ - fprintf(stderr,"forkExec fails: "); + fprintf(stderr,"oxForkExecBlock fails: "); + exit(3); } } @@ -181,7 +281,7 @@ static void msg_get_home(int t,char *s) { }else if (t == 2) { fprintf(stderr,"getServerEnv(): "); }else if (t == 3) { - fprintf(stderr,"setOXenv(): "); + fprintf(stderr,"?? "); }else if (t == 4) { fprintf(stderr,"cygwinPathToWinPath(): "); }else if (t == 5) { @@ -461,11 +561,11 @@ char **getServerEnv(char *oxServer) { char **aaa; if (Verbose_get_home) { - if (oxServer == NULL) { - fprintf(stderr,"Server name is NULL.\n"); - }else{ - fprintf(stderr,"Server name is %s\n",oxServer); - } + if (oxServer == NULL) { + fprintf(stderr,"Server name is NULL.\n"); + }else{ + fprintf(stderr,"Server name is %s\n",oxServer); + } } if (oxServer == NULL) return NULL; @@ -493,43 +593,43 @@ char **getServerEnv(char *oxServer) { strcpy(oxServer,p); if ((ostype == 0) || (ostype == 2)) { - if (!NoX) { - xterm = "/usr/X11R6/bin/xterm"; - if (getFileSize(xterm) == -1) { - msg_get_home(2,"xterm is not found. NoX is automatically set."); - NoX = 1; - } - } + if (!NoX) { + xterm = "/usr/X11R6/bin/xterm"; + if (getFileSize(xterm) == -1) { + msg_get_home(2,"xterm is not found. NoX is automatically set."); + NoX = 1; + } + } oxlog = get_oxlog_path(); xterm = "/usr/X11R6/bin/xterm -icon -e "; argv[i] = oxlog; i++; argv[i] = NULL; - if (!NoX) { - argv[i] = "/usr/X11R6/bin/xterm"; i++; argv[i] = NULL; - argv[i] = "-icon"; i++; argv[i] = NULL; - argv[i] = "-e"; i++; argv[i] = NULL; - } + if (!NoX) { + argv[i] = "/usr/X11R6/bin/xterm"; i++; argv[i] = NULL; + argv[i] = "-icon"; i++; argv[i] = NULL; + argv[i] = "-e"; i++; argv[i] = NULL; + } argv[i] = get_ox_path(); i++; argv[i] = NULL; argv[i] = "-ox"; i++; argv[i] = NULL; argv[i] = oxServer; i++; argv[i] = NULL; }else{ - if (!NoX) { - if (getFileSize("/cygdrive/c/winnt/system32/cmd.exe") >= 0) { - xterm = "/cygdrive/c/winnt/system32/cmd.exe /c start /min "; - argv[i] = "/cygdrive/c/winnt/system32/cmd.exe"; i++; argv[i] = NULL; - }else if (getFileSize("/cygdrive/c/windows/system32/cmd.exe") >= 0) { - xterm = "/cygdrive/c/windows/system32/cmd.exe /c start /min "; - argv[i] = "/cygdrive/c/windows/system32/cmd.exe"; i++; argv[i] = NULL; - }else{ - msg_get_home(2,"cmd.exe is not found. NoX is automatically set."); + if (!NoX) { + if (getFileSize("/cygdrive/c/winnt/system32/cmd.exe") >= 0) { + xterm = "/cygdrive/c/winnt/system32/cmd.exe /c start /min "; + argv[i] = "/cygdrive/c/winnt/system32/cmd.exe"; i++; argv[i] = NULL; + }else if (getFileSize("/cygdrive/c/windows/system32/cmd.exe") >= 0) { + xterm = "/cygdrive/c/windows/system32/cmd.exe /c start /min "; + argv[i] = "/cygdrive/c/windows/system32/cmd.exe"; i++; argv[i] = NULL; + }else{ + msg_get_home(2,"cmd.exe is not found. NoX is automatically set."); NoX = 1; - } - } + } + } oxlog = " "; - if (!NoX) { - argv[i] = "/c"; i++; argv[i] = NULL; - argv[i] = "start"; i++; argv[i] = NULL; - argv[i] = "/min"; i++; argv[i] = NULL; - } + if (!NoX) { + argv[i] = "/c"; i++; argv[i] = NULL; + argv[i] = "start"; i++; argv[i] = NULL; + argv[i] = "/min"; i++; argv[i] = NULL; + } argv[i] = cygwinPathToWinPath(get_ox_path()); i++; argv[i] = NULL; argv[i] = "-ox"; i++; argv[i] = NULL; argv[i] = oxServer; i++; argv[i] = NULL; @@ -546,10 +646,6 @@ char **getServerEnv(char *oxServer) { return aaa; } -char **setOXenv() { - /* Do nothing. */ - return NULL; -} char **setOXenv_old() { char *openXM_HOME; char *load_sm1_path; @@ -642,7 +738,7 @@ char **catArgv(char **argv1,char **argv2) for (i=0; i= 3) { + /* case of c:\xxx ==> /cygdrive/c/xxx */ + if ((s[1] == ':') && (s[2] == '\\')) { + sprintf(new,"/cygdrive/%c/%s",s[0],&(s[3])); + }else{ + strcpy(new,s); + } + }else{ + strcpy(new,s); + } + n = strlen(s); + for (i=0; i 90) && (!clean)) { + /* Clean the old garbages. */ + for (i=0; i<100; i++) { + if (tmp != NULL) { + sprintf(fname,"%s/%s-tmp-%d.txt",tmp,seed,i); + }else{ + sprintf(fname,"%s-tmp-%d.txt",seed,i); + } + { + struct stat buf; + int m; + m = stat(fname,&buf); + if ((m >= 0) && (buf.st_mtime+120 < time(NULL))) { + unlink(fname); + } + } + } + num = 0; clean=1; prevnum=0; + } + } + } + return NULL; +} + + +char *getCppPath(void) { + static char *cpp = "/usr/local/bin/cpp"; + int ostype; + char *oxhome; + if ((cpp != NULL) && (getFileSize(cpp) >= 0)) return cpp; + ostype = getOStypei(); + if (ostype < 3) { + /* unix or cygwin env */ + cpp = "/lib/cpp"; /* on linux */ + if (getFileSize(cpp) >= 0) return cpp; + cpp = "/usr/bin/cpp"; /* on freebsd, on cygwin */ + if (getFileSize(cpp) >= 0) return cpp; + cpp = "/bin/cpp"; + if (getFileSize(cpp) >= 0) return cpp; + cpp = NULL; return cpp; + }else { + /* On Windows */ + oxhome = getOpenXM_HOME(); + if (oxhome == NULL) { + cpp = NULL; return cpp; + } + cpp = (char *) mymalloc(strlen(oxhome)+strlen("/asir/bin/cpp.exe")+5); + if (cpp == NULL) nomemory(cpp); + sprintf(cpp,"%s/asir/bin/cpp.exe",oxhome); + if (getFileSize(cpp) >= 0) return cpp; + else return NULL; } }