=================================================================== RCS file: /home/cvs/OpenXM/src/ox_toolkit/oxf.c,v retrieving revision 1.17 retrieving revision 1.22 diff -u -p -r1.17 -r1.22 --- OpenXM/src/ox_toolkit/oxf.c 2003/06/02 10:25:57 1.17 +++ OpenXM/src/ox_toolkit/oxf.c 2015/08/21 00:53:53 1.22 @@ -1,5 +1,5 @@ /* -*- 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.21 2015/08/05 00:59:05 noro Exp $ */ /* This module includes functions for sending/receiveng CMO's. @@ -15,6 +15,7 @@ #include #include #include +#include #if defined(__sun__) #include @@ -22,6 +23,12 @@ #include #endif +#if defined(__sun__) +#include +#else +#include +#endif + #include "mysocket.h" #include "ox_toolkit.h" @@ -32,6 +39,25 @@ static int send_int32_nbo(OXFILE *oxfp, int int32); static int receive_int32_lbo(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; iwbuf = buf; oxfp->wbuf_size = size; oxfp->wbuf_count = 0; + return 0; } int oxf_read(void *buffer, size_t size, size_t num, OXFILE *oxfp) { int n = read(oxfp->fd, buffer, size*num); if (n <= 0) { +#if 0 oxfp->error = 1; +#else + exit(0); +#endif } return n; } @@ -70,6 +101,35 @@ int oxf_write(void *buffer, size_t size, size_t num, O 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. (not equal to cmo_int32 type) */ static int send_int32_nbo(OXFILE *oxfp, int int32) @@ -122,6 +182,8 @@ OXFILE *oxf_open(int fd) oxfp->wbuf = NULL; oxfp->wbuf_size = 0; oxfp->wbuf_count = 0; + oxfp->send_double = send_int64_lbo; + oxfp->receive_double = receive_int64_lbo; return oxfp; /* oxfp->fp = fdopen(fd, "a+"); */ /* return (oxfp->fp != NULL)? oxfp: NULL; */ @@ -186,16 +248,22 @@ void oxf_close(OXFILE *oxfp) void oxf_setopt(OXFILE *oxfp, int mode) { - if (mode == OXF_SETOPT_LBO) { - oxfp->send_int32 = send_int32_lbo; - oxfp->receive_int32 = receive_int32_lbo; - }else if (mode == OXF_SETOPT_NBO) { - oxfp->send_int32 = send_int32_nbo; - oxfp->receive_int32 = receive_int32_nbo; + int m = 1; + if (mode == OXF_SETOPT_NBO && *(char *)&m) { + /* Little endian architecture. */ + oxfp->send_int32 = send_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]; if (gethostname(localhost, MAXHOSTNAMELEN)==0) { @@ -290,7 +358,7 @@ char *which(char *exe, const char *env) } /* 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 ports[128]; @@ -312,7 +380,6 @@ int oxc_start(char *remote_host, short port, char *pas 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]; @@ -362,7 +429,7 @@ void pipe_send_info(int fd, char *hostname, int port, 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) { *port = ntohl(*port); @@ -376,11 +443,11 @@ void pipe_read_info(char **hostname, int *port, char * /* Example: oxf_execute_cmd(oxfp, "ox_sm1"); */ OXFILE *oxf_execute_cmd(OXFILE *oxfp, char *cmd) { - short port = 0; + int port = 0; int listened; 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_command(oxfp, SM_control_spawn_server); return oxf_connect_passive(listened);