/* $OpenXM: OpenXM/src/kxx/ox100start.c,v 1.1 2003/07/21 07:32:01 takayama Exp $ */ /* Moved from misc-2003/07/cygwin/test.c */ #include #include #include #include #include #include #include #include #include extern char **environ; static int getOStypei(); static char *addSlash(); static char *get_sm1_lib_path(); static char *get_k0_lib_path(); static char *get_ox_asir_path(); 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(); char **catArgv(char **argv1,char **argv2); char *getOStypes(); char *getOpenXM_HOME(); char *getLOAD_SM1_PATH2(); char **getServerEnv(char *oxServer); char **debugServerEnv(char *oxServer); char *cygwinPathToWinPath(char *s); static int Verbose_get_home = 1; static int NoX = 0; #define MYFORKCP_SIZE 100 static int Myforkchildren[MYFORKCP_SIZE]; static int Myforkcp=0; static void myforkwait() { int status; int pid; int i,j; signal(SIGCHLD,SIG_IGN); pid = wait(&status); fprintf(stderr,"Child process %d is exiting.\n",pid); for (i=0; i 0) Myforkcp--; } } signal(SIGCHLD,myforkwait); } #define nomemory(a) {fprintf(stderr,"(%d) no more memory.\n",a);exit(10);} #define mymalloc(a) malloc(a) #ifndef NOT_STANDALONE main(int argc,char *argv[]) { char *s; char s2[1024]; char buf[1024]; FILE *fp; char **aaa; char **eee; int i; char *serverName; if (Verbose_get_home) { printf("ostype=%s\n",getOStypes()); printf("OpenXM_HOME=%s\n",getOpenXM_HOME()); printf("sm lib =%s\n",get_sm1_lib_path()); printf("k0 lib =%s\n",get_k0_lib_path()); printf("ox_asir =%s\n",get_ox_asir_path()); } /* Initialize parameters */ serverName = NULL; aaa = NULL; for (i=1 ; i 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); } eee = setOXenv(); 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: "); } } static int getOStypei() { /* 0 unix 1 windows-cygwin 2 windows-cygwin-on-X 3 windows-native */ int ostype; char *s,*s2,*s3; #if defined(__CYGWIN__) ostype = 1; #else ostype = 0; #endif if (ostype == 0) return ostype; /* Heuristic method */ s = (char *)getenv("WINDOWID"); if (s != NULL) { return 2; } s = (char *)getenv("OSTYPE"); s2 = (char *)getenv("MACHTYPE"); s3 = (char *)getenv("PWD"); if ((s != NULL) || (s2 != NULL) || (s3 != NULL)) { return 1; } return 3; } char *getOStypes() { int ostype; ostype = getOStypei(); if (ostype == 1) { return("Windows-cygwin"); }else if (ostype == 2) { return("Windows-cygwin-on-X"); }else if (ostype == 3) { return("Windows-native"); }else{ return("unix"); } } /* kan96xx/Kan/ext.c */ /* -1 : no file non-negative: there is a regular file or a directory */ static int getFileSize(char *s) { struct stat buf; int m; if (s == NULL) return -1; m = stat(s,&buf); if (m == -1) { return -1; /* fail */ }else{ /* success */ return (int) buf.st_size; } } static char *addSlash(char *p) { char *p2; if ((strlen(p) == 0) || (p == NULL)) return(p); if (p[strlen(p)-1] == '/') return(p); /* Add / */ p2 = (char *) mymalloc(sizeof(char)*(strlen(p)+3)); if (p2 == NULL) { fprintf(stderr,"No more memory.\n"); exit(10); } strcpy(p2,p); strcat(p2,"/"); return(p2); } static void msg_get_home(int t,char *s) { extern int Verbose_get_home; if (!Verbose_get_home) return; if (t == 1) { fprintf(stderr,"getOpenXM_HOME(): "); }else if (t == 2) { fprintf(stderr,"getServerEnv(): "); }else if (t == 3) { fprintf(stderr,"setOXenv(): "); }else if (t == 4) { fprintf(stderr,"cygwinPathToWinPath(): "); }else if (t == 5) { fprintf(stderr,"catArgv(): "); }else{ fprintf(stderr,"getting path...: "); } if (s != NULL) { fprintf(stderr,"%s\n",s); }else{ fprintf(stderr," --NULL-- \n"); } } /* cf. k097/d.c getLOAD_K_PATH(); kan96xx/Kan/scanner.c getLOAD_SM1_PATH(); */ char *getOpenXM_HOME() { char *p; char *h; p = getOStypes(); msg_get_home(1,p); p = (char *) getenv("OpenXM_HOME"); if (getFileSize(p) != -1) return addSlash(p); msg_get_home(1,"OpenXM_HOME is not found."); p = (char *) getenv("OPENXM_HOME"); if (getFileSize(p) != -1) return addSlash(p); msg_get_home(1,"OPENXM_HOME is not found."); if (getOStypei() == 3) { /* cygwin-native */ p = (char *) getenv("OpenXM_HOME_WIN"); if (getFileSize(p) != -1) return addSlash(p); msg_get_home(1,"OpenXM_HOME_WIN is not found."); p = (char *) getenv("OPENXMHOMEWIN"); if (getFileSize(p) != -1) return addSlash(p); msg_get_home(1,"OPENXMHOMEWIN is not found."); } /* Try to find default directories */ h = (char *)getenv("HOME"); if (h != NULL) { p = (char *)mymalloc(strlen(h)+100); if (p == NULL) { fprintf(stderr,"No more memory.\n"); exit(100); } strcat(h,"/OpenXM"); p = h; if (getFileSize(p) != -1) return addSlash(p); msg_get_home(1,"OpenXM is not found under the home directory."); } if (getOStypei() != 3) { p = "/usr/local/OpenXM"; }else{ p = "/cygdrive/c/usr/local/OpenXM"; } if (getFileSize(p) != -1) return addSlash(p); msg_get_home(1,"OpenXM is not found under /usr/local"); if (getOStypei() != 0) { p = "/cygdrive/c/OpenXM"; if (getFileSize(p) != -1) return addSlash(p); msg_get_home(1,"OpenXM is not found under c:\\"); p = "/cygdrive/c/OpenXM-win"; if (getFileSize(p) != -1) return addSlash(p); msg_get_home(1,"OpenXM-win is not found under c:\\"); p = "/cygdrive/c/Program Files/OpenXM"; if (getFileSize(p) != -1) return addSlash(p); msg_get_home(1,"OpenXM is not found under c:\\Program Files"); p = "/cygdrive/c/Program Files/OpenXM-win"; if (getFileSize(p) != -1) return addSlash(p); msg_get_home(1,"OpenXM-win is not found under c:\\Program Files"); } msg_get_home(1,"Giving up!"); return NULL; } static char *get_k0_lib_path() { char *oxhome; char *p; p = (char *)getenv("LOAD_K_PATH"); if (p != NULL) { if (getFileSize(p) != -1) return addSlash(p); msg_get_home(1,"LOAD_K0_PATH is not found."); } oxhome = getOpenXM_HOME(); if (oxhome == NULL) return (char *)NULL; p = (char *) mymalloc(strlen(oxhome)+100); if (p == NULL) {fprintf(stderr,"No more memory.\n"); exit(100);} strcpy(p,oxhome); strcat(p,"lib/k097"); if (getFileSize(p) != -1) return addSlash(p); msg_get_home(1,oxhome); msg_get_home(1," is found, but "); msg_get_home(1,p); msg_get_home(1," is not found."); msg_get_home(1,"Giving up!"); return NULL; } static char *get_sm1_lib_path() { char *oxhome; char *p; p = (char *)getenv("LOAD_SM1_PATH"); if (p != NULL) { if (getFileSize(p) != -1) return addSlash(p); msg_get_home(1,"LOAD_SM1_PATH is not found."); } oxhome = getOpenXM_HOME(); if (oxhome == NULL) return NULL; p = (char *) mymalloc(strlen(oxhome)+100); if (p == NULL) {fprintf(stderr,"No more memory.\n"); exit(100);} strcpy(p,oxhome); strcat(p,"lib/sm1"); if (getFileSize(p) != -1) return addSlash(p); msg_get_home(1,oxhome); msg_get_home(1," is found, but "); msg_get_home(1,p); msg_get_home(1," is not found."); msg_get_home(1,"Giving up!"); return NULL; } static char *get_ox_asir_path() { char *oxhome; char *p; oxhome = getOpenXM_HOME(); if (oxhome == NULL) return NULL; p = (char *) mymalloc(strlen(oxhome)+100); if (p == NULL) {fprintf(stderr,"No more memory.\n"); exit(100);} strcpy(p,oxhome); strcat(p,"bin/ox_asir"); if (getFileSize(p) != -1) return p; msg_get_home(1,oxhome); msg_get_home(1," is found, but "); msg_get_home(1,p); msg_get_home(1," is not found."); strcpy(p,oxhome); strcat(p,"lib/asir/ox_asir"); if (getFileSize(p) != -1) return p; msg_get_home(1,oxhome); msg_get_home(1," is found, but "); msg_get_home(1,p); msg_get_home(1," is not found."); msg_get_home(1,"Giving up!"); return NULL; } static char *get_ox_path() { char *oxhome; char *p; oxhome = getOpenXM_HOME(); if (oxhome == NULL) return NULL; p = (char *) mymalloc(strlen(oxhome)+100); if (p == NULL) {fprintf(stderr,"No more memory.\n"); exit(100);} strcpy(p,oxhome); strcat(p,"bin/ox"); if (getFileSize(p) != -1) return p; msg_get_home(1,oxhome); msg_get_home(1," is found, but "); msg_get_home(1,p); msg_get_home(1," is not found."); msg_get_home(1,"Giving up!"); return NULL; } static char *get_oxc_path() { char *oxhome; char *p; oxhome = getOpenXM_HOME(); if (oxhome == NULL) return NULL; p = (char *) mymalloc(strlen(oxhome)+100); if (p == NULL) {fprintf(stderr,"No more memory.\n"); exit(100);} strcpy(p,oxhome); strcat(p,"bin/oxc"); if (getFileSize(p) != -1) return p; msg_get_home(1,oxhome); msg_get_home(1," is found, but "); msg_get_home(1,p); msg_get_home(1," is not found."); msg_get_home(1,"Giving up!"); return NULL; } static char *get_oxlog_path() { char *oxhome; char *p; oxhome = getOpenXM_HOME(); if (oxhome == NULL) return NULL; p = (char *) mymalloc(strlen(oxhome)+100); if (p == NULL) {fprintf(stderr,"No more memory.\n"); exit(100);} strcpy(p,oxhome); strcat(p,"bin/oxlog"); if (getFileSize(p) != -1) return p; msg_get_home(1,oxhome); msg_get_home(1," is found, but "); msg_get_home(1,p); msg_get_home(1," is not found."); msg_get_home(1,"Giving up!"); return NULL; } char *cygwinPathToWinPath(char *s) { char *pos; char *ans; int i; msg_get_home(4,s); if (s == NULL) return NULL; if (strlen(s) == 0) return s; ans = (char *) mymalloc(strlen(s) + 32); if (ans == NULL) nomemory(0); pos = (char *)strstr(s,"/cygdrive/"); if (pos == s) { strcpy(ans,&(s[9])); ans[0] = s[10]; ans[1] = ':'; ans[2] = '\\'; }else{ strcpy(ans,s); } if (ans[0] == '/') { strcpy(ans,"C:\\cygwin"); strcat(ans,s); } for (i=0; i = 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; } argv[i] = cygwinPathToWinPath(get_ox_path()); i++; argv[i] = NULL; argv[i] = "-ox"; i++; argv[i] = NULL; argv[i] = oxServer; i++; argv[i] = NULL; } aaa = (char **) mymalloc(sizeof(char*)*(i+1)); if (aaa == NULL) nomemory(0); msg_get_home(2,"--------- Result --------------"); for (k=0; k n-2) return aaa; } if (load_sm1_path != NULL) { aaa[i] = load_sm1_path; i++; aaa[i] = NULL; if (i > n-2) return aaa; } if (load_k0_path != NULL) { aaa[i] = load_k0_path; i++; aaa[i] = NULL; if (i > n-2) return aaa; } if (asir_config != NULL) { aaa[i] = asir_config; i++; aaa[i] = NULL; if (i > n-2) return aaa; } if (asir_libdir != NULL) { aaa[i] = asir_libdir; i++; aaa[i] = NULL; if (i > n-2) return aaa; } if (asirloadpath != NULL) { aaa[i] = asirloadpath; i++; aaa[i] = NULL; if (i > n-2) return aaa; } if (asir_rsh != NULL) { aaa[i] = asir_rsh; i++; aaa[i] = NULL; if (i > n-2) return aaa; } msg_get_home(3,"--------- Result --------------"); for (k=0; k