=================================================================== RCS file: /home/cvs/OpenXM/src/ox_toolkit/oxf.c,v retrieving revision 1.10 retrieving revision 1.25 diff -u -p -r1.10 -r1.25 --- OpenXM/src/ox_toolkit/oxf.c 2000/12/14 01:41:03 1.10 +++ OpenXM/src/ox_toolkit/oxf.c 2016/07/14 08:16:19 1.25 @@ -1,20 +1,57 @@ /* -*- mode: C; coding: euc-japan -*- */ -/* $OpenXM: OpenXM/src/ox_toolkit/oxf.c,v 1.9 2000/12/03 16:15:03 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. - Some commnets are written in Japanese by the EUC-JP coded - character set. */ +#if defined(_MSC_VER) +#define _CRT_RAND_S +#endif + #include #include #include -#include #include +#include +#include + +#if defined(__sun__) || defined(__FreeBSD__) +#include +#include +#include +#elif defined(__linux__) +#include +#endif + +#if defined(__sun__) +#include +#else +#include +#endif + +#if defined(_MSC_VER) +#include +#include +#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 #include #include -#include +#define READ(fd,buf,n) (read((fd),(buf),(n))) +#define WRITE(fd,buf,n) (write((fd),(buf),(n))) +#endif #include "mysocket.h" #include "ox_toolkit.h" @@ -26,20 +63,136 @@ 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; i 0) { + buf = MALLOC(size); + } + if (oxfp->wbuf != NULL) { + oxf_flush(oxfp); + } + oxfp->wbuf = buf; + oxfp->wbuf_size = size; + 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 n = read(oxfp->fd, buffer, size*num); + int n = READ(oxfp->fd, buffer, size*num); if (n <= 0) { +#if 0 oxfp->error = 1; +#else + exit(0); +#endif } return n; } int oxf_write(void *buffer, size_t size, size_t num, OXFILE *oxfp) { - return write(oxfp->fd, buffer, size*num); + size_t sz = size*num; + if (oxfp->wbuf == NULL) { /* no buffering */ + return WRITE(oxfp->fd, buffer, sz); + } + if ((oxfp->wbuf_count + sz) >= oxfp->wbuf_size) { + oxf_flush(oxfp); + return WRITE(oxfp->fd, buffer, sz); + } + memcpy(oxfp->wbuf + oxfp->wbuf_count, buffer, sz); + oxfp->wbuf_count += 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. (not equal to cmo_int32 type) */ static int send_int32_nbo(OXFILE *oxfp, int int32) @@ -80,7 +233,8 @@ static int receive_int32_lbo(OXFILE *oxfp) */ 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->send_int32 = send_int32_nbo; oxfp->receive_int32 = receive_int32_nbo; @@ -88,6 +242,11 @@ OXFILE *oxf_open(int fd) oxfp->control = NULL; oxfp->error = 0; oxfp->mathcap = NULL; + 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; */ @@ -135,13 +294,16 @@ void oxf_determine_byteorder_server(OXFILE *oxfp) void oxf_flush(OXFILE *oxfp) { - /* fflush(oxfp->fp); */ + if (oxfp->wbuf != NULL) { + WRITE(oxfp->fd, oxfp->wbuf, oxfp->wbuf_count); + oxfp->wbuf_count = 0; + } } void oxf_close(OXFILE *oxfp) { + oxf_flush(oxfp); close(oxfp->fd); - /* fclose(oxfp->fp); */ } #define OXF_SETOPT_NBO 0 @@ -149,16 +311,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) { @@ -170,13 +338,13 @@ int oxf_listen(short *portp) OXFILE *oxf_connect_active(char *hostname, short port) { int fd = mysocketOpen(hostname, port); - return oxf_open(fd); + return (fd < 0)? NULL: oxf_open(fd); } OXFILE *oxf_connect_passive(int listened) { int fd = mysocketAccept(listened); - return oxf_open(fd); + return (fd < 0)? NULL: oxf_open(fd); } #define LENGTH_OF_ONETIME_PASSWORD 64 @@ -201,7 +369,7 @@ char *generate_otp() int oxf_confirm_client(OXFILE *oxfp, char *passwd) { int len = strlen(passwd)+1; - char *buf = alloca(len); + char *buf = ALLOCA(len); oxf_read(buf, 1, len, oxfp); return !strcmp(passwd, buf); @@ -237,23 +405,24 @@ char *which(char *exe, const char *env) char *tok; char *path; char delim[] = ":"; - char *e = alloca(strlen(env)+1); + char *e = ALLOCA(strlen(env)+1); strcpy(e, env); tok = strtok(e, delim); while (tok != NULL) { - path = malloc(strlen(tok)+strlen(exe)+2); + path = MALLOC(strlen(tok)+strlen(exe)+2); sprintf(path, "%s/%s", tok, exe); if (access(path, X_OK&R_OK) == 0) { return path; } - free(path); + FREE(path); tok = strtok(NULL, delim); } return NULL; } +#if !defined(_MSC_VER) /* 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]; @@ -263,9 +432,7 @@ int oxc_start(char *remote_host, short port, char *pas if (gethostname(localhost, MAXHOSTNAMELEN)==0) { if ((pid = fork()) == 0) { sprintf(ports, "%d", port); -#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); -#endif + ox_printf("oxf.c:: oxc_start() does %s(ssh) -f %s -h %s -p %s -c %s\n", remote_host, cmd, localhost, ports, passwd); execlp("ssh", remote_host, "-f", cmd, "-h", localhost, "-p", ports,"-c", passwd, NULL); } @@ -277,7 +444,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]; @@ -298,6 +464,7 @@ int oxc_start_with_pipe(char *remote_host, int port, c } return pid; } +#endif static void pipe_send_string(int fd, char *s) { @@ -313,7 +480,7 @@ static char *pipe_read_string() char *s; read(0, &len, sizeof(int)); len = ntohl(len)+1; - s = malloc(len); + s = MALLOC(len); read(0, s, len); return s; } @@ -327,7 +494,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); @@ -341,11 +508,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);