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

Diff for /OpenXM_contrib2/asir2000/io/tcpf_win_mini.c between version 1.1 and 1.5

version 1.1, 2006/09/26 05:35:26 version 1.5, 2018/03/29 01:32:54
Line 1 
Line 1 
 /* $OpenXM$ */  /* $OpenXM: OpenXM_contrib2/asir2000/io/tcpf_win_mini.c,v 1.4 2013/08/20 14:22:33 ohara Exp $ */
   
 #include "ca.h"  #include "ca.h"
 #include "parse.h"  #include "parse.h"
Line 12 
Line 12 
 static int control_port,server_port;  static int control_port,server_port;
 int win_ox_launch();  int win_ox_launch();
 void win_spawn_server(char *control_port_str,char *server_port_str);  void win_spawn_server(char *control_port_str,char *server_port_str);
 void win_get_rootdir(rootdir);  void win_get_rootdir();
 char *win_pop_string();  int win_pop_string(Obj *);
 static int launched=0;  void free_obj(Obj obj);
 extern int terminate;  extern int terminate;
   static char rootdir[BUFSIZ];
   
 int win_ox_launch()  int win_ox_launch()
 {  {
         int cs,ss,cn,sn;    int cs,ss,cn,sn;
         char control_port_str[BUFSIZ];    char control_port_str[BUFSIZ];
         char server_port_str[BUFSIZ];    char server_port_str[BUFSIZ];
     static int launched=0;
   
         if ( launched ) return 0;    if ( launched ) return 0;
   
         control_port_str[0] = 0;    control_port_str[0] = 0;
         server_port_str[0] = 0;    server_port_str[0] = 0;
         do {    do {
                 generate_port(0,control_port_str);      generate_port(0,control_port_str);
                 generate_port(0,server_port_str);      generate_port(0,server_port_str);
                 cs = try_bind_listen(0,control_port_str);      cs = try_bind_listen(0,control_port_str);
                 if ( cs < 0 ) continue;      if ( cs < 0 ) continue;
                 ss = try_bind_listen(0,server_port_str);      ss = try_bind_listen(0,server_port_str);
                 if ( ss < 0 ) continue;      if ( ss < 0 ) continue;
                 win_spawn_server(control_port_str,server_port_str);      win_spawn_server(control_port_str,server_port_str);
                 cs = try_accept(0,cs);      cs = try_accept(0,cs);
                 if ( cs < 0 ) continue;      if ( cs < 0 ) continue;
                 ss = try_accept(0,ss);      ss = try_accept(0,ss);
                 if ( ss < 0 ) continue;      if ( ss < 0 ) continue;
         } while ( cs < 0 || ss < 0 );    } while ( cs < 0 || ss < 0 );
   
         /* client mode */    /* client mode */
         cn = get_iofp(cs,control_port_str,0);    cn = get_iofp(cs,control_port_str,0);
         sn = get_iofp(ss,server_port_str,0);    sn = get_iofp(ss,server_port_str,0);
         /* get_iofp returns -1 if the laucher could not spawn the server */    /* get_iofp returns -1 if the laucher could not spawn the server */
         if ( sn < 0 ) {    if ( sn < 0 ) {
                 /* we should terminate the launcher */      /* we should terminate the launcher */
                 ox_send_cmd(cn,SM_shutdown); ox_flush_stream_force(cn);      ox_send_cmd(cn,SM_shutdown); ox_flush_stream_force(cn);
                 return -1;      return -1;
         }    }
   
         /* register server to the server list */    /* register server to the server list */
         control_port = cn;    control_port = cn;
         server_port = sn;    server_port = sn;
         launched = 1;    launched = 1;
         return 0;    return 0;
 }  }
   
 void win_spawn_server(char *control_port_str,char *server_port_str)  void win_spawn_server(char *control_port_str,char *server_port_str)
 {  {
         char AsirExe[BUFSIZ];    char AsirExe[BUFSIZ];
         char AsirExePath[BUFSIZ];    char AsirExePath[BUFSIZ];
         char rootdir[BUFSIZ];    char *av[BUFSIZ];
         char *av[BUFSIZ];  
   
 //      win_get_rootdir(rootdir);  //  strcpy(rootdir,"c:\\program files\\asir");
         strcpy(rootdir,"c:\\program files\\asir");  //  sprintf(AsirExe,"%s\\bin\\engine.exe",rootdir);
         sprintf(AsirExe,"%s\\bin\\engine.exe",rootdir);    sprintf(AsirExe,"c:\\Program Files\\asir\\bin\\engine.exe",rootdir);
         sprintf(AsirExePath,"\"%s\"",AsirExe);    sprintf(AsirExePath,"\"%s\"",AsirExe);
         av[0] = "ox_launch";    av[0] = "ox_launch";
         av[1] = "127.0.0.1";    av[1] = "127.0.0.1";
         av[2] = "0";    av[2] = "0";
         av[3] = control_port_str;    av[3] = control_port_str;
         av[4] = server_port_str;    av[4] = server_port_str;
         av[5] = "ox_asir_wfep";    av[5] = "ox_asir_wfep";
         av[6] = "1";    av[6] = "1";
         av[7] = AsirExePath;    av[7] = AsirExePath;
         av[8] = 0;    av[8] = 0;
   
         _spawnv(_P_NOWAIT,AsirExe,av);    _spawnv(_P_NOWAIT,AsirExe,av);
 }  }
   
 char *win_pop_string()  void win_get_rootdir()
 {  {
         Obj obj;    char *slash;
         int id,serial;  
   
         if ( !launched ) return "";    GetModuleFileName(NULL,rootdir,BUFSIZ);
         serial = ox_recv(server_port,&id,&obj);    slash = strrchr(rootdir,'\\');
         if ( serial < 0 ) return 0;    *slash = 0;
     slash = strrchr(rootdir,'\\');
     if ( slash ) *slash = 0;
   }
   
         if ( id == OX_DATA ) {  // ret=1 : data, ret=0 : void, ret=-1 : terminate
                 if ( obj && OID(obj) == O_STR ) return BDY((STRING)obj);  
                 else return "";  int win_pop_string(Obj *obj)
         } else if ( id == OX_SYNC_BALL ) {  {
                 ox_send_sync(server_port);    int id,serial;
                 ox_flush_stream_force(server_port);  
                 return "";    serial = ox_recv(server_port,&id,obj);
         } else return "";    if ( serial < 0 ) return -1;
   
     if ( id == OX_DATA )
       return 1;
     else {
       if ( id == OX_SYNC_BALL ) {
         ox_send_sync(server_port);
         ox_flush_stream_force(server_port);
       }
       *obj = 0;
       return 0;
     }
 }  }
   
   /* ret=1 => data, ret=0 => void, ret=-1 => terminated */
   
   int win_pop_one(Obj *obj)
   {
     int id,serial;
   
     serial = ox_recv(server_port,&id,obj);
     if ( serial < 0 ) return -1;
   
     if ( id == OX_DATA ) {
       return 1;
     } else if ( id == OX_SYNC_BALL ) {
       ox_send_sync(server_port);
       ox_flush_stream_force(server_port);
       return 0;
     } else return 0;
   }
   
 void win_execute_string(char *cmd)  void win_execute_string(char *cmd)
 {  {
         struct oSTRING str;    struct oSTRING str;
   
         if ( !launched ) return;    OID(&str) = O_STR;
         OID(&str) = O_STR;    BDY(&str) = cmd;
         BDY(&str) = cmd;    ox_send_data(server_port,&str);
         ox_send_data(server_port,&str);    ox_send_cmd(server_port,SM_executeStringByLocalParser);
         ox_send_cmd(server_port,SM_executeStringByLocalParser);    ox_send_cmd(server_port,SM_popString);
         ox_send_cmd(server_port,SM_popString);    ox_flush_stream_force(server_port);
         ox_flush_stream_force(server_port);  
 }  }
   
 void ox_reset()  void ox_reset()
 {  {
         USINT t;    USINT t;
         int id;    int id;
         Obj obj;    Obj obj;
   
         if ( !launched ) return;    ox_send_cmd(control_port,SM_control_reset_connection);
         ox_send_cmd(control_port,SM_control_reset_connection);    ox_flush_stream_force(control_port);
         ox_flush_stream_force(control_port);    ox_recv(control_port,&id,&obj); t = (USINT)obj;
         ox_recv(control_port,&id,&obj); t = (USINT)obj;    Sleep(100);
         Sleep(100);    ox_send_cmd(server_port,SM_nop);
         ox_send_cmd(server_port,SM_nop);    ox_flush_stream_force(server_port);
         ox_flush_stream_force(server_port);  
 }  }
   
 void ox_shutdown()  void ox_shutdown()
 {  {
         if ( !launched ) return;    terminate = 1;
         terminate = 1;    ox_send_cmd(server_port,SM_shutdown);
         ox_send_cmd(server_port,SM_shutdown);    Sleep(100);
         Sleep(100);    ox_send_cmd(control_port,SM_shutdown);
         ox_send_cmd(control_port,SM_shutdown);  }
   
   void free_obj(Obj obj)
   {
     NODE n,n1;
   
     if ( !obj ) return;
     switch ( OID(obj) ) {
       case O_USINT:
         break;
       case O_STR:
         free(BDY((STRING)obj));
         break;
       case O_LIST:
         n = BDY((LIST)obj);
         while ( n ) {
           free_obj(BDY(n));
           n1 = NEXT(n);
           free(n);
           n = n1;
         }
         break;
       case O_ERR:
         free_obj(BDY((LIST)obj));
         break;
       default:
         break;
     }
     free(obj);
 }  }
   

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.5

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