=================================================================== RCS file: /home/cvs/OpenXM/src/util/ox_pathfinder.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -p -r1.4 -r1.5 --- OpenXM/src/util/ox_pathfinder.c 2003/07/21 13:36:43 1.4 +++ OpenXM/src/util/ox_pathfinder.c 2003/07/22 03:25:56 1.5 @@ -1,5 +1,6 @@ -/* $OpenXM: OpenXM/src/util/ox_pathfinder.c,v 1.3 2003/07/21 12:41:23 takayama Exp $ */ +/* $OpenXM: OpenXM/src/util/ox_pathfinder.c,v 1.4 2003/07/21 13:36:43 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,6 +25,7 @@ static char *get_ox_sm1_path(); static char *get_ox_path(); static char *get_oxc_path(); static char *get_oxlog_path(); +static int getFileSize(char *fn); @@ -44,6 +48,48 @@ int ox_pathfinderVerbose(int 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 @@ -77,35 +123,79 @@ int oxForkExec(char **argv) { } 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; + } }else{ /* close the specified files */ - if (m&1) { + 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); - } + } + 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); } } +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; + } + waitpid(pid,&status,0); /* block */ + return status; + }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,"oxForkExecBlock fails: "); + exit(3); + } +} + static int getOStypei() { /* 0 unix @@ -471,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; @@ -503,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; @@ -648,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 defined(__CYGWIN__) +#define _POSIX_SOURCE +#endif +#ifndef _POSIX_SOURCE + if ((m >= 0) && (buf.st_mtimespec.tv_sec+120 < time(NULL))) { + unlink(fname); + } +#else + if ((m >= 0) && (buf.st_mtime+120 < time(NULL))) { + unlink(fname); + } +#endif + } + } + num = 0; clean=1; + } + } + } + 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; } }