[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.6 and 1.13

version 1.6, 2000/11/28 04:24:12 version 1.13, 2003/01/11 11:42:31
Line 1 
Line 1 
 /* -*- mode: C; coding: euc-japan -*- */  /* -*- mode: C; coding: euc-japan -*- */
 /* $OpenXM: OpenXM/src/ox_toolkit/oxf.c,v 1.5 2000/11/24 05:49:27 ohara Exp $ */  /* $OpenXM: OpenXM/src/ox_toolkit/oxf.c,v 1.12 2002/04/10 08:55:45 ohara Exp $ */
   
 /*  /*
    This module includes functions for sending/receiveng CMO's.     This module includes functions for sending/receiveng CMO's.
    Some commnets is written in Japanese by the EUC-JP coded     Some commnets are written in Japanese by the EUC-JP coded
    character set.     character set.
 */  */
   
Line 16 
Line 16 
 #include <sys/param.h>  #include <sys/param.h>
 #include <time.h>  #include <time.h>
   
   #if defined(__sun__)
   #include <netdb.h>
   #include <sys/types.h>
   #include <netinet/in.h>
   #endif
   
 #include "mysocket.h"  #include "mysocket.h"
 #include "ox_toolkit.h"  #include "ox_toolkit.h"
   
Line 73  static int receive_int32_lbo(OXFILE *oxfp)
Line 79  static int receive_int32_lbo(OXFILE *oxfp)
     return tag;      return tag;
 }  }
   
 /* socket システムコールなどで socket を開いたのち、  /* (1) getting the fd by socket(2).
    fdopen(sd, "a+") でバッファリングする(予定)。("w+" ではない)     (2) preparing a buffer by fdopen(fd, "a+"). (not "w+")
    バッファリングの後、バイトオーダを決定し、     (3) determing the byte order of the OX connection.
    oxf_setopt() で関数ポインタを設定し直す。*/     (4) setting function pointers by oxf_setopt().
   */
 OXFILE *oxf_open(int fd)  OXFILE *oxf_open(int fd)
 {  {
     OXFILE *oxfp = (OXFILE *)malloc(sizeof(OXFILE));      OXFILE *oxfp = (OXFILE *)malloc(sizeof(OXFILE));
       oxfp = (OXFILE *)malloc(sizeof(OXFILE));
     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 92  OXFILE *oxf_open(int fd)
Line 100  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 114  void oxf_determine_byteorder_client(OXFILE *oxfp)
Line 127  void oxf_determine_byteorder_client(OXFILE *oxfp)
     oxf_setopt(oxfp, mode);      oxf_setopt(oxfp, mode);
 }  }
   
 /* Server 側ではこちらを用いる */  /* If the program is an OX server, then you must use this function. */
 /* いまの実装は dup されていることが前提になっている */  
 void oxf_determine_byteorder_server(OXFILE *oxfp)  void oxf_determine_byteorder_server(OXFILE *oxfp)
 {  {
     int  offer = OX_BYTE_LITTLE_ENDIAN;      int  offer = OX_BYTE_LITTLE_ENDIAN;
Line 165  int oxf_listen(short *portp)
Line 177  int oxf_listen(short *portp)
 OXFILE *oxf_connect_active(char *hostname, short port)  OXFILE *oxf_connect_active(char *hostname, short port)
 {  {
     int fd = mysocketOpen(hostname, port);      int fd = mysocketOpen(hostname, port);
     return oxf_open(fd);      return (fd < 0)? NULL: oxf_open(fd);
 }  }
   
 OXFILE *oxf_connect_passive(int listened)  OXFILE *oxf_connect_passive(int listened)
 {  {
     int fd = mysocketAccept(listened);      int fd = mysocketAccept(listened);
     return oxf_open(fd);      return (fd < 0)? NULL: oxf_open(fd);
 }  }
   
 #define LENGTH_OF_ONETIME_PASSWORD 64  #define LENGTH_OF_ONETIME_PASSWORD 64
Line 259  int oxc_start(char *remote_host, short port, char *pas
Line 271  int oxc_start(char *remote_host, short port, char *pas
         if ((pid = fork()) == 0) {          if ((pid = fork()) == 0) {
             sprintf(ports, "%d", port);              sprintf(ports, "%d", port);
 #ifdef DEBUG  #ifdef DEBUG
             fprintf(stderr, "oxf.c:: oxc_start() does %s(ssh) -f %s -h %s -p %s -c %s\n", remote_host, cmd, localhost, ports, passwd);              fprintf(ox_stderr, "oxf.c:: oxc_start() does %s(ssh) -f %s -h %s -p %s -c %s\n", remote_host, cmd, localhost, ports, passwd);
 #endif  #endif
             execlp("ssh", remote_host, "-f", cmd,              execlp("ssh", remote_host, "-f", cmd,
                   "-h", localhost, "-p", ports,"-c", passwd, NULL);                    "-h", localhost, "-p", ports,"-c", passwd, NULL);
Line 268  int oxc_start(char *remote_host, short port, char *pas
Line 280  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;
   }
   
   static void pipe_send_string(int fd, char *s)
   {
           int len  = strlen(s);
           int lenN = htonl(len);
           write(fd, &lenN, sizeof(int));
           write(fd, s, len+1);
   }
   
   static char *pipe_read_string()
   {
           int len;
           char *s;
           read(0, &len, sizeof(int));
           len = ntohl(len)+1;
           s = malloc(len);
           read(0, s, len);
           return s;
   }
   
   /* The data format used by pipe_send_info() is defined in OX-RFC-101. */
   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"); */
 OXFILE *oxf_execute_cmd(OXFILE *oxfp, char *cmd)  OXFILE *oxf_execute_cmd(OXFILE *oxfp, char *cmd)
 {  {
Line 275  OXFILE *oxf_execute_cmd(OXFILE *oxfp, char *cmd)
Line 352  OXFILE *oxf_execute_cmd(OXFILE *oxfp, char *cmd)
     int listened;      int listened;
   
     if ((listened = oxf_listen(&port)) != -1) {      if ((listened = oxf_listen(&port)) != -1) {
         send_ox_cmo(oxfp, (cmo *)new_cmo_int32(port));                  cmo_list *args =  list_appendl(NULL, list_append(new_cmo_list(), new_cmo_int32(port)), new_cmo_string(cmd), NULL);
         send_ox_cmo(oxfp, (cmo *)new_cmo_string(cmd));                  send_ox_cmo(oxfp, (cmo *)args);
         send_ox_cmo(oxfp, (cmo *)new_cmo_int32(2));  /* number of arguments */          send_ox_command(oxfp, SM_control_spawn_server);
         send_ox_cmo(oxfp, (cmo *)new_cmo_string("oxc_open"));  
         send_ox_command(oxfp, SM_executeFunction);  
         return oxf_connect_passive(listened);          return oxf_connect_passive(listened);
     }      }
     return NULL;      return NULL;

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

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