[BACK]Return to ox100start.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / kxx

File: [local] / OpenXM / src / kxx / ox100start.c (download)

Revision 1.1, Mon Jul 21 07:32:01 2003 UTC (20 years, 9 months ago) by takayama
Branch: MAIN

The new ox100 launcher ox100start replaces the old one.

/* $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 <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <signal.h>
#include <ctype.h>

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<Myforkcp; i++) {
    if (Myforkchildren[i]  == pid) {
      for (j=i; j<Myforkcp-1; j++) {
        Myforkchildren[j] = Myforkchildren[j+1];
      }
      if (Myforkcp > 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<argc; i++) {
	if (strcmp(argv[i],"-e")==0) {
	  if (aaa == NULL) {
		fprintf(stderr,"Server is not found or not specified by -oxserver options.\n");
		exit(1);
	  }
	  aaa = catArgv(aaa,&(argv[i+1]));
	  break;
	}else if (strcmp(argv[i],"-oxserver")==0) {
	  i++;
	  serverName = argv[i];
	  aaa = getServerEnv(serverName);
	}else if (strcmp(argv[i],"-nox")==0) {
	  NoX = 1;
	}else{
	  fprintf(stderr,"Unknown option.\n");
	  usage();
	  exit(10);
	}
  }

  forkExec(aaa);

}
#endif

static void usage() {
  fprintf(stderr,"oxstart100 -oxserver xxx [-e args]\n");
  fprintf(stderr,"Examples: \n");
  fprintf(stderr,"    oxstart100 -oxserver bin/ox_sm1 -e -reverse -data 3010 --control 3012 -pass 1121343432434 \n");
}

static int forkExec(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);
	}
	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 <strlen(ans); i++) {
    if (ans[i] == '/') ans[i] = '\\';
  }
  return ans;
}

char **getServerEnv(char *oxServer) {
  int ostype;
  char *p;
  char *oxhome;
  char *xterm;
  char *oxlog;
  char *load_sm1_path;
  char *load_k0_path;
  char *openXM_HOME;
#define ARGV_SIZE 100
  char *argv[ARGV_SIZE];
  int i,k;
  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) return NULL;
  i = 0;
  argv[i] = NULL;
  
  ostype = getOStypei();

  oxhome = getOpenXM_HOME();
  if (oxhome == NULL) return NULL;
  p = (char *) mymalloc(strlen(oxhome)+strlen(oxServer)+100);
  if (p == NULL) {fprintf(stderr,"No more memory.\n"); exit(100);}

  strcpy(p,oxhome);
  strcat(p,oxServer);
  if (getFileSize(p) == -1) {
    msg_get_home(2,oxhome);
    msg_get_home(2,"     is found, but ");
    msg_get_home(2,p);
    msg_get_home(2,"     is not found.");
    return (NULL);
  }
  oxServer = (char *) mymalloc(strlen(oxhome)+strlen(oxServer)+100);
  if (oxServer == NULL) {fprintf(stderr,"No more memory.\n"); exit(100);}
  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;
	  }
	}
    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;
	}
    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.");
        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<i; k++) {
    aaa[k] = argv[k];
    msg_get_home(2,aaa[k]);
    aaa[k+1] = NULL;
  }
  return aaa;
}

char **setOXenv() {
  /* Do nothing. */
  return NULL;
}
char **setOXenv_old() {
  char *openXM_HOME;
  char *load_sm1_path;
  char *load_k0_path;
  char *asir_config;
  char *asir_libdir;
  char *asirloadpath;
  char *asir_rsh;
  char *ld_library_path;
  char **aaa;
  int n,i,k;

  /* set environmental variables */
  n = 20;  /* n must be larger than the number of env vars */
  n++;
  load_sm1_path = (char *) getenv("LOAD_SM1_PATH");
  load_k0_path = (char *) getenv("LOAD_SM1_PATH");
  asir_config = (char *) getenv("ASIR_CONFIG");
  asir_libdir = (char *) getenv("ASIR_LIBDIR");
  asirloadpath = (char *) getenv("ASIRLOADPATH");
  asir_rsh = (char *) getenv("ASIR_RSH");
  ld_library_path = (char *) getenv("LD_LIBRARY_PATH");

  openXM_HOME = getOpenXM_HOME();
  if (openXM_HOME != NULL) 
    openXM_HOME[strlen(openXM_HOME)-1] = '\0';
  /* How about ASIR... ? */

  msg_get_home(3,"OpenXM_HOME is"); msg_get_home(2,openXM_HOME);
  msg_get_home(3,"LOAD_SM1_PATH is"); msg_get_home(2,load_sm1_path);
  msg_get_home(3,"LOAD_K0_PATH is"); msg_get_home(2,load_k0_path);

  aaa = (char **) mymalloc(sizeof(char*)*n);
  if (aaa == NULL) nomemory(0);

  i = 0;
  if (openXM_HOME != NULL) {
    aaa[i] = openXM_HOME; i++; aaa[i] = NULL; if (i > 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<n; k++) {
    if (aaa[k] == NULL) break;
    msg_get_home(3,aaa[k]);
  }

  return aaa;
}

char **debugServerEnv(char *oxServer)
{
  int t;
  char **aaa;
  t = Verbose_get_home;
  Verbose_get_home = 1;
  aaa = getServerEnv(oxServer);
  Verbose_get_home = t;
  return ( aaa );
}

char **catArgv(char **argv1,char **argv2)
{
  int i,n1,n2;
  char **argv;
  n1=0; 
  while (argv1[n1] != NULL) n1++;
  n2=0; 
  while (argv2[n2] != NULL) n2++;
  argv = (char **) mymalloc(sizeof(char *)*(n1+n2+1));
  if (argv == NULL) nomemory(0);
  for (i=0; i<n1; i++) argv[i] = argv1[i];
  for (i=0; i<n2; i++) argv[n1+i] = argv2[i];
  argv[n1+n2]=NULL;
  for (i=0; i<n1+n2; i++) {
	msg_get_home(5,argv[i]);
  }
  return argv;
}

char *getLOAD_SM1_PATH2() {
  char *p;
  p = get_sm1_lib_path();
  if (p == NULL) {
    return("/usr/local/lib/sm1/");
  }else{
	return p;
  }
}