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

Diff for /OpenXM/src/ox_toolkit/oxf.c between version 1.5 and 1.8

version 1.5, 2000/11/24 05:49:27 version 1.8, 2000/12/01 07:27:03
Line 1 
Line 1 
 /* -*- mode: C; coding: euc-japan -*- */  /* -*- mode: C; coding: euc-japan -*- */
 /* $OpenXM: OpenXM/src/ox_toolkit/oxf.c,v 1.4 2000/10/12 15:53:25 ohara Exp $ */  /* $OpenXM: OpenXM/src/ox_toolkit/oxf.c,v 1.7 2000/11/28 22:11:14 ohara Exp $ */
   
 /*  /*
    This module includes functions for sending/receiveng CMO's.     This module includes functions for sending/receiveng CMO's.
Line 19 
Line 19 
 #include "mysocket.h"  #include "mysocket.h"
 #include "ox_toolkit.h"  #include "ox_toolkit.h"
   
   static mathcap *oxf_mathcap(OXFILE *oxfp);
   
 static int send_int32_lbo(OXFILE *oxfp, int int32);  static int send_int32_lbo(OXFILE *oxfp, int int32);
 static int send_int32_nbo(OXFILE *oxfp, int int32);  static int send_int32_nbo(OXFILE *oxfp, int int32);
 static int receive_int32_lbo(OXFILE *oxfp);  static int receive_int32_lbo(OXFILE *oxfp);
Line 82  OXFILE *oxf_open(int fd)
Line 84  OXFILE *oxf_open(int fd)
     oxfp->fd = fd;      oxfp->fd = fd;
     oxfp->send_int32    = send_int32_nbo;      oxfp->send_int32    = send_int32_nbo;
     oxfp->receive_int32 = receive_int32_nbo;      oxfp->receive_int32 = receive_int32_nbo;
       oxfp->serial_number = 0;
     oxfp->control = NULL;      oxfp->control = NULL;
     oxfp->error = 0;      oxfp->error = 0;
     oxfp->mathcap = NULL;      oxfp->mathcap = NULL;
Line 90  OXFILE *oxf_open(int fd)
Line 93  OXFILE *oxf_open(int fd)
     /* return (oxfp->fp != NULL)? oxfp: NULL; */      /* return (oxfp->fp != NULL)? oxfp: NULL; */
 }  }
   
   int oxf_fileno(OXFILE *oxfp)
   {
       return oxfp->fd;
   }
   
 OXFILE *oxf_control(OXFILE *oxfp)  OXFILE *oxf_control(OXFILE *oxfp)
 {  {
     return oxfp->control;      return oxfp->control;
Line 205  int oxf_confirm_server(OXFILE *oxfp, char *passwd)
Line 213  int oxf_confirm_server(OXFILE *oxfp, char *passwd)
     return oxf_write(passwd, 1, strlen(passwd)+1, oxfp);      return oxf_write(passwd, 1, strlen(passwd)+1, oxfp);
 }  }
   
 void oxf_mathcap_update(OXFILE *oxfp, cmo_mathcap *ob)  __inline__
   static mathcap *oxf_mathcap(OXFILE *oxfp)
 {  {
     if (oxfp->mathcap == NULL) {      if (oxfp->mathcap == NULL) {
         oxfp->mathcap = new_mathcap();          oxfp->mathcap = new_mathcap();
     }      }
     mathcap_update(oxfp->mathcap, ob);          return oxfp->mathcap;
 }  }
   
   cmo_mathcap *oxf_cmo_mathcap(OXFILE *oxfp)
   {
           return mathcap_get(oxf_mathcap(oxfp));
   }
   
   void oxf_mathcap_update(OXFILE *oxfp, cmo_mathcap *ob)
   {
       mathcap_update(oxf_mathcap(oxfp), ob);
   }
   
 /* example: which("xterm", getenv("PATH")); */  /* example: which("xterm", getenv("PATH")); */
 char *which(char *exe, const char *env)  char *which(char *exe, const char *env)
 {  {
Line 253  int oxc_start(char *remote_host, short port, char *pas
Line 272  int oxc_start(char *remote_host, short port, char *pas
         }          }
     }      }
     return pid;      return pid;
   }
   
   /* Remarks: ssh determines remote host by his name, i.e. by arg[0]. */
   int oxc_start_with_pipe(char *remote_host, int port, char *passwd)
   {
       char localhost[MAXHOSTNAMELEN];
       char ports[128];
       int  pid = 0;
       char *cmd = "oxc";
           int  pipefd[2];
   
       if (gethostname(localhost, MAXHOSTNAMELEN)==0) {
                   if (pipe(pipefd) < 0) {
                           return -1;
                   }
           if ((pid = fork()) == 0) {
                           dup2(pipefd[1], 0);
                           close(pipefd[0]);
                           close(pipefd[1]);
               execlp("ssh", remote_host, cmd, NULL);
                           exit(1);
           }
                   close(pipefd[1]);
                   pipe_send_info(pipefd[0], localhost, port, passwd);
       }
       return pid;
   }
   
   /* pipe_*_info で送る情報の形式の定義 */
   /* Integer port    : 4byte, ポート番号, Network byte order
      String  hostname: ホスト名
      String  password: パスワード
   
      String は C のストリングではなくて、cmo_string のような、長さ付きの
      ストリングである。ただし、\0 文字を含む。
      すなわち、"Hello" は (int32)6 H e l l o \0 に展開される(合計10byte)。
   */
   
   static void pipe_send_string(int fd, char *s)
   {
           int len  = strlen(s)+1;
           int lenN = htonl(len);
           write(fd, &lenN, sizeof(int));
           write(fd, s, len);
   }
   
   static char *pipe_read_string()
   {
           int len;
           char *s;
           read(0, &len, sizeof(int));
           len = ntohl(len);
           s = malloc(len);
           read(0, s, len);
           return s;
   }
   
   void pipe_send_info(int fd, char *hostname, int port, char *password)
   {
           port = htonl(port);
           write(fd, &port, sizeof(int));
           pipe_send_string(fd, hostname);
           pipe_send_string(fd, password);
   }
   
   void pipe_read_info(char **hostname, int *port, char **password)
   {
           if (read(0, port, sizeof(int)) > 0) {
                   *port = ntohl(*port);
                   *hostname = pipe_read_string();
                   *password = pipe_read_string();
                   return 0;
           }
           return -1;
 }  }
   
 /*  Example: oxf_execute_cmd(oxfp, "ox_sm1"); */  /*  Example: oxf_execute_cmd(oxfp, "ox_sm1"); */

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

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