[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.17 and 1.25

version 1.17, 2003/06/02 10:25:57 version 1.25, 2016/07/14 08:16:19
Line 1 
Line 1 
 /* -*- mode: C; coding: euc-japan -*- */  /* -*- mode: C; coding: euc-japan -*- */
 /* $OpenXM: OpenXM/src/ox_toolkit/oxf.c,v 1.16 2003/05/29 15:50:49 ohara Exp $ */  /* $OpenXM: OpenXM/src/ox_toolkit/oxf.c,v 1.24 2016/06/30 01:14:00 ohara Exp $ */
   
 /*  /*
    This module includes functions for sending/receiveng CMO's.     This module includes functions for sending/receiveng CMO's.
    Some commnets are written in Japanese by the EUC-JP coded  
    character set.  
 */  */
   
   #if defined(_MSC_VER)
   #define _CRT_RAND_S
   #endif
   
 #include <stdio.h>  #include <stdio.h>
 #include <stdlib.h>  #include <stdlib.h>
 #include <string.h>  #include <string.h>
 #include <unistd.h>  
 #include <fcntl.h>  #include <fcntl.h>
 #include <sys/file.h>  
 #include <sys/param.h>  
 #include <time.h>  #include <time.h>
   #include <limits.h>
   
 #if defined(__sun__)  #if defined(__sun__) || defined(__FreeBSD__)
 #include <netdb.h>  #include <netdb.h>
 #include <sys/types.h>  #include <sys/types.h>
 #include <netinet/in.h>  #include <netinet/in.h>
   #elif defined(__linux__)
   #include <arpa/inet.h>
 #endif  #endif
   
   #if defined(__sun__)
   #include <synch.h>
   #else
   #include <inttypes.h>
   #endif
   
   #if defined(_MSC_VER)
   #include <io.h>
   #include <winsock2.h>
   #define X_OK 0x01
   #define R_OK 0x04
   #define MAXHOSTNAMELEN 256
   #define srandom(s)  (srand((s)))
   static int random()
   {
       int r;
       rand_s(&r);
       return r;
   }
   #define READ(fd,buf,n)   (recv((fd),(buf),(n),0))
   #define WRITE(fd,buf,n)  (send((fd),(buf),(n),0))
   #else
   #include <unistd.h>
   #include <sys/file.h>
   #include <sys/param.h>
   #define READ(fd,buf,n)   (read((fd),(buf),(n)))
   #define WRITE(fd,buf,n)  (write((fd),(buf),(n)))
   #endif
   
 #include "mysocket.h"  #include "mysocket.h"
 #include "ox_toolkit.h"  #include "ox_toolkit.h"
   
Line 32  static int send_int32_nbo(OXFILE *oxfp, int int32);
Line 63  static int send_int32_nbo(OXFILE *oxfp, int int32);
 static int receive_int32_lbo(OXFILE *oxfp);  static int receive_int32_lbo(OXFILE *oxfp);
 static int receive_int32_nbo(OXFILE *oxfp);  static int receive_int32_nbo(OXFILE *oxfp);
   
   static int send_int64_nbo_le(OXFILE *oxfp, double int64);
   static int send_int64_lbo(OXFILE *oxfp, double int64);
   static double receive_int64_nbo_le(OXFILE *oxfp);
   static double receive_int64_lbo(OXFILE *oxfp);
   
   static void pipe_send_info(int fd, char *hostname, int port, char *password);
   
   /* translating double of little endian byte order to one of big endian. */
   double htonll_le(double n)
   {
       int i;
       double r;
           char *sp = (char *)&n, *dp = (char *)&r + sizeof(double)-1;
       for(i=0; i<sizeof(double); i++) {
                   *dp-- = *sp++;
       }
       return r;
   }
   
 /* enable write buffering */  /* enable write buffering */
 int oxf_setbuffer(OXFILE *oxfp, char *buf, int size)  int oxf_setbuffer(OXFILE *oxfp, char *buf, int size)
 {  {
Line 44  int oxf_setbuffer(OXFILE *oxfp, char *buf, int size)
Line 94  int oxf_setbuffer(OXFILE *oxfp, char *buf, int size)
     oxfp->wbuf = buf;      oxfp->wbuf = buf;
     oxfp->wbuf_size  = size;      oxfp->wbuf_size  = size;
     oxfp->wbuf_count = 0;      oxfp->wbuf_count = 0;
       return 0;
 }  }
   
   void OX_FD_ZERO(OXFILE_set *s)
   {
       memset(s,0,sizeof(OXFILE_set));
   }
   
   void OX_FD_SET(OXFILE *oxfp,OXFILE_set *s)
   {
       if (oxfp != NULL && oxfp->fd >=0 && oxfp->fd < OX_FD_SETSIZE && !FD_ISSET(oxfp->fd,&(s->fdset))) {
           FD_SET(oxfp->fd,&(s->fdset));
           s->p[oxfp->fd] = oxfp;
           s->count++;
       }
   }
   
   void OX_FD_CLR(OXFILE *oxfp,OXFILE_set *s)
   {
       if (oxfp != NULL && oxfp->fd >=0 && oxfp->fd < OX_FD_SETSIZE && FD_ISSET(oxfp->fd,&(s->fdset))) {
           FD_CLR(oxfp->fd,&(s->fdset));
           s->p[oxfp->fd] = NULL;
           s->count--;
       }
   }
   
   int OX_FD_ISSET(OXFILE *oxfp,OXFILE_set *s)
   {
       if (oxfp != NULL && oxfp->fd >=0 && oxfp->fd < OX_FD_SETSIZE) {
           return FD_ISSET(oxfp->fd,&(s->fdset));
       }
       return 0;
   }
   
   /* The argument `s' is a set of file descripters for reading */
   OXFILE *oxf_select(OXFILE_set *s, struct timeval *tv)
   {
       int r;
       r = select(OX_FD_SETSIZE,&(s->fdset),NULL,NULL,tv);
       return (r<0)? NULL: s->p[r];
   }
   
 int oxf_read(void *buffer, size_t size, size_t num, OXFILE *oxfp)  int oxf_read(void *buffer, size_t size, size_t num, OXFILE *oxfp)
 {  {
     int n = read(oxfp->fd, buffer, size*num);      int n = READ(oxfp->fd, buffer, size*num);
     if (n <= 0) {      if (n <= 0) {
   #if 0
         oxfp->error = 1;          oxfp->error = 1;
   #else
           exit(0);
   #endif
     }      }
     return n;      return n;
 }  }
Line 59  int oxf_write(void *buffer, size_t size, size_t num, O
Line 153  int oxf_write(void *buffer, size_t size, size_t num, O
 {  {
     size_t sz = size*num;      size_t sz = size*num;
     if (oxfp->wbuf == NULL) { /* no buffering */      if (oxfp->wbuf == NULL) { /* no buffering */
         return write(oxfp->fd, buffer, sz);          return WRITE(oxfp->fd, buffer, sz);
     }      }
     if ((oxfp->wbuf_count + sz) >= oxfp->wbuf_size) {      if ((oxfp->wbuf_count + sz) >= oxfp->wbuf_size) {
         oxf_flush(oxfp);          oxf_flush(oxfp);
         return write(oxfp->fd, buffer, sz);          return WRITE(oxfp->fd, buffer, sz);
     }      }
     memcpy(oxfp->wbuf + oxfp->wbuf_count, buffer, sz);      memcpy(oxfp->wbuf + oxfp->wbuf_count, buffer, sz);
     oxfp->wbuf_count += sz;      oxfp->wbuf_count += sz;
     return sz;      return sz;
 }  }
   
   /* sending an object of int64 type with Network Byte Order. */
   static int send_int64_nbo_le(OXFILE *oxfp, double int64)
   {
       int64 = htonll_le(int64);
       return oxf_write(&int64, sizeof(double), 1, oxfp);
   }
   
   /* sending an object of int64 type with Local Byte Order. */
   static int send_int64_lbo(OXFILE *oxfp, double int64)
   {
       return oxf_write(&int64, sizeof(double), 1, oxfp);
   }
   
   /* receiving an object of int64 type with Network Byte Order. */
   static double receive_int64_nbo_le(OXFILE *oxfp)
   {
       double tag;
       oxf_read(&tag, sizeof(double), 1, oxfp);
       return htonll_le(tag);
   }
   
   /* receiving an object of int64 type with Local Byte Order. */
   static double receive_int64_lbo(OXFILE *oxfp)
   {
       double tag;
       oxf_read(&tag, sizeof(double), 1, oxfp);
       return tag;
   }
   
 /* sending an object of int32 type with Network Byte Order.  /* sending an object of int32 type with Network Byte Order.
    (not equal to cmo_int32 type)  */     (not equal to cmo_int32 type)  */
 static int send_int32_nbo(OXFILE *oxfp, int int32)  static int send_int32_nbo(OXFILE *oxfp, int int32)
Line 122  OXFILE *oxf_open(int fd)
Line 245  OXFILE *oxf_open(int fd)
     oxfp->wbuf = NULL;      oxfp->wbuf = NULL;
     oxfp->wbuf_size = 0;      oxfp->wbuf_size = 0;
     oxfp->wbuf_count = 0;      oxfp->wbuf_count = 0;
       oxfp->send_double    = send_int64_lbo;
       oxfp->receive_double = receive_int64_lbo;
     return oxfp;      return oxfp;
     /* oxfp->fp = fdopen(fd, "a+"); */      /* oxfp->fp = fdopen(fd, "a+"); */
     /* return (oxfp->fp != NULL)? oxfp: NULL; */      /* return (oxfp->fp != NULL)? oxfp: NULL; */
Line 170  void oxf_determine_byteorder_server(OXFILE *oxfp)
Line 295  void oxf_determine_byteorder_server(OXFILE *oxfp)
 void oxf_flush(OXFILE *oxfp)  void oxf_flush(OXFILE *oxfp)
 {  {
     if (oxfp->wbuf != NULL) {      if (oxfp->wbuf != NULL) {
         write(oxfp->fd, oxfp->wbuf, oxfp->wbuf_count);          WRITE(oxfp->fd, oxfp->wbuf, oxfp->wbuf_count);
         oxfp->wbuf_count = 0;          oxfp->wbuf_count = 0;
     }      }
 }  }
Line 186  void oxf_close(OXFILE *oxfp)
Line 311  void oxf_close(OXFILE *oxfp)
   
 void oxf_setopt(OXFILE *oxfp, int mode)  void oxf_setopt(OXFILE *oxfp, int mode)
 {  {
     if (mode == OXF_SETOPT_LBO) {      int m = 1;
         oxfp->send_int32    = send_int32_lbo;      if (mode == OXF_SETOPT_NBO && *(char *)&m) {
         oxfp->receive_int32 = receive_int32_lbo;                  /* Little endian architecture. */
     }else if (mode == OXF_SETOPT_NBO) {                  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->send_double    = send_int64_nbo_le;
                   oxfp->receive_double = receive_int64_nbo_le;
           }else {
                   oxfp->send_int32     = send_int32_lbo;
                   oxfp->receive_int32  = receive_int32_lbo;
                   oxfp->send_double    = send_int64_lbo;
                   oxfp->receive_double = receive_int64_lbo;
     }      }
 }  }
   
 int oxf_listen(short *portp)  int oxf_listen(int *portp)
 {  {
     char localhost[MAXHOSTNAMELEN];      char localhost[MAXHOSTNAMELEN];
     if (gethostname(localhost, MAXHOSTNAMELEN)==0) {      if (gethostname(localhost, MAXHOSTNAMELEN)==0) {
Line 289  char *which(char *exe, const char *env)
Line 420  char *which(char *exe, const char *env)
     return NULL;      return NULL;
 }  }
   
   #if !defined(_MSC_VER)
 /* Remarks: ssh determines remote host by his name, i.e. by arg[0]. */  /* Remarks: ssh determines remote host by his name, i.e. by arg[0]. */
 int oxc_start(char *remote_host, short port, char *passwd)  int oxc_start(char *remote_host, int port, char *passwd)
 {  {
     char localhost[MAXHOSTNAMELEN];      char localhost[MAXHOSTNAMELEN];
     char ports[128];      char ports[128];
Line 312  int oxc_start(char *remote_host, short port, char *pas
Line 444  int oxc_start(char *remote_host, short port, char *pas
 int oxc_start_with_pipe(char *remote_host, int port, char *passwd)  int oxc_start_with_pipe(char *remote_host, int port, char *passwd)
 {  {
     char localhost[MAXHOSTNAMELEN];      char localhost[MAXHOSTNAMELEN];
     char ports[128];  
     int  pid = 0;      int  pid = 0;
     char *cmd = "oxc";      char *cmd = "oxc";
         int  pipefd[2];          int  pipefd[2];
Line 333  int oxc_start_with_pipe(char *remote_host, int port, c
Line 464  int oxc_start_with_pipe(char *remote_host, int port, c
     }      }
     return pid;      return pid;
 }  }
   #endif
   
 static void pipe_send_string(int fd, char *s)  static void pipe_send_string(int fd, char *s)
 {  {
Line 362  void pipe_send_info(int fd, char *hostname, int port, 
Line 494  void pipe_send_info(int fd, char *hostname, int port, 
         pipe_send_string(fd, password);          pipe_send_string(fd, password);
 }  }
   
 void pipe_read_info(char **hostname, int *port, char **password)  int pipe_read_info(char **hostname, int *port, char **password)
 {  {
         if (read(0, port, sizeof(int)) > 0) {          if (read(0, port, sizeof(int)) > 0) {
                 *port = ntohl(*port);                  *port = ntohl(*port);
Line 376  void pipe_read_info(char **hostname, int *port, char *
Line 508  void pipe_read_info(char **hostname, int *port, char *
 /*  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)
 {  {
     short port = 0;      int port = 0;
     int listened;      int listened;
   
     if ((listened = oxf_listen(&port)) != -1) {      if ((listened = oxf_listen(&port)) != -1) {
                 cmo_list *args =  list_appendl(NULL, list_append(new_cmo_list(), new_cmo_int32(port)), new_cmo_string(cmd), NULL);                  cmo_list *args =  list_appendl(NULL, list_append(new_cmo_list(), (cmo *)new_cmo_int32(port)), new_cmo_string(cmd), NULL);
                 send_ox_cmo(oxfp, (cmo *)args);                  send_ox_cmo(oxfp, (cmo *)args);
         send_ox_command(oxfp, SM_control_spawn_server);          send_ox_command(oxfp, SM_control_spawn_server);
         return oxf_connect_passive(listened);          return oxf_connect_passive(listened);

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

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