=================================================================== RCS file: /home/cvs/OpenXM/src/ox_toolkit/oxf.c,v retrieving revision 1.3 retrieving revision 1.6 diff -u -p -r1.3 -r1.6 --- OpenXM/src/ox_toolkit/oxf.c 2000/10/11 08:22:58 1.3 +++ OpenXM/src/ox_toolkit/oxf.c 2000/11/28 04:24:12 1.6 @@ -1,5 +1,5 @@ /* -*- mode: C; coding: euc-japan -*- */ -/* $OpenXM: OpenXM/src/ox_toolkit/oxf.c,v 1.2 2000/10/11 06:56:03 ohara Exp $ */ +/* $OpenXM: OpenXM/src/ox_toolkit/oxf.c,v 1.5 2000/11/24 05:49:27 ohara Exp $ */ /* This module includes functions for sending/receiveng CMO's. @@ -19,12 +19,19 @@ #include "mysocket.h" #include "ox_toolkit.h" +static mathcap *oxf_mathcap(OXFILE *oxfp); + +static int send_int32_lbo(OXFILE *oxfp, int int32); +static int send_int32_nbo(OXFILE *oxfp, int int32); +static int receive_int32_lbo(OXFILE *oxfp); +static int receive_int32_nbo(OXFILE *oxfp); + int oxf_read(void *buffer, size_t size, size_t num, OXFILE *oxfp) { - int n = read(oxfp->fd, buffer, size*num); - if (n <= 0) { - oxfp->error = 1; - } + int n = read(oxfp->fd, buffer, size*num); + if (n <= 0) { + oxfp->error = 1; + } return n; } @@ -33,14 +40,53 @@ int oxf_write(void *buffer, size_t size, size_t num, O return write(oxfp->fd, buffer, size*num); } +/* 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) +{ + int32 = htonl(int32); + return oxf_write(&int32, sizeof(int), 1, oxfp); +} + +/* sending an object of int32 type with Local Byte Order. + (not equal to cmo_int32 type) */ +static int send_int32_lbo(OXFILE *oxfp, int int32) +{ + return oxf_write(&int32, sizeof(int), 1, oxfp); +} + +/* receiving an object of int32 type with Network Byte Order. + (not equal to cmo_int32 type) */ +static int receive_int32_nbo(OXFILE *oxfp) +{ + int tag; + oxf_read(&tag, sizeof(int), 1, oxfp); + return ntohl(tag); +} + +/* receiving an object of int32 type with Local Byte Order. + (not equal to cmo_int32 type) */ +static int receive_int32_lbo(OXFILE *oxfp) +{ + int tag; + oxf_read(&tag, sizeof(int), 1, oxfp); + return tag; +} + +/* socket システムコールなどで socket を開いたのち、 + fdopen(sd, "a+") でバッファリングする(予定)。("w+" ではない) + バッファリングの後、バイトオーダを決定し、 + oxf_setopt() で関数ポインタを設定し直す。*/ + OXFILE *oxf_open(int fd) { OXFILE *oxfp = (OXFILE *)malloc(sizeof(OXFILE)); oxfp->fd = fd; oxfp->send_int32 = send_int32_nbo; oxfp->receive_int32 = receive_int32_nbo; - oxfp->control = NULL; - oxfp->error = 0; + oxfp->control = NULL; + oxfp->error = 0; + oxfp->mathcap = NULL; return oxfp; /* oxfp->fp = fdopen(fd, "a+"); */ /* return (oxfp->fp != NULL)? oxfp: NULL; */ @@ -48,7 +94,7 @@ OXFILE *oxf_open(int fd) OXFILE *oxf_control(OXFILE *oxfp) { - return oxfp->control; + return oxfp->control; } /* The function determines a byte order of integer on the OpenXM @@ -107,6 +153,15 @@ void oxf_setopt(OXFILE *oxfp, int mode) } } +int oxf_listen(short *portp) +{ + char localhost[MAXHOSTNAMELEN]; + if (gethostname(localhost, MAXHOSTNAMELEN)==0) { + return mysocketListen(localhost, portp); + } + return -1; +} + OXFILE *oxf_connect_active(char *hostname, short port) { int fd = mysocketOpen(hostname, port); @@ -124,7 +179,7 @@ OXFILE *oxf_connect_passive(int listened) /* a password generator. */ char *generate_otp() { - static char crypto[] = "%.,^_+-=/@0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + static char crypto[] = "%.,^_+-=/@0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; static char otp[LENGTH_OF_ONETIME_PASSWORD+1] = {0}; int i; @@ -152,6 +207,25 @@ int oxf_confirm_server(OXFILE *oxfp, char *passwd) return oxf_write(passwd, 1, strlen(passwd)+1, oxfp); } +__inline__ +static mathcap *oxf_mathcap(OXFILE *oxfp) +{ + if (oxfp->mathcap == NULL) { + oxfp->mathcap = new_mathcap(); + } + return oxfp->mathcap; +} + +cmo_mathcap *oxf_cmo_mathcap(OXFILE *oxfp) +{ + return mathcap_get(oxf_mathcap(oxfp)); +} + +void oxf_mathcap_update(OXFILE *oxfp, cmo_mathcap *ob) +{ + mathcap_update(oxf_mathcap(oxfp), ob); +} + /* example: which("xterm", getenv("PATH")); */ char *which(char *exe, const char *env) { @@ -192,4 +266,21 @@ int oxc_start(char *remote_host, short port, char *pas } } return pid; +} + +/* Example: oxf_execute_cmd(oxfp, "ox_sm1"); */ +OXFILE *oxf_execute_cmd(OXFILE *oxfp, char *cmd) +{ + short port = 0; + int listened; + + if ((listened = oxf_listen(&port)) != -1) { + send_ox_cmo(oxfp, (cmo *)new_cmo_int32(port)); + send_ox_cmo(oxfp, (cmo *)new_cmo_string(cmd)); + send_ox_cmo(oxfp, (cmo *)new_cmo_int32(2)); /* number of arguments */ + send_ox_cmo(oxfp, (cmo *)new_cmo_string("oxc_open")); + send_ox_command(oxfp, SM_executeFunction); + return oxf_connect_passive(listened); + } + return NULL; }