[BACK]Return to ox_launch.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / io

Diff for /OpenXM_contrib2/asir2000/io/ox_launch.c between version 1.17 and 1.29

version 1.17, 2004/03/02 02:43:55 version 1.29, 2018/03/29 01:32:53
Line 44 
Line 44 
  * OF THE SOFTWARE HAS BEEN DEVELOPED BY A THIRD PARTY, THE THIRD PARTY   * OF THE SOFTWARE HAS BEEN DEVELOPED BY A THIRD PARTY, THE THIRD PARTY
  * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,   * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,
  * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.   * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.
  * $OpenXM: OpenXM_contrib2/asir2000/io/ox_launch.c,v 1.16 2001/12/25 02:39:05 noro Exp $   * $OpenXM: OpenXM_contrib2/asir2000/io/ox_launch.c,v 1.28 2016/08/27 03:09:03 noro Exp $
 */  */
 #include <setjmp.h>  #include <setjmp.h>
 #include <signal.h>  #include <signal.h>
Line 52 
Line 52 
 #include "ca.h"  #include "ca.h"
 #include "com.h"  #include "com.h"
 #include "ox.h"  #include "ox.h"
 #if defined(VISUAL)  #if defined(VISUAL) || defined(__MINGW32__)
 #include <stdlib.h>  #include <stdlib.h>
 #include <windows.h>  #include <windows.h>
 #include <io.h>  #include <io.h>
Line 69 
Line 69 
 #include <unistd.h>  #include <unistd.h>
 #endif  #endif
   
 #if defined(VISUAL)  #if defined(VISUAL) || defined(__MINGW32__)
 HANDLE hIntr,hReset,hKill;  HANDLE hIntr,hReset,hKill;
   extern int _fileinfo;
 #endif  #endif
   
 static void put_log(char *);  static void put_log(char *);
 static int which_command(char *,char *);  static int ox_spawn(char *,int,char *,char *);
 static int search_command(char *);  
 static int ox_spawn(char *,int,char *,int);  
 static void launch_error(char *);  static void launch_error(char *);
 static void ox_io_init(int);  static void ox_io_init(int);
 static void push_one(Obj);  static void push_one(Obj);
Line 95  static int cpid;
Line 94  static int cpid;
 static void put_log(str)  static void put_log(str)
 char *str;  char *str;
 {  {
         static FILE *logfile;    static FILE *logfile;
   
         if ( !logfile )    if ( !logfile )
                 logfile = fopen("/tmp/ox_log","w");      logfile = fopen("/tmp/ox_log","w");
         fprintf(logfile,"%s\n",str);    fprintf(logfile,"%s\n",str);
         fflush(logfile);    fflush(logfile);
 }  }
   
 #if !defined(VISUAL)  
 static int which_command(com,file)  
 char *com,*file;  
 {  
         char *c,*s;  
         int len;  
         char dir[BUFSIZ],path[BUFSIZ];  
   
         for ( s = (char *)getenv("PATH"); s; ) {  
                 c = (char *)index(s,':');  
                 if ( c ) {  
                         len = c-s;  
                         strncpy(dir,s,len); s = c+1; dir[len] = 0;  
                 } else {  
                         strcpy(dir,s); s = 0;  
                 }  
                 sprintf(path,"%s/%s",dir,com);  
                 if ( search_command(path) ) {  
                         strcpy(file,path); return 1;  
                 }  
         }  
         file[0] = 0; return 0;  
 }  
   
 static int search_command(file)  
 char *file;  
 {  
         struct stat buf;  
   
         if ( stat(file,&buf) || (buf.st_mode & S_IFDIR) )  
                 return 0;  
         if ( access(file,X_OK) )  
                 return 0;  
         else  
                 return 1;  
 }  
 #endif  
   
 /*  /*
         argv[1] : host to connect    argv[1] : host to connect
         argv[2] : if 1, call try_bind_listen and try_accept    argv[2] : if 1, call try_bind_listen and try_accept
                         if 0, call try_connect        if 0, call try_connect
         argv[3] : control_port    argv[3] : control_port
         argv[4] : server_port    argv[4] : server_port
         argv[5] : server    argv[5] : server
         argv[6] : display or "0"    argv[6] : display or "0"
         argv[7] : if exists, it should be "-nolog"    argv[7] : if exists, it should be "-nolog"
     XXX : argv[7] is used to pass the path of engine.exe in Windows.
 */  */
   
 void launch_main(argc,argv)  void launch_main(argc,argv)
 int argc;  int argc;
 char **argv;  char **argv;
 {  {
 #if !defined(VISUAL)  #if !defined(VISUAL) && !defined(__MINGW32__)
         Obj p;    Obj p;
         char *name;    char *name;
         char buf[BUFSIZ];    char buf[BUFSIZ];
 #endif  #endif
         int id;    int id;
         Obj obj;    Obj obj;
         int cs,ss;    int cs,ss;
         unsigned int cmd;    unsigned int cmd;
         int use_unix,accept_client,nolog;    int use_unix,accept_client;
         char *control_port_str,*server_port_str;    char *control_port_str,*server_port_str;
         char *rhost,*server,*dname;    char *rhost,*server,*dname,*nolog;
     char *e,*s;
   
         GC_init(); nglob_init();    GC_init(); nglob_init();
         gethostname(hostname,BUFSIZ);    gethostname(hostname,BUFSIZ);
         rhost = argv[1];    rhost = argv[1];
         use_unix = !strcmp(rhost,".") ? 1 : 0;    use_unix = !strcmp(rhost,".") ? 1 : 0;
         accept_client = atoi(argv[2]) ? 1 : 0;    accept_client = atoi(argv[2]) ? 1 : 0;
         control_port_str = argv[3];    control_port_str = argv[3];
         server_port_str = argv[4];    server_port_str = argv[4];
         server = argv[5];    server = argv[5];
         dname = argv[6];    dname = argv[6];
         nolog = argc > 7 ? 1 : 0;    nolog = argc > 7 ? argv[7]: 0;
   
 #if defined(VISUAL)  #if defined(VISUAL) || defined(__MINGW32__)
                 init_socket();      init_socket();
 #endif  #endif
   
         signal(SIGINT,SIG_IGN);    set_signal(SIGINT,SIG_IGN);
         signal(SIGHUP,SIG_IGN);  #if defined(SIGHUP)
     set_signal(SIGHUP,SIG_IGN);
   #endif
 #if defined(SIGUSR1)  #if defined(SIGUSR1)
         signal(SIGUSR1,SIG_IGN);    set_signal(SIGUSR1,SIG_IGN);
 #endif  #endif
 #if defined(SIGTERM)  #if defined(SIGTERM)
         signal(SIGTERM,terminate_server);    set_signal(SIGTERM,terminate_server);
 #endif  #endif
   
         if ( accept_client ) {    /* XXX a dirty hack */
                 cs = try_bind_listen(use_unix,control_port_str);    if ( !getenv("LD_LIBRARY_PATH") ) {
                 ss = try_bind_listen(use_unix,server_port_str);      if ( e = getenv("OpenXM_HOME") ) {
                 cs = try_accept(use_unix,cs);        s = (char *)alloca(strlen(e)+100);
                 ss = try_accept(use_unix,ss);        sprintf(s,"LD_LIBRARY_PATH=%s/lib",e);
         } else {        putenv(s);
                 cs = try_connect(use_unix,rhost,control_port_str);      }
                 ss = try_connect(use_unix,rhost,server_port_str);    }
         }  
         ox_io_init(cs);  
         if ( cs < 0 || ss < 0 )  
                 launch_error("cannot connect to the client");  
         cpid = ox_spawn(server,ss,dname,nolog);  
   
         while ( 1 ) {    if ( accept_client ) {
                 ox_recv(sindex,&id,&obj);      cs = try_bind_listen(use_unix,control_port_str);
                 switch ( id ) {      ss = try_bind_listen(use_unix,server_port_str);
                         case OX_COMMAND:      cs = try_accept(use_unix,cs);
                                 cmd = ((USINT)obj)->body;      ss = try_accept(use_unix,ss);
                                 do_cmd(cmd);    } else {
                                 break;      cs = try_connect(use_unix,rhost,control_port_str);
                         case OX_DATA:      ss = try_connect(use_unix,rhost,server_port_str);
                                 push_one(obj);    }
                                 break;    ox_io_init(cs);
                         case OX_SYNC_BALL:    if ( cs < 0 || ss < 0 )
                                 break;      launch_error("cannot connect to the client");
                         default:    cpid = ox_spawn(server,ss,dname,nolog);
                                 break;  
                 }    while ( 1 ) {
         }      ox_recv(sindex,&id,&obj);
       switch ( id ) {
         case OX_COMMAND:
           cmd = ((USINT)obj)->body;
           do_cmd(cmd);
           break;
         case OX_DATA:
           push_one(obj);
           break;
         case OX_SYNC_BALL:
           break;
         default:
           break;
       }
     }
 }  }
   
 #if defined(VISUAL)  #if defined(VISUAL) || defined(__MINGW32__)
 static void do_cmd(cmd)  static void do_cmd(cmd)
 int cmd;  int cmd;
 {  {
         USINT t;    USINT t;
   
         switch ( cmd ) {    switch ( cmd ) {
                 case SM_shutdown:      case SM_shutdown:
                         SetEvent(hKill);        SetEvent(hKill);
                         ExitProcess(0);        ExitProcess(0);
                         break;        break;
                 case SM_control_intr:      case SM_control_intr:
                         SetEvent(hIntr);        SetEvent(hIntr);
                         break;        break;
                 case SM_control_kill:      case SM_control_kill:
                         SetEvent(hKill);        SetEvent(hKill);
                         break;        break;
                 case SM_control_reset_connection:      case SM_control_reset_connection:
                         MKUSINT(t,0);  #if 0
                         ox_send_data(sindex,t);        /* XXX obsolete */
                         SetEvent(hReset);        MKUSINT(t,0);
                         break;        ox_send_data(sindex,t);
                 default:  #endif
                         break;        SetEvent(hReset);
         }        break;
       default:
         break;
     }
 }  }
 #else  #else
 static void do_cmd(cmd)  static void do_cmd(cmd)
 int cmd;  int cmd;
 {  {
         USINT t;    USINT t;
         int id,cindex;    int id,cindex;
         int bport,sport;    int bport,sport;
         int bs,bs0;    int bs,bs0;
         int status;    int status;
         STRING prog,dname;    STRING prog,dname;
   
         switch ( cmd ) {    switch ( cmd ) {
                 case SM_shutdown:      case SM_shutdown:
                         kill(cpid,SIGKILL);        kill(cpid,SIGKILL);
                         exit(0); break;        exit(0); break;
                 case SM_control_intr:      case SM_control_intr:
                         kill(cpid,SIGINT);        kill(cpid,SIGINT);
                         break;        break;
                 case SM_control_kill:      case SM_control_kill:
                         kill(cpid,SIGKILL);        kill(cpid,SIGKILL);
                         break;        break;
                 case SM_control_reset_connection:      case SM_control_reset_connection:
                         MKUSINT(t,0);  #if 0
                         ox_send_data(sindex,t);        /* XXX obsolete */
                         kill(cpid,SIGUSR1);        MKUSINT(t,0);
                         break;        ox_send_data(sindex,t);
                 default:  #endif
                         break;        kill(cpid,SIGUSR1);
         }        break;
       default:
         break;
     }
 }  }
 #endif  #endif
   
Line 287  static int ox_spawn(prog,bs,dname,nolog)
Line 267  static int ox_spawn(prog,bs,dname,nolog)
 char *prog;  char *prog;
 int bs;  int bs;
 char *dname;  char *dname;
 int nolog;  char *nolog;
 {  {
 #if defined(VISUAL)  #if defined(VISUAL) || defined(__MINGW32__)
         char *av[BUFSIZ];    char *av[BUFSIZ];
         char sock_id[BUFSIZ],ox_intr[BUFSIZ],ox_reset[BUFSIZ],ox_kill[BUFSIZ];    char sock_id[BUFSIZ],ox_intr[BUFSIZ],ox_reset[BUFSIZ],ox_kill[BUFSIZ];
         char AsirExe[BUFSIZ];    char AsirExe[BUFSIZ];
         int hProc;    int hProc;
         STRING rootdir;    STRING rootdir;
         int mypid;    int mypid;
         int newbs;    int newbs;
   
         DuplicateHandle(GetCurrentProcess(),(HANDLE)bs,    DuplicateHandle(GetCurrentProcess(),(HANDLE)bs,
                                         GetCurrentProcess(),(HANDLE *)&newbs,            GetCurrentProcess(),(HANDLE *)&newbs,
                                         0,TRUE,DUPLICATE_SAME_ACCESS);            0,TRUE,DUPLICATE_SAME_ACCESS);
         close(bs);    closesocket(bs);
         bs = newbs;    bs = newbs;
   
         mypid = GetCurrentProcessId();    mypid = GetCurrentProcessId();
         sprintf(ox_intr,"ox_intr_%d",mypid);    sprintf(ox_intr,"ox_intr_%d",mypid);
         sprintf(ox_reset,"ox_reset_%d",mypid);    sprintf(ox_reset,"ox_reset_%d",mypid);
         sprintf(ox_kill,"ox_kill_%d",mypid);    sprintf(ox_kill,"ox_kill_%d",mypid);
         hIntr = CreateEvent(NULL,TRUE,FALSE,ox_intr);    hIntr = CreateEvent(NULL,TRUE,FALSE,ox_intr);
         hReset = CreateEvent(NULL,TRUE,FALSE,ox_reset);    hReset = CreateEvent(NULL,TRUE,FALSE,ox_reset);
         hKill = CreateEvent(NULL,TRUE,FALSE,ox_kill);    hKill = CreateEvent(NULL,TRUE,FALSE,ox_kill);
         sprintf(sock_id,"%d",bs);    sprintf(sock_id,"%d",bs);
         av[0] = prog;    av[0] = prog;
         av[1] = sock_id;    av[1] = sock_id;
         av[2] = dname; /* if dname == "1" then a message window is opened */    av[2] = dname; /* if dname == "1" then a message window is opened */
         av[3] = ox_intr;    av[3] = ox_intr;
         av[4] = ox_reset;    av[4] = ox_reset;
         av[5] = ox_kill;    av[5] = ox_kill;
         av[6] = NULL;    av[6] = NULL;
         Pget_rootdir(&rootdir);    if ( nolog ) {
         sprintf(AsirExe,"%s\\bin\\engine.exe",BDY(rootdir));      sprintf(AsirExe,"\"%s\"",nolog);
         _fileinfo = 1;      strcpy(AsirExe,nolog);
         hProc = _spawnv(_P_NOWAIT,AsirExe,av);    } else {
         return (int)hProc;      Pget_rootdir(&rootdir);
       sprintf(AsirExe,"%s\\bin\\engine.exe",BDY(rootdir));
     }
   #if _MSC_VER < 1400
     _fileinfo = 1;
   #endif
     hProc = _spawnv(_P_NOWAIT,AsirExe,av);
     return (int)hProc;
 #else /* VISUAL */  #else /* VISUAL */
         int b,s,i;    int b,s,i;
         struct hostent *hp;    struct hostent *hp;
         int pid;    int pid;
         char wname[BUFSIZ];    char wname[BUFSIZ];
         char buf[BUFSIZ];    char buf[BUFSIZ];
         char errcode;    char errcode;
   
         pid = fork();    pid = fork();
         if ( pid ) {    if ( pid ) {
                 return pid;      return pid;
         } else {    } else {
                 setpgid(0,getpid());      setpgid(0,getpid());
                 if ( bs != 3 && dup2(bs,3) != 3 )      if ( bs != 3 && dup2(bs,3) != 3 )
                         exit(1);        exit(1);
                 if ( bs != 4 && dup2(bs,4) != 4 )      if ( bs != 4 && dup2(bs,4) != 4 )
                         exit(1);        exit(1);
                 {      {
 #if defined(linux) || defined(__NeXT__) || defined(ultrix) || defined(__CYGWIN__)  #if defined(linux) || defined(__NeXT__) || defined(ultrix) || defined(__CYGWIN__)
 #include <sys/param.h>  #include <sys/param.h>
                         close(0);        close(0);
                         for ( i = 5; i < NOFILE; i++ )        for ( i = 5; i < NOFILE; i++ )
                                 close(i);          close(i);
 #else  #else
 #include <sys/resource.h>  #include <sys/resource.h>
                         struct rlimit rl;        struct rlimit rl;
   
                         getrlimit(RLIMIT_NOFILE,&rl);        getrlimit(RLIMIT_NOFILE,&rl);
                         close(0);        close(0);
                         for ( i = 5; i < rl.rlim_cur; i++ )        for ( i = 5; i < rl.rlim_cur; i++ )
                                 close(i);          close(i);
 #endif  #endif
                 }      }
                 if ( !nolog && !strcmp(dname,"1" ) ) /* XXX: for ssh */      if ( !nolog && !strcmp(dname,"1" ) ) /* XXX: for ssh */
                         execl(prog,prog,0);        execl(prog,prog,(char *)0);
                 else if ( nolog || !strcmp(dname,"0") ) {      else if ( nolog || !strcmp(dname,"0") ) {
                         FILE *null;        FILE *null;
   
                         null = fopen("/dev/null","wb");        null = fopen("/dev/null","wb");
                         dup2(fileno(null),1);        dup2(fileno(null),1);
                         dup2(fileno(null),2);        dup2(fileno(null),2);
                         if ( !strcmp(dname,"1") ) {        if ( !strcmp(dname,"1") ) {
                                 /* XXX */          /* XXX */
                                 putenv("DISPLAY=");          putenv("DISPLAY=");
                                 execl(prog,prog,0);          execl(prog,prog,(char *)0);
                         } else if ( strcmp(dname,"0") )        } else if ( strcmp(dname,"0") )
                                 execl(prog,prog,"-display",dname,0);          execl(prog,prog,"-display",dname,(char *)0);
                         else {        else {
                                 putenv("DISPLAY=");          putenv("DISPLAY=");
                                 execl(prog,prog,0);          execl(prog,prog,(char *)0);
                         }        }
                 } else      } else
                         execl(prog,prog,"-display",dname,0);        execl(prog,prog,"-display",dname,(char *)0);
                 /* On failure */      /* On failure */
                 errcode = 2;      errcode = 2;
                 write(4,&errcode,1);      write(4,&errcode,1);
                 exit(1);      exit(1);
         }    }
 #endif  #endif
 }  }
   
 static void launch_error(s)  static void launch_error(s)
 char *s;  char *s;
 {  {
         exit(0);    exit(0);
 }  }
   
 static void ox_io_init(sock)  static void ox_io_init(sock)
 int sock;  int sock;
 {  {
         endian_init();    endian_init();
         /* server mode */    /* server mode */
         sindex = get_iofp(sock,0,1);    sindex = get_iofp(sock,0,1);
         asir_OperandStack = (Obj *)CALLOC(BUFSIZ,sizeof(Obj));    asir_OperandStack = (Obj *)CALLOC(BUFSIZ,sizeof(Obj));
         asir_OperandStackPtr = -1;    asir_OperandStackPtr = -1;
 }  }
   
 static void push_one(obj)  static void push_one(obj)
 Obj obj;  Obj obj;
 {  {
         if ( !obj || OID(obj) != O_VOID )    if ( !obj || OID(obj) != O_VOID )
                 asir_OperandStack[++asir_OperandStackPtr] = obj;      asir_OperandStack[++asir_OperandStackPtr] = obj;
 }  }
   
 static Obj pop_one() {  static Obj pop_one() {
         if ( asir_OperandStackPtr >= 0 ) {    if ( asir_OperandStackPtr >= 0 ) {
                 return asir_OperandStack[asir_OperandStackPtr--];      return asir_OperandStack[asir_OperandStackPtr--];
         }    }
 }  }
   
 static void terminate_server(int sig)  static void terminate_server(int sig)
 {  {
 #if defined(SIGKILL)  #if defined(SIGKILL)
         kill(cpid,SIGKILL);    kill(cpid,SIGKILL);
 #endif  #endif
         exit(0);    exit(0);
 }  }
   

Legend:
Removed from v.1.17  
changed lines
  Added in v.1.29

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>