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

Diff for /OpenXM/src/ox_toolkit/ox.c between version 1.6 and 1.12

version 1.6, 1999/12/22 11:26:37 version 1.12, 2000/03/10 12:24:38
Line 1 
Line 1 
 /* -*- mode: C; coding: euc-japan -*- */  /* -*- mode: C; coding: euc-japan -*- */
 /* $OpenXM: OpenXM/src/ox_toolkit/ox.c,v 1.5 1999/12/16 06:58:01 ohara Exp $ */  /* $OpenXM: OpenXM/src/ox_toolkit/ox.c,v 1.11 2000/02/04 08:01:30 ohara Exp $ */
   
 /*  /*
 関数の名前付け規約(その2):     This module includes functions for sending/receiveng CMO's.
 (1) receive_cmo 関数はCMOタグとデータ本体を受信する. この関数は CMOタグの     Some commnets is written in Japanese by the EUC-JP coded
 値が事前に分からないときに使用する. 返り値として、cmo へのポインタを返す.     character set.
 (2) receive_cmo_XXX 関数は, CMOタグを親の関数で受信してから呼び出される関  
 数で、データ本体のみを受信し、cmo_XXX へのポインタを返す.  しかも、  
 関数内部で new_cmo_XXX 関数を呼び出す.  
 (3) send_cmo 関数はCMOタグとデータ本体を送信する.  
 (4) send_cmo_XXX 関数はCMOタグを親の関数で送信してから呼び出される関数で、  
 データ本体のみを送信する.  
   
 ----  
 (5) receive_ox_XXX 関数は存在しない(作らない).  receive_cmo を利用する.  
 (6) send_ox_XXX 関数は OX タグを含めて送信する.  
 (7) ox_XXX 関数は一連の送受信を含むより抽象的な操作を表現する.  
 ox_XXX 関数は、第一引数として、ox_file_t型の変数 sv をとる.  
   
 (8) YYY_cmo 関数と YYY_cmo_XXX 関数の関係は次の通り:  
 まず YYY_cmo 関数で cmo のタグを処理し、タグを除いた残りの部分を  
 YYY_cmo_XXX 関数が処理する.  cmo の内部に cmo_ZZZ へのポインタが  
 あるときには、その種類によらずに YYY_cmo 関数を呼び出す.  
 */  */
   
   
 #include <stdio.h>  #include <stdio.h>
 #include <stdlib.h>  #include <stdlib.h>
 #include <string.h>  #include <string.h>
Line 31  YYY_cmo_XXX 関数が処理する.  cmo の内部に cmo_ZZZ への
Line 15  YYY_cmo_XXX 関数が処理する.  cmo の内部に cmo_ZZZ への
 #include <errno.h>  #include <errno.h>
 #include <fcntl.h>  #include <fcntl.h>
 #include <sys/file.h>  #include <sys/file.h>
 #include <gmp.h>  
   
 #include "mysocket.h"  #include "mysocket.h"
 #include "ox.h"  #include "ox_toolkit.h"
 #include "parse.h"  #include "parse.h"
   
 static int          cmolen_cmo_int32(cmo_int32* c);  static int          cmolen_cmo_int32(cmo_int32* c);
Line 98  static char*        new_string_set_cmo_int32(int integ
Line 81  static char*        new_string_set_cmo_int32(int integ
 static char*        new_string_set_cmo_list(cmo_list *c);  static char*        new_string_set_cmo_list(cmo_list *c);
 static char*        new_string_set_cmo_zz(cmo_zz *c);  static char*        new_string_set_cmo_zz(cmo_zz *c);
   
   int ssh_ox_server(char *, char *, char *, short, short);
   
 int current_fd = 0;  int current_fd = 0;
 int set_current_fd(int fd)  int set_current_fd(int fd)
 {  {
         current_fd = fd;          current_fd = fd;
 }  }
   
 /* hook 関数 */  /* hook functions. (yet not implemented) */
 static hook_t hook_before_send_cmo = NULL;  static hook_t hook_before_send_cmo = NULL;
 static hook_t hook_after_send_cmo  = NULL;  static hook_t hook_after_send_cmo  = NULL;
   
Line 134  static cmo *call_hook_after_send_cmo(int fd, cmo *c)
Line 119  static cmo *call_hook_after_send_cmo(int fd, cmo *c)
         return c;          return c;
 }  }
   
 /* エラーハンドリングのため */  /* Handling an error. */
 static int current_received_serial = 0;  static int current_received_serial = 0;
   
 /* エラーを起こしたときにサーバは次を呼び出す.  */  /* If an error object be needed, then a server call the following function. */
 cmo_error2* make_error_object(int err_code, cmo *ob)  cmo_error2* make_error_object(int err_code, cmo *ob)
 {  {
     cmo_list* li = new_cmo_list();      cmo_list* li = new_cmo_list();
Line 148  cmo_error2* make_error_object(int err_code, cmo *ob)
Line 133  cmo_error2* make_error_object(int err_code, cmo *ob)
     return new_cmo_error2((cmo *)li);      return new_cmo_error2((cmo *)li);
 }  }
   
 /* add at Mon Sep  7 15:51:28 JST 1998 */  
 #define DEFAULT_SERIAL_NUMBER 0x0000ffff  #define DEFAULT_SERIAL_NUMBER 0x0000ffff
 #define receive_serial_number(x)   (receive_int32(x))  #define receive_serial_number(x)   (receive_int32(x))
   
 /* 新しいシリアル番号を得る */  /* getting a next serial number. */
 int next_serial()  int next_serial()
 {  {
     static int serial_number = DEFAULT_SERIAL_NUMBER;      static int serial_number = DEFAULT_SERIAL_NUMBER;
     return serial_number++;      return serial_number++;
 }  }
   
 /* int32 型のオブジェクトを送信する.  */  /* sending an object of int32 type. (not equal to cmo_int32 type)  */
 int send_int32(int fd, int int32)  int send_int32(int fd, int int32)
 {  {
     int32 = htonl(int32);      int32 = htonl(int32);
     return write(fd, &int32, sizeof(int));      return write(fd, &int32, sizeof(int));
 }  }
   
 /* int32 型のオブジェクトを受信する.  */  /* receiving an object of int32 type. (not equal to cmo_int32 type)  */
 int receive_int32(int fd)  int receive_int32(int fd)
 {  {
     int tag;      int tag;
Line 174  int receive_int32(int fd)
Line 158  int receive_int32(int fd)
     return ntohl(tag);      return ntohl(tag);
 }  }
   
 /* (OX_tag, serial number) を受信する.  */  /* receiving an (OX_tag, serial number)  */
 int receive_ox_tag(int fd)  int receive_ox_tag(int fd)
 {  {
     int serial;      int serial;
Line 183  int receive_ox_tag(int fd)
Line 167  int receive_ox_tag(int fd)
     return tag;      return tag;
 }  }
   
 /* (OX_tag, serial number) を送信する.   */  /* sending an (OX_tag, serial number)  */
 int send_ox_tag(int fd, int tag)  int send_ox_tag(int fd, int tag)
 {  {
     send_int32(fd, tag);      send_int32(fd, tag);
     return send_int32(fd, next_serial());      return send_int32(fd, next_serial());
 }  }
   
 /* CMO_LIST 関係の関数群 */  /* functions for a cmo_list */
 cell* new_cell()  cell* new_cell()
 {  {
     cell* h = malloc(sizeof(cell));      cell* h = malloc(sizeof(cell));
Line 238  int length_cmo_list(cmo_list* this)
Line 222  int length_cmo_list(cmo_list* this)
     return this->length;      return this->length;
 }  }
   
 /** receive_cmo_XXX 関数群 **/  /* functions named receive_cmo_*. */
 static cmo_null* receive_cmo_null(int fd)  static cmo_null* receive_cmo_null(int fd)
 {  {
     return new_cmo_null();      return new_cmo_null();
Line 314  static cmo_dms_generic* receive_cmo_dms_generic(int fd
Line 298  static cmo_dms_generic* receive_cmo_dms_generic(int fd
 static cmo_ring_by_name* receive_cmo_ring_by_name(int fd)  static cmo_ring_by_name* receive_cmo_ring_by_name(int fd)
 {  {
     cmo* ob = receive_cmo(fd);      cmo* ob = receive_cmo(fd);
     /* 意味的チェックが必要 */          /* We need to check semantics but yet ... */
     return new_cmo_ring_by_name(ob);      return new_cmo_ring_by_name(ob);
 }  }
   
Line 412  static void resize_mpz(mpz_ptr mpz, int size)
Line 396  static void resize_mpz(mpz_ptr mpz, int size)
     mpz->_mp_size = size;      mpz->_mp_size = size;
 }  }
   
 /** new_cmo_XXX 関数群 **/  /* functions named new_cmo_*. */
 cmo_null* new_cmo_null()  cmo_null* new_cmo_null()
 {  {
     cmo_null* m = malloc(sizeof(cmo_null));      cmo_null* m = malloc(sizeof(cmo_null));
Line 498  cmo_zz* new_cmo_zz_set_si(int i)
Line 482  cmo_zz* new_cmo_zz_set_si(int i)
     return c;      return c;
 }  }
   
   cmo_zz* new_cmo_zz_set_mpz(mpz_ptr z)
   {
       cmo_zz* c = new_cmo_zz();
       mpz_set(c->mpz, z);
       return c;
   }
   
 cmo_zz *new_cmo_zz_set_string(char *s)  cmo_zz *new_cmo_zz_set_string(char *s)
 {  {
     cmo_zz* c = new_cmo_zz_noinit();      cmo_zz* c = new_cmo_zz_noinit();
Line 570  int print_cmo(cmo* c)
Line 561  int print_cmo(cmo* c)
 {  {
     int tag = c->tag;      int tag = c->tag;
   
     symbol* symp = lookup_by_tag(tag);      symbol_t symp = lookup_by_tag(tag);
     if (symp != NULL) {      if (symp != NULL) {
         fprintf(stderr, "(%s", symp->key);          fprintf(stderr, "(%s", symp->key);
     }else {      }else {
Line 635  void ox_close(ox_file_t sv)
Line 626  void ox_close(ox_file_t sv)
 {  {
     send_ox_command(sv->control, SM_control_kill);      send_ox_command(sv->control, SM_control_kill);
 #ifdef DEBUG  #ifdef DEBUG
     sleep(2); /* OpenXM server の終了を待つ. あまり意味はない. */      sleep(2);
           /* We wait thar an OpenXM server terminates. */
     fprintf(stderr, "I have closed the connection to an Open XM server.\n");      fprintf(stderr, "I have closed the connection to an Open XM server.\n");
 #endif  #endif
 }  }
   
 void ox_shutdown(ox_file_t sv)  void ox_shutdown(ox_file_t sv)
 {  {
         /* 後で SM_shutdown を用いるものに書き換える予定. */          /* We need to use SM_shutdown but yet ... */
         ox_close(sv);          ox_close(sv);
 }  }
   
Line 668  void ox_push_cmd(ox_file_t sv, int sm_code)
Line 660  void ox_push_cmd(ox_file_t sv, int sm_code)
     send_ox_command(sv->stream, sm_code);      send_ox_command(sv->stream, sm_code);
 }  }
   
 /* ox_mathcap() をコールする.  */  
 cmo_mathcap* ox_mathcap(ox_file_t sv)  cmo_mathcap* ox_mathcap(ox_file_t sv)
 {  {
     send_ox_command(sv->stream, SM_mathcap);      send_ox_command(sv->stream, SM_mathcap);
Line 705  void ox_push_cmo(ox_file_t sv, cmo *c)
Line 696  void ox_push_cmo(ox_file_t sv, cmo *c)
         send_ox_cmo(sv->stream, c);          send_ox_cmo(sv->stream, c);
 }  }
   
 /* バッファのフラッシュの振りをする. */  /* a dummy function for flushing a connection. */
 int ox_flush(ox_file_t sv)  int ox_flush(ox_file_t sv)
 {  {
         return 1;          return 1;
 }  }
   
 /* 手抜き. (後で改善しよう...) */  /* a dummy password function. */
 static char *create_otp()  static char *create_otp()
 {  {
     static char otp[] = "otpasswd";      static char otp[] = "otpasswd";
     return otp;      return otp;
 }  }
   
 /* OneTimePassword の処理 */  /* proceeding an one time password. */
 static int login_with_otp(int fd, char* passwd)  static int login_with_otp(int fd, char* passwd)
 {  {
     int len   = strlen(passwd)+1;      int len   = strlen(passwd)+1;
Line 740  static int login_with_otp(int fd, char* passwd)
Line 731  static int login_with_otp(int fd, char* passwd)
     return ret;      return ret;
 }  }
   
 static int chdir_openxm_home_bin()  /* The environment variable OpenXM_HOME must be defined. */
   static char *concat_openxm_home_bin(char *s)
 {  {
     char *dir;      char *path;
     char *base = getenv("OpenXM_HOME");      char *base;
   
         if (base != NULL) {      /* if s includes '/' then it is not concaticated. */
                 dir = alloca(strlen(base)+5);          if (strchr(s, '/') != NULL) {
                 sprintf(dir, "%s/bin", base);                  return s;
         }else {  
                 dir = "/usr/local/OpenXM/bin";  
         }          }
         return chdir(dir);  
           base = getenv("OpenXM_HOME");
           path = malloc(strlen(base)+6+strlen(s));
           sprintf(path, "%s/bin/%s", base, s);
           return path;
 }  }
   
 /* example: which("xterm", getenv("PATH")); */  /* example: which("xterm", getenv("PATH")); */
Line 786  static int mysocketAccept2(int fd, char *pass)
Line 780  static int mysocketAccept2(int fd, char *pass)
     return -1;      return -1;
 }  }
   
 /* 0 でなければ、oxlog を介して ox を起動する。*/  /* if it is not 0, then we use oxlog to execute ox. */
 static int flag_ox_start_with_oxlog = 1;  static int flag_ox_start_with_oxlog = 1;
   
 /*  /*
Line 803  ox_file_t ox_start(char* host, char* ctl_prog, char* d
Line 797  ox_file_t ox_start(char* host, char* ctl_prog, char* d
     ox_file_t sv = NULL;      ox_file_t sv = NULL;
     char *pass;      char *pass;
     char ctl[128], dat[128];      char ctl[128], dat[128];
     short portControl = 0; /* short であることに注意 */      short portControl = 0;  /* short! */
     short portStream  = 0;      short portStream  = 0;
     char *dir;          char *oxlog;
         char *oxlog = "oxlog";  
   
           /* not overwrite */
   #if 0
           setenv("OpenXM_HOME", "/usr/local/OpenXM", 0);
   #endif
           if (getenv("OpenXM_HOME") == NULL) {
                   putenv("OpenXM_HOME=/usr/local/OpenXM");
           }
   
           oxlog    = concat_openxm_home_bin("oxlog");
           ctl_prog = concat_openxm_home_bin(ctl_prog);
           dat_prog = concat_openxm_home_bin(dat_prog);
   
     sv = malloc(sizeof(__ox_file_struct));      sv = malloc(sizeof(__ox_file_struct));
     sv->control = mysocketListen(host, &portControl);      sv->control = mysocketListen(host, &portControl);
     sv->stream  = mysocketListen(host, &portStream);      sv->stream  = mysocketListen(host, &portStream);
Line 817  ox_file_t ox_start(char* host, char* ctl_prog, char* d
Line 822  ox_file_t ox_start(char* host, char* ctl_prog, char* d
     pass = create_otp();      pass = create_otp();
   
     if (fork() == 0) {      if (fork() == 0) {
                 chdir_openxm_home_bin();  
                 if (flag_ox_start_with_oxlog) {                  if (flag_ox_start_with_oxlog) {
                         execl(oxlog, oxlog, "xterm", "-icon", "-e", ctl_prog,                          execl(oxlog, oxlog, "xterm", "-icon", "-e", ctl_prog,
                                   "-reverse", "-ox", dat_prog,                                    "-reverse", "-ox", dat_prog,
Line 837  ox_file_t ox_start(char* host, char* ctl_prog, char* d
Line 841  ox_file_t ox_start(char* host, char* ctl_prog, char* d
         close(sv->stream);          close(sv->stream);
         return NULL;          return NULL;
     }      }
     /* 10マイクロ秒, 時間稼ぎする. */      /* waiting 10 micro second. */
     usleep(10);      usleep(10);
     if((sv->stream  = mysocketAccept2(sv->stream, pass)) == -1) {      if((sv->stream  = mysocketAccept2(sv->stream, pass)) == -1) {
         return NULL;          return NULL;
Line 845  ox_file_t ox_start(char* host, char* ctl_prog, char* d
Line 849  ox_file_t ox_start(char* host, char* ctl_prog, char* d
     return sv;      return sv;
 }  }
   
   ox_file_t ox_start_remote_with_ssh(char *dat_prog, char* host)
   {
           ssh_ox_server(host, "ox", dat_prog, 1200, 1300);
           return ox_start_insecure_nonreverse(host, 1200, 1300);
   }
   
 /* ssh -f host oxlog xterm -e ox -ox ox_asir ... */  /* ssh -f host oxlog xterm -e ox -ox ox_asir ... */
 int ssh_ox_server(char *host, char *ctl_prog, char *dat_prog, short portControl, short portStream)  int ssh_ox_server(char *host, char *ctl_prog, char *dat_prog, short portControl, short portStream)
 {  {
           char *oxlog;
           char *ssh;
   
           oxlog    = concat_openxm_home_bin("oxlog");
           ctl_prog = concat_openxm_home_bin(ctl_prog);
           dat_prog = concat_openxm_home_bin(dat_prog);
   
           ssh = which("ssh", getenv("PATH"));
   
         if (fork() == 0) {          if (fork() == 0) {
                 execl("ssh", "ssh", "-f", host, "oxlog", "xterm", "-icon",                  execl(ssh, ssh, "-f", host, oxlog, "xterm", "-icon",
                           "-e", ctl_prog, "-insecure", "-ox", dat_prog,                            "-e", ctl_prog, "-insecure", "-ox", dat_prog,
                           "-data", portStream, "-control", portControl, "-host", host, NULL);                            "-data", portStream, "-control", portControl,
                             "-host", host, NULL);
                 exit(1);                  exit(1);
         }          }
 }  }
Line 874  ox_file_t ox_start_insecure_nonreverse(char* host, sho
Line 894  ox_file_t ox_start_insecure_nonreverse(char* host, sho
     /* ox は insecure のとき byte order の決定が正しくできないようだ... */      /* ox は insecure のとき byte order の決定が正しくできないようだ... */
     decideByteOrderClient(sv->control, 0);      decideByteOrderClient(sv->control, 0);
 #endif  #endif
     /* 10マイクロ秒, 時間稼ぎする. */      /* wainting 10 micro second. */
     usleep(10);      usleep(10);
     sv->stream  = mysocketOpen(host, portStream);      sv->stream  = mysocketOpen(host, portStream);
     decideByteOrderClient(sv->stream, 0);      decideByteOrderClient(sv->stream, 0);
     return sv;      return sv;
 }  }
   
 ox_file_t ox_start_insecure_nonreverse2(char* host, char *ctl_prog, char *dat_prog)  
 {  
         short portControl= 1200; /* 自動生成させよう... */  
         short portStream = 1300;  
   
         ssh_ox_server(host, ctl_prog, dat_prog, portControl, portStream);  
         return ox_start_insecure_nonreverse(host, portControl, portStream);  
 }  
   
 void ox_reset(ox_file_t sv)  void ox_reset(ox_file_t sv)
 {  {
     send_ox_command(sv->control, SM_control_reset_connection);      send_ox_command(sv->control, SM_control_reset_connection);
Line 907  void ox_reset(ox_file_t sv)
Line 918  void ox_reset(ox_file_t sv)
 #endif  #endif
 }  }
   
 /* 以下は bconv.c で必要とする関数群である. */  /* the following functions are needed by bconv.c */
   
 /* cmolen 関数は cmo の(送信時の)バイト長を返す. */  /* cmolen 関数は cmo の(送信時の)バイト長を返す. */
 /* cmolen_XXX 関数は cmo_XXX の tag を除いたバイト長を返す. */  /* cmolen_XXX 関数は cmo_XXX の tag を除いたバイト長を返す. */
Line 961  static int cmolen_cmo_distributed_polynomial(cmo_distr
Line 972  static int cmolen_cmo_distributed_polynomial(cmo_distr
     return cmolen_cmo_list((cmo_list *)c) + cmolen_cmo(c->ringdef);      return cmolen_cmo_list((cmo_list *)c) + cmolen_cmo(c->ringdef);
 }  }
   
 /* CMO がバイトエンコードされた場合のバイト列の長さを求める */  /* calculating the length of the byte stream of given CMO.  */
 int cmolen_cmo(cmo* c)  int cmolen_cmo(cmo* c)
 {  {
     int size = sizeof(int);      int size = sizeof(int);
Line 1072  static int dump_cmo_distributed_polynomial(cmo_distrib
Line 1083  static int dump_cmo_distributed_polynomial(cmo_distrib
     }      }
 }  }
   
 /* タグを書き出してから、各関数を呼び出す */  /* after its tag is sent, we invoke each functions. */
 int dump_cmo(cmo* m)  int dump_cmo(cmo* m)
 {  {
     dump_integer(m->tag);      dump_integer(m->tag);
Line 1171  int send_ox_cmo(int fd, cmo* m)
Line 1182  int send_ox_cmo(int fd, cmo* m)
     send_cmo(fd, m);      send_cmo(fd, m);
 }  }
   
 /* send_cmo_xxx 関数群 */  /* send_cmo_* functions */
 static int send_cmo_null(int fd, cmo_null* c)  static int send_cmo_null(int fd, cmo_null* c)
 {  {
     return 0;      return 0;
Line 1249  static int send_cmo_error2(int fd, cmo_error2* c)
Line 1260  static int send_cmo_error2(int fd, cmo_error2* c)
     return 0;      return 0;
 }  }
   
 /* CMOを送る.  OX_tag は送信済*/  /* sending a CMO.  (Remarks: OX_tag is already sent.) */
 int send_cmo(int fd, cmo* c)  int send_cmo(int fd, cmo* c)
 {  {
     int tag = c->tag;      int tag = c->tag;
Line 1261  int send_cmo(int fd, cmo* c)
Line 1272  int send_cmo(int fd, cmo* c)
     case CMO_NULL:      case CMO_NULL:
     case CMO_ZERO:      case CMO_ZERO:
     case CMO_DMS_GENERIC:      case CMO_DMS_GENERIC:
         send_cmo_null(fd, c);  /* 空の関数 */          send_cmo_null(fd, c);  /* empty function. */
         break;          break;
     case CMO_INT32:      case CMO_INT32:
         send_cmo_int32(fd, (cmo_int32 *)c);          send_cmo_int32(fd, (cmo_int32 *)c);
Line 1343  static cmo_list* make_list_of_id(int ver, char* ver_s,
Line 1354  static cmo_list* make_list_of_id(int ver, char* ver_s,
 static cmo_list *make_list_of_tag(int type)  static cmo_list *make_list_of_tag(int type)
 {  {
     cmo_list *li = new_cmo_list();      cmo_list *li = new_cmo_list();
     symbol *symp;      symbol_t symp;
     int i = 0;      int i = 0;
     while((symp = lookup(i++))->key != NULL) {      while((symp = lookup(i++))->key != NULL) {
         if (symp->type == type) {          if (symp->type == type) {
Line 1448  static char *new_string_set_cmo_list(cmo_list *m)
Line 1459  static char *new_string_set_cmo_list(cmo_list *m)
   
 char *new_string_set_cmo(cmo *m)  char *new_string_set_cmo(cmo *m)
 {  {
     symbol *symp;      symbol_t symp;
     switch(m->tag) {      switch(m->tag) {
     case CMO_ZZ:      case CMO_ZZ:
         return new_string_set_cmo_zz((cmo_zz *)m);          return new_string_set_cmo_zz((cmo_zz *)m);
Line 1465  char *new_string_set_cmo(cmo *m)
Line 1476  char *new_string_set_cmo(cmo *m)
         symp = lookup_by_tag(m->tag);          symp = lookup_by_tag(m->tag);
         fprintf(stderr, "I do not know how to convert %s to a string.\n", symp->key);          fprintf(stderr, "I do not know how to convert %s to a string.\n", symp->key);
 #endif  #endif
         /* まだ実装していません. */          /* yet not implemented. */
         return NULL;          return NULL;
     }      }
 }  }

Legend:
Removed from v.1.6  
changed lines
  Added in v.1.12

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