=================================================================== RCS file: /home/cvs/OpenXM/src/ox_toolkit/oxf.c,v retrieving revision 1.10 retrieving revision 1.17 diff -u -p -r1.10 -r1.17 --- OpenXM/src/ox_toolkit/oxf.c 2000/12/14 01:41:03 1.10 +++ OpenXM/src/ox_toolkit/oxf.c 2003/06/02 10:25:57 1.17 @@ -1,5 +1,5 @@ /* -*- 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.16 2003/05/29 15:50:49 ohara Exp $ */ /* This module includes functions for sending/receiveng CMO's. @@ -16,6 +16,12 @@ #include #include +#if defined(__sun__) +#include +#include +#include +#endif + #include "mysocket.h" #include "ox_toolkit.h" @@ -26,6 +32,20 @@ static int send_int32_nbo(OXFILE *oxfp, int int32); static int receive_int32_lbo(OXFILE *oxfp); static int receive_int32_nbo(OXFILE *oxfp); +/* enable write buffering */ +int oxf_setbuffer(OXFILE *oxfp, char *buf, int size) +{ + if (buf == NULL && size > 0) { + buf = MALLOC(size); + } + if (oxfp->wbuf != NULL) { + oxf_flush(oxfp); + } + oxfp->wbuf = buf; + oxfp->wbuf_size = size; + oxfp->wbuf_count = 0; +} + int oxf_read(void *buffer, size_t size, size_t num, OXFILE *oxfp) { int n = read(oxfp->fd, buffer, size*num); @@ -37,7 +57,17 @@ int oxf_read(void *buffer, size_t size, size_t num, OX 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 int32 type with Network Byte Order. @@ -80,7 +110,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 +119,9 @@ 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; return oxfp; /* oxfp->fp = fdopen(fd, "a+"); */ /* return (oxfp->fp != NULL)? oxfp: NULL; */ @@ -135,13 +169,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 @@ -170,13 +207,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 +238,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,16 +274,16 @@ 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; @@ -263,9 +300,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); } @@ -313,7 +348,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; }