version 1.3, 2000/10/11 08:22:58 |
version 1.4, 2000/10/12 15:53:25 |
|
|
/* -*- mode: C; coding: euc-japan -*- */ |
/* -*- 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.3 2000/10/11 08:22:58 ohara Exp $ */ |
|
|
/* |
/* |
This module includes functions for sending/receiveng CMO's. |
This module includes functions for sending/receiveng CMO's. |
|
|
#include "mysocket.h" |
#include "mysocket.h" |
#include "ox_toolkit.h" |
#include "ox_toolkit.h" |
|
|
|
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 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); |
Line 33 int oxf_write(void *buffer, size_t size, size_t num, O |
|
Line 38 int oxf_write(void *buffer, size_t size, size_t num, O |
|
return write(oxfp->fd, buffer, size*num); |
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 *oxf_open(int fd) |
{ |
{ |
OXFILE *oxfp = (OXFILE *)malloc(sizeof(OXFILE)); |
OXFILE *oxfp = (OXFILE *)malloc(sizeof(OXFILE)); |
Line 107 void oxf_setopt(OXFILE *oxfp, int mode) |
|
Line 150 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) |
OXFILE *oxf_connect_active(char *hostname, short port) |
{ |
{ |
int fd = mysocketOpen(hostname, port); |
int fd = mysocketOpen(hostname, port); |
Line 192 int oxc_start(char *remote_host, short port, char *pas |
|
Line 244 int oxc_start(char *remote_host, short port, char *pas |
|
} |
} |
} |
} |
return pid; |
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; |
} |
} |