| version 1.5, 2003/07/22 03:25:56 | version 1.32, 2015/08/03 20:56:50 | 
|  |  | 
| /* $OpenXM: OpenXM/src/util/ox_pathfinder.c,v 1.4 2003/07/21 13:36:43 takayama Exp $ */ | /* $OpenXM: OpenXM/src/util/ox_pathfinder.c,v 1.31 2010/08/30 04:17:17 takayama Exp $ */ | 
| /* Moved from misc-2003/07/cygwin/test.c */ | /* Moved from misc-2003/07/cygwin/test.c */ | 
|  |  | 
| #include <stdio.h> | #include <stdio.h> | 
|  |  | 
| #include <string.h> | #include <string.h> | 
| #include "ox_pathfinder.h" | #include "ox_pathfinder.h" | 
|  |  | 
|  | void *sGC_malloc(int); | 
|  |  | 
|  | int OX_P_stdin = -1; | 
|  | int OX_P_stdout = -1; | 
|  | int OX_P_stderr = -1; | 
|  |  | 
| extern char **environ; | extern char **environ; | 
|  |  | 
| static int getOStypei(); | static int getOStypei(); | 
| 
| Line 26  static char *get_ox_path(); |  | 
| Line 32  static char *get_ox_path(); |  | 
| static char *get_oxc_path(); | static char *get_oxc_path(); | 
| static char *get_oxlog_path(); | static char *get_oxlog_path(); | 
| static int getFileSize(char *fn); | static int getFileSize(char *fn); | 
|  | static void errorPathFinder(char *s); | 
|  | static void msgPathFinder(char *s); | 
|  |  | 
|  |  | 
|  |  | 
| static int Verbose_get_home = 0; | static int Verbose_get_home = 0; | 
|  | static int Verbose = 1; | 
| static int NoX = 0; | static int NoX = 0; | 
|  | static int ErrorVerbose = 1; | 
|  | static int EngineLogToStdout = 0; | 
|  |  | 
|  | #define nomemory(a) {fprintf(stderr,"(%p) no more memory.\n",(void *)a);exit(10);} | 
| #define nomemory(a) {fprintf(stderr,"(%d) no more memory.\n",a);exit(10);} |  | 
| #define mymalloc(a)  sGC_malloc(a) | #define mymalloc(a)  sGC_malloc(a) | 
|  |  | 
|  | void pathFinderErrorVerbose(int k) { | 
|  | static int prev; | 
|  | if (k >= 0) { | 
|  | prev = ErrorVerbose; | 
|  | ErrorVerbose = k; | 
|  | }else{ | 
|  | ErrorVerbose = prev; | 
|  | } | 
|  | } | 
|  | static void errorPathFinder(char *s) { | 
|  | /* Todo; we need to return the error message to the client if it is used | 
|  | in ox_shell */ | 
|  | if (ErrorVerbose) fprintf(stderr,"Error: %s",s); | 
|  | } | 
|  | static void msgPathFinder(char *s) { | 
|  | /* Todo; we need to return the error message to the client if it is used | 
|  | in ox_shell */ | 
|  | fprintf(stderr,"Log(ox_pathfinder): %s",s); | 
|  | } | 
|  |  | 
| int ox_pathfinderNoX(int f) { | int ox_pathfinderNoX(int f) { | 
| if (f < 0) return NoX; | if (f < 0) return NoX; | 
| NoX = f; | NoX = f; | 
| 
| Line 46  int ox_pathfinderVerbose(int f) { |  | 
| Line 75  int ox_pathfinderVerbose(int f) { |  | 
| if (f < 0) return Verbose_get_home; | if (f < 0) return Verbose_get_home; | 
| Verbose_get_home = f; | Verbose_get_home = f; | 
| return f; | return f; | 
| } | } /* cf. ox_pathfinder_quiet() */ | 
|  |  | 
| /* test main   */ | /* test main   */ | 
| /* | /* | 
| 
| Line 99  static void myforkwait() { |  | 
| Line 128  static void myforkwait() { |  | 
| int status; | int status; | 
| int pid; | int pid; | 
| int i,j; | int i,j; | 
| signal(SIGCHLD,SIG_IGN); | /* signal(SIGCHLD,SIG_IGN);  It is not allowed in posix */ | 
| pid = wait(&status); | pid = wait(&status); | 
| fprintf(stderr,"Child process %d is exiting.\n",pid); | if (Verbose) fprintf(stderr,"Child process %d is exiting.\n",pid); | 
|  | if (pid < 0) { | 
|  | perror("wait"); | 
|  | } | 
| for (i=0; i<Myforkcp; i++) { | for (i=0; i<Myforkcp; i++) { | 
| if (Myforkchildren[i]  == pid) { | if (Myforkchildren[i]  == pid) { | 
| for (j=i; j<Myforkcp-1; j++) { | for (j=i; j<Myforkcp-1; j++) { | 
| 
| Line 122  int oxForkExec(char **argv) { |  | 
| Line 154  int oxForkExec(char **argv) { |  | 
| fprintf(stderr,"Cannot fork and exec.\n"); return -1; | fprintf(stderr,"Cannot fork and exec.\n"); return -1; | 
| } | } | 
| if ((pid = fork()) > 0) { | if ((pid = fork()) > 0) { | 
|  | oxResetRedirect(); | 
| if (m&2) { | if (m&2) { | 
| /* Do not call singal to turn around a trouble on cygwin. BUG. */ | /* Do not call singal to turn around a trouble on cygwin. BUG. */ | 
| }else{ | }else{ | 
| 
| Line 140  int oxForkExec(char **argv) { |  | 
| Line 173  int oxForkExec(char **argv) { |  | 
| sigaddset(&sss,SIGINT); | sigaddset(&sss,SIGINT); | 
| sigprocmask(SIG_BLOCK,&sss,NULL); | sigprocmask(SIG_BLOCK,&sss,NULL); | 
| } | } | 
| if (NoX) { | if (NoX && (!EngineLogToStdout)) { | 
| FILE *null; | FILE *null; | 
| null = fopen("/dev/null","wb"); | null = fopen("/dev/null","wb"); | 
| dup2(fileno(null),1); | if (OX_P_stdout >= 0) dup2(OX_P_stdout,1); else dup2(fileno(null),1); | 
| dup2(fileno(null),2); | if (OX_P_stderr >= 0) dup2(OX_P_stderr,2); else dup2(fileno(null),2); | 
|  | }else{ | 
|  | if (OX_P_stdout >= 0) dup2(OX_P_stdout,1); | 
|  | if (OX_P_stderr >= 0) dup2(OX_P_stderr,2); | 
| } | } | 
|  | if (OX_P_stdin >= 0) dup2(OX_P_stdin,0); | 
| execve(argv[0],argv,environ); | execve(argv[0],argv,environ); | 
| /* This place will never be reached unless execv fails. */ | /* This place will never be reached unless execv fails. */ | 
| fprintf(stderr,"oxForkExec fails: "); | fprintf(stderr,"oxForkExec fails: "); | 
| 
| Line 158  int oxForkExecBlocked(char **argv) { |  | 
| Line 195  int oxForkExecBlocked(char **argv) { |  | 
| char **eee; | char **eee; | 
| int m; | int m; | 
| int status; | int status; | 
| m = 0; |  | 
| if (argv == NULL) { | if (argv == NULL) { | 
| fprintf(stderr,"Cannot fork and exec.\n"); return -1; | fprintf(stderr,"Cannot fork and exec.\n"); return -1; | 
| } | } | 
| if ((pid = fork()) > 0) { | if ((pid = fork()) > 0) { | 
| if (m&2) { | oxResetRedirect(); | 
| /* Do not call singal to turn around a trouble on cygwin. BUG. */ |  | 
| }else{ |  | 
| signal(SIGCHLD,myforkwait); /* to kill Zombie */ |  | 
| } |  | 
| Myforkchildren[Myforkcp++] = pid; | Myforkchildren[Myforkcp++] = pid; | 
| if (Myforkcp >= MYFORKCP_SIZE-1) { | if (Myforkcp >= MYFORKCP_SIZE-1) { | 
| fprintf(stderr,"Child process table is full.\n"); | fprintf(stderr,"Child process table is full.\n"); | 
| Myforkcp = 0; | Myforkcp = 0; | 
| } | } | 
| waitpid(pid,&status,0);  /* block */ | if (waitpid(pid,&status,0) < 0) {  /* blocked */ | 
|  | perror("waitpid"); | 
|  | } | 
|  | Myforkcp--; | 
| return status; | return status; | 
| }else{ | }else{ | 
| /* close the specified files */ | /* close the specified files */ | 
| 
| Line 183  int oxForkExecBlocked(char **argv) { |  | 
| Line 218  int oxForkExecBlocked(char **argv) { |  | 
| sigaddset(&sss,SIGINT); | sigaddset(&sss,SIGINT); | 
| sigprocmask(SIG_BLOCK,&sss,NULL); | sigprocmask(SIG_BLOCK,&sss,NULL); | 
| } | } | 
| if (NoX) { | if (NoX && (!EngineLogToStdout)) { | 
| FILE *null; | FILE *null; | 
| null = fopen("/dev/null","wb"); | null = fopen("/dev/null","wb"); | 
| dup2(fileno(null),1); | if (OX_P_stdout >= 0) dup2(OX_P_stdout,1); else dup2(fileno(null),1); | 
| dup2(fileno(null),2); | if (OX_P_stderr >= 0) dup2(OX_P_stderr,2); else dup2(fileno(null),2); | 
|  | }else{ | 
|  | if (OX_P_stdout >= 0) dup2(OX_P_stdout,1); | 
|  | if (OX_P_stderr >= 0) dup2(OX_P_stderr,2); | 
| } | } | 
|  | if (OX_P_stdin >= 0) dup2(OX_P_stdin,0); | 
| execve(argv[0],argv,environ); | execve(argv[0],argv,environ); | 
| /* This place will never be reached unless execv fails. */ | /* This place will never be reached unless execv fails. */ | 
| fprintf(stderr,"oxForkExecBlock fails: "); | fprintf(stderr,"oxForkExecBlock fails: "); | 
| 
| Line 535  char *cygwinPathToWinPath(char *s) { |  | 
| Line 574  char *cygwinPathToWinPath(char *s) { |  | 
| } | } | 
|  |  | 
| if (ans[0] == '/') { | if (ans[0] == '/') { | 
|  | #if defined(__CYGWIN64__) | 
|  | strcpy(ans,"C:\\cygwin64"); | 
|  | #else | 
| strcpy(ans,"C:\\cygwin"); | strcpy(ans,"C:\\cygwin"); | 
|  | #endif | 
| strcat(ans,s); | strcat(ans,s); | 
| } | } | 
|  |  | 
| 
| Line 550  char **getServerEnv(char *oxServer) { |  | 
| Line 593  char **getServerEnv(char *oxServer) { |  | 
| int ostype; | int ostype; | 
| char *p; | char *p; | 
| char *oxhome; | char *oxhome; | 
| char *xterm; | char *oxterm; | 
|  | int  oxtermType=0; | 
|  | char *oxtermOpt; | 
| char *oxlog; | char *oxlog; | 
| char *load_sm1_path; | char *load_sm1_path; | 
| char *load_k0_path; | char *load_k0_path; | 
| 
| Line 593  char **getServerEnv(char *oxServer) { |  | 
| Line 638  char **getServerEnv(char *oxServer) { |  | 
| strcpy(oxServer,p); | strcpy(oxServer,p); | 
|  |  | 
| if ((ostype == 0) || (ostype == 2)) { | 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; |  | 
| } |  | 
| } |  | 
| oxlog = get_oxlog_path(); | oxlog = get_oxlog_path(); | 
| xterm = "/usr/X11R6/bin/xterm -icon -e "; | if (!NoX) { | 
|  | oxterm = oxTermWhich_unix(&oxtermType); | 
|  | if (oxterm == NULL) { | 
|  | msg_get_home(2,"oxterm, rxvt, xterm is not found. NoX is automatically set."); | 
|  | NoX = 1; | 
|  | } | 
|  | if (oxtermType == T_XTERM) oxtermOpt = "-icon"; | 
|  | else  oxtermOpt = "-iconic"; | 
|  | } | 
| argv[i] = oxlog; i++; argv[i] = NULL; | argv[i] = oxlog; i++; argv[i] = NULL; | 
| if (!NoX) { | if (!NoX) { | 
| argv[i] = "/usr/X11R6/bin/xterm"; i++; argv[i] = NULL; | argv[i] = oxterm ; i++; argv[i] = NULL; | 
| argv[i] = "-icon"; i++; argv[i] = NULL; | if (((char *)getenv("OX_XTERM_GEOMETRY")) != NULL) { | 
|  | /* ex. OX_XTERM_GEOMETRY=80x20+0+0 */ | 
|  | argv[i] = "-geometry"; i++; argv[i] = NULL; | 
|  | argv[i] = (char *) getenv("OX_XTERM_GEOMETRY"); i++; argv[i] = NULL; | 
|  | }else{ | 
|  | argv[i] = oxtermOpt; i++; argv[i] = NULL; | 
|  | } | 
|  | /* dirty hack for buggy international xterm cf. OpenXM FAQ */ | 
|  | argv[i] = "-xrm"; i++; argv[i] = NULL; | 
|  | argv[i] = "XTerm*locale:false"; i++; argv[i] = NULL; | 
|  |  | 
|  | if (((char *)getenv("OX_XTERM_SCROLL")) != NULL) { | 
|  | argv[i] = "-sb"; i++; argv[i] = NULL; | 
|  | argv[i] = "-sl"; i++; argv[i] = NULL; | 
|  | argv[i] = (char *) getenv("OX_XTERM_SCROLL"); i++; argv[i] = NULL; | 
|  | } | 
| argv[i] = "-e"; i++; argv[i] = NULL; | argv[i] = "-e"; i++; argv[i] = NULL; | 
| } | } | 
| argv[i] = get_ox_path(); i++; argv[i] = NULL; | argv[i] = get_ox_path(); i++; argv[i] = NULL; | 
| 
| Line 614  char **getServerEnv(char *oxServer) { |  | 
| Line 675  char **getServerEnv(char *oxServer) { |  | 
| }else{ | }else{ | 
| if (!NoX) { | if (!NoX) { | 
| if (getFileSize("/cygdrive/c/winnt/system32/cmd.exe") >= 0) { | if (getFileSize("/cygdrive/c/winnt/system32/cmd.exe") >= 0) { | 
| xterm = "/cygdrive/c/winnt/system32/cmd.exe /c start /min "; | oxterm = "/cygdrive/c/winnt/system32/cmd.exe /c start /min "; | 
| argv[i] = "/cygdrive/c/winnt/system32/cmd.exe"; i++; argv[i] = NULL; | argv[i] = "/cygdrive/c/winnt/system32/cmd.exe"; i++; argv[i] = NULL; | 
| }else if (getFileSize("/cygdrive/c/windows/system32/cmd.exe") >= 0) { | }else if (getFileSize("/cygdrive/c/windows/system32/cmd.exe") >= 0) { | 
| xterm = "/cygdrive/c/windows/system32/cmd.exe  /c start /min "; | oxterm = "/cygdrive/c/windows/system32/cmd.exe  /c start /min "; | 
| argv[i] = "/cygdrive/c/windows/system32/cmd.exe"; i++; argv[i] = NULL; | argv[i] = "/cygdrive/c/windows/system32/cmd.exe"; i++; argv[i] = NULL; | 
| }else{ | }else{ | 
| msg_get_home(2,"cmd.exe is not found. NoX is automatically set."); | msg_get_home(2,"cmd.exe is not found. NoX is automatically set."); | 
| 
| Line 791  char *generateTMPfileName(char *seed) { |  | 
| Line 852  char *generateTMPfileName(char *seed) { |  | 
| char *fname; | char *fname; | 
| char *tt; | char *tt; | 
| int num; | int num; | 
|  | static int prevnum=0; | 
|  | /* Bugs for k0. | 
|  | (1) unlink does not work so, load["t.k"];; load["t.k"];; fails (only cygwin. | 
|  | (2) In case of  error, TMP file is not removed. cf KCerror(). | 
|  | In case of cygwin, we can only load 90 times. | 
|  | */ | 
| int i; | int i; | 
| int clean = 0; | int clean = 0; | 
| tmp = getenv("TMP"); | tmp = getenv("TMP"); | 
| 
| Line 808  char *generateTMPfileName(char *seed) { |  | 
| Line 875  char *generateTMPfileName(char *seed) { |  | 
| fname = (char *)mymalloc(strlen(seed)+40); | fname = (char *)mymalloc(strlen(seed)+40); | 
| if (fname == NULL) nomemory(fname); | if (fname == NULL) nomemory(fname); | 
| } | } | 
| for (num=0; num <100; num++) { | for (num=prevnum+1; num <100; num++) { | 
| if (tmp != NULL) { | if (tmp != NULL) { | 
| sprintf(fname,"%s/%s-tmp-%d.txt",tmp,seed,num); | sprintf(fname,"%s/%s-tmp-%d.txt",tmp,seed,num); | 
| }else{ | }else{ | 
| sprintf(fname,"%s-tmp-%d.txt",seed,num); | sprintf(fname,"%s-tmp-%d.txt",seed,num); | 
| } | } | 
| if (getFileSize(fname) < 0) return fname; | if (getFileSize(fname) < 0) { | 
| else { | prevnum = num; | 
|  | return fname; | 
|  | } else { | 
| if ((num > 90) && (!clean)) { | if ((num > 90) && (!clean)) { | 
| /* Clean the old garbages. */ | /* Clean the old garbages. */ | 
| for (i=0; i<100; i++) { | for (i=0; i<100; i++) { | 
| 
| Line 828  char *generateTMPfileName(char *seed) { |  | 
| Line 897  char *generateTMPfileName(char *seed) { |  | 
| struct stat buf; | struct stat buf; | 
| int m; | int m; | 
| m = stat(fname,&buf); | m = stat(fname,&buf); | 
| #if defined(__CYGWIN__) | if ((m >= 0) && (buf.st_mtime+120 < time(NULL))) { | 
| #define _POSIX_SOURCE |  | 
| #endif |  | 
| #ifndef _POSIX_SOURCE |  | 
| if ((m >= 0) && (buf.st_mtimespec.tv_sec+120 < time(NULL))) { |  | 
| unlink(fname); | unlink(fname); | 
| } | } | 
| #else | } | 
|  | } | 
|  | num = 0; clean=1; prevnum=0; | 
|  | } | 
|  | } | 
|  | } | 
|  | return NULL; | 
|  | } | 
|  |  | 
|  | #define MAXTMP2  0xffffff | 
|  | char *generateTMPfileName2(char *seed,char *ext,int usetmp,int win){ | 
|  | char *tmp; | 
|  | char *fname; | 
|  | char *tt; | 
|  | int num; | 
|  | static int prevnum=0; | 
|  | int i; | 
|  | int clean = 0; | 
|  | char *extold; | 
|  | if (ext == NULL) ext=""; | 
|  | else { | 
|  | extold = ext; | 
|  | ext = (char *) mymalloc(strlen(ext)+3); | 
|  | if (ext == NULL) {fprintf(stderr,"No more memory.\n"); return NULL;} | 
|  | strcpy(ext,"."); | 
|  | strcat(ext,extold); | 
|  | } | 
|  | if (usetmp) { | 
|  | tmp = getenv("TMP"); | 
|  | if (tmp == NULL) { | 
|  | tmp = getenv("TEMP"); | 
|  | } | 
|  | if ((tmp == NULL) && (strcmp(getOStypes(),"Windows-native") != 0)) { | 
|  | tmp = "/tmp"; | 
|  | } | 
|  | tmp = winPathToCygwinPath(tmp); | 
|  | }else{ | 
|  | tmp = NULL; | 
|  | } | 
|  | if (tmp != NULL) { | 
|  | fname = (char *)mymalloc(strlen(tmp)+strlen(seed)+40); | 
|  | if (fname == NULL) nomemory(fname); | 
|  | }else{ | 
|  | fname = (char *)mymalloc(strlen(seed)+40); | 
|  | if (fname == NULL) nomemory(fname); | 
|  | } | 
|  | for (num=prevnum+1; num <MAXTMP2; num++) { | 
|  | if (tmp != NULL) { | 
|  | sprintf(fname,"%s/%s-tmp-%d%s",tmp,seed,num,ext); | 
|  | }else{ | 
|  | sprintf(fname,"%s-tmp-%d%s",seed,num,ext); | 
|  | } | 
|  | if (getFileSize(fname) < 0) { | 
|  | prevnum = num; | 
|  | if (win) fname= cygwinPathToWinPath(fname); | 
|  | return fname; | 
|  | } else { | 
|  | if ((num > MAXTMP2-10) && (!clean)) { | 
|  | /* Clean the old garbages. */ | 
|  | for (i=0; i<MAXTMP2; i++) { | 
|  | if (tmp != NULL) { | 
|  | sprintf(fname,"%s/%s-tmp-%d%s",tmp,seed,i,ext); | 
|  | }else{ | 
|  | sprintf(fname,"%s-tmp-%d%s",seed,i,ext); | 
|  | } | 
|  | { | 
|  | struct stat buf; | 
|  | int m; | 
|  | m = stat(fname,&buf); | 
| if ((m >= 0) && (buf.st_mtime+120 < time(NULL))) { | if ((m >= 0) && (buf.st_mtime+120 < time(NULL))) { | 
| unlink(fname); | unlink(fname); | 
| } | } | 
| #endif |  | 
| } | } | 
| } | } | 
| num = 0; clean=1; | num = 0; clean=1; prevnum=0; | 
| } | } | 
| } | } | 
| } | } | 
| return NULL; | return NULL; | 
| } | } | 
|  |  | 
|  |  | 
| char *getCppPath(void) { | char *getCppPath(void) { | 
| static char *cpp = "/usr/local/bin/cpp"; | static char *cpp = "/usr/local/bin/cpp"; | 
| int ostype; | int ostype; | 
| 
| Line 878  char *getCppPath(void) { |  | 
| Line 1009  char *getCppPath(void) { |  | 
| else return NULL; | else return NULL; | 
| } | } | 
| } | } | 
|  |  | 
|  | char *getCommandPath(char *cmdname) | 
|  | { | 
|  | char *path; | 
|  | char *msg; | 
|  | char *path2; | 
|  | char *ss; | 
|  | int i,j; | 
|  | /* Use /cygdrive format always. */ | 
|  | if (cmdname == NULL) return NULL; | 
|  | if (strlen(cmdname) < 1) { | 
|  | errorPathFinder("getCommandPath: cmdname is an empty string.\n"); | 
|  | return NULL; | 
|  | } | 
|  | if (cmdname[0] == '/') { | 
|  | if (getFileSize(cmdname) >= 0) { /* Todo: isExecutableFile() */ | 
|  | }else{ | 
|  | msg = (char *)mymalloc(strlen(cmdname)+30); | 
|  | sprintf(msg,"getCommandPath: %s is not found.",cmdname); | 
|  | errorPathFinder(msg); | 
|  | return NULL; | 
|  | } | 
|  | return cmdname; | 
|  | } | 
|  |  | 
|  | path = getOpenXM_HOME();  /* It will return /cygdrive for windows. */ | 
|  | if (path != NULL) { | 
|  | path2 = (char *)mymalloc(strlen(path)+5); | 
|  | strcpy(path2,path); | 
|  | strcat(path2,"bin"); | 
|  | ss = oxWhich(cmdname,path2); | 
|  | if (ss != NULL) return ss; | 
|  | } | 
|  |  | 
|  | path = (char *)getenv("PATH");  /* Todo: it will not give /cygdrive format*/ | 
|  | ss = oxWhich(cmdname,path); | 
|  | if (ss == NULL) { | 
|  | errorPathFinder("oxWhich_unix: could not find it in the path string.\n"); | 
|  | } | 
|  | return ss; | 
|  | } | 
|  |  | 
|  | char *oxWhich(char *cmdname,char *path) { | 
|  | return(oxWhich_unix(cmdname,path)); | 
|  | } | 
|  |  | 
|  | char *oxWhich_unix(char *cmdname,char *path) { | 
|  | char *path2; | 
|  | int i,j; | 
|  | if (path == NULL) { | 
|  | return NULL; | 
|  | } | 
|  |  | 
|  | path2 = (char *)mymalloc(strlen(path)+strlen(cmdname)+2); | 
|  | for (i=0, j=0; i <= strlen(path); i++) { | 
|  | path2[j] = 0; | 
|  | if ((path[i] == ':') || (path[i] == 0)) { | 
|  | strcat(path2,"/"); strcat(path2,cmdname); | 
|  | if (getFileSize(path2) >= 0) { /* Todo: isExecutableFile() */ | 
|  | return path2; | 
|  | } | 
|  | j = 0; path2[j] = 0; | 
|  | }else{ | 
|  | path2[j] = path[i]; j++; path2[j] = 0; | 
|  | } | 
|  | } | 
|  | return NULL; | 
|  | } | 
|  |  | 
|  | char *oxEvalEnvVar(char *s) { | 
|  | int n, i,j; | 
|  | char *es; | 
|  | char *news; | 
|  | int flag,flag2; | 
|  | flag=-1; | 
|  | n = strlen(s); | 
|  | es = (char *)mymalloc(n+1); es[0] = 0; | 
|  | if (es == NULL) nomemory(1); | 
|  | for (i=0; i<n; i++) { | 
|  | if ((s[i] == '$') && (s[i+1] == '{')) { | 
|  | for (j=0; ; j++) { | 
|  | if ((s[i+2+j] == 0) || (s[i+2+j] == '}')) { | 
|  | flag2 = i+2+j+1; | 
|  | break; | 
|  | } | 
|  | es[j] = s[i+2+j]; es[j+1]=0; | 
|  | } | 
|  | if (es[0] != 0) { flag=i; break; } | 
|  | } | 
|  | } | 
|  | if (flag >= 0) { | 
|  | es = (char *)getenv(es); | 
|  | if (es == NULL) es=""; | 
|  | news = (char *) mymalloc(n+5+strlen(es)); | 
|  | if (news == NULL) nomemory(1); | 
|  | j = 0; | 
|  | for (i=0; i<flag; i++) { | 
|  | news[j] = s[i]; j++; | 
|  | } | 
|  | for (i=0; i<strlen(es); i++) { | 
|  | news[j] = es[i]; j++; | 
|  | } | 
|  | for (i=flag2; i<strlen(s); i++) { | 
|  | news[j] = s[i]; j++; | 
|  | } | 
|  | news[j] = 0; | 
|  | return(oxEvalEnvVar(news)); | 
|  | }else{ | 
|  | return(s); | 
|  | } | 
|  | } | 
|  |  | 
|  | void oxResetRedirect(void) { | 
|  | if (OX_P_stdin >= 0) close(OX_P_stdin); | 
|  | if (OX_P_stdout >= 0) close(OX_P_stdout); | 
|  | if (OX_P_stderr >= 0) close(OX_P_stderr); | 
|  | OX_P_stdin = OX_P_stdout = OX_P_stderr = -1; | 
|  | } | 
|  |  | 
|  | int oxDeleteFile(char *fname) { | 
|  | if (getFileSize(fname) >= 0) { | 
|  | return(unlink(fname)); | 
|  | }else{ | 
|  | return(-1); | 
|  | } | 
|  | } | 
|  |  | 
|  | /* This function just kills processes, so if there is a process which | 
|  | uses ox protocol, it is not relevant to use this functions. | 
|  | */ | 
|  | int oxKillAll(void) { | 
|  | int i; | 
|  | int pid; | 
|  | int status; | 
|  | for (i=0; i<Myforkcp; i++) { | 
|  | pid = Myforkchildren[i]; | 
|  | if (Verbose) fprintf(stderr,"Sending signal to %d ... ",pid); | 
|  | kill(pid,SIGKILL); | 
|  | waitpid(pid,&status,0); | 
|  | if (Verbose) fprintf(stderr,"Gone.\n"); | 
|  | } | 
|  | Myforkcp = 0; | 
|  | return(0); | 
|  | } | 
|  |  | 
|  | void ox_pathfinder_quiet(void) { | 
|  | Verbose_get_home = 0; | 
|  | Verbose = 0; | 
|  | } | 
|  |  | 
|  | char *oxTermWhich_unix(int *typep) { | 
|  | char *s; | 
|  | char *p; | 
|  | p = (char *) getenv("PATH"); | 
|  | s = oxWhich("oxterm",p); *typep = T_OXTERM; | 
|  | if (s != NULL) return s; | 
|  |  | 
|  | /*  skip the search of rxvt  (temporary) | 
|  | s = oxWhich("rxvt",p); *typep = T_RXVT; | 
|  | if (s != NULL) return s; | 
|  | */ | 
|  |  | 
|  | s = oxWhich("xterm",p); *typep = T_XTERM; | 
|  | if (s != NULL) return s; | 
|  |  | 
|  | return NULL; | 
|  | } | 
|  |  | 
|  | int oxpSendStringAsFile(char *user,char *hostname, char *filename, char *str) | 
|  | { | 
|  | FILE *fp; | 
|  | int i; | 
|  | char *comm; | 
|  | char *argv[10]; | 
|  | mode_t oumask; | 
|  | oumask = umask((mode_t) (64-1)); | 
|  | /* 077=111 111 */ | 
|  | fp = fopen(filename,"w"); | 
|  | umask(oumask); | 
|  | if (fp == NULL) { | 
|  | return -1; | 
|  | } | 
|  | for (i=0; i <strlen(str); i++) { | 
|  | fputc(str[i],fp); | 
|  | } | 
|  | fclose(fp); | 
|  | if (strcmp(hostname,"localhost") == 0) return 0; | 
|  | comm = (char *)malloc(strlen(user)+strlen(hostname)+strlen(filename)*2+1024); | 
|  | if (comm == NULL) return -2; | 
|  |  | 
|  | argv[0] = getCommandPath("scp"); | 
|  | if (argv[0] == NULL) return -3; | 
|  | argv[1] = filename; | 
|  | comm = (char *)malloc(strlen(user)+strlen(hostname)+strlen(filename)+256); | 
|  | sprintf(comm,"%s@%s:%s",user,hostname,filename); | 
|  | argv[2] = comm; | 
|  | argv[3] = NULL; | 
|  | return oxForkExec(argv); | 
|  | } | 
|  |  | 
|  | char *oxpReadOneTimePasswordFromFile(char *filename) { | 
|  | } | 
|  |  | 
|  | int ox_pathfinderEngineLogToStdout(int state) { | 
|  | EngineLogToStdout = state; | 
|  | } |