version 1.7, 2000/11/28 22:11:14 |
version 1.10, 2000/12/14 01:41:03 |
|
|
/* -*- mode: C; coding: euc-japan -*- */ |
/* -*- mode: C; coding: euc-japan -*- */ |
/* $OpenXM: OpenXM/src/ox_toolkit/oxf.c,v 1.6 2000/11/28 04:24:12 ohara Exp $ */ |
/* $OpenXM: OpenXM/src/ox_toolkit/oxf.c,v 1.9 2000/12/03 16:15:03 ohara Exp $ */ |
|
|
/* |
/* |
This module includes functions for sending/receiveng CMO's. |
This module includes functions for sending/receiveng CMO's. |
Some commnets is written in Japanese by the EUC-JP coded |
Some commnets are written in Japanese by the EUC-JP coded |
character set. |
character set. |
*/ |
*/ |
|
|
Line 73 static int receive_int32_lbo(OXFILE *oxfp) |
|
Line 73 static int receive_int32_lbo(OXFILE *oxfp) |
|
return tag; |
return tag; |
} |
} |
|
|
/* socket システムコールなどで socket を開いたのち、 |
/* (1) getting the fd by socket(2). |
fdopen(sd, "a+") でバッファリングする(予定)。("w+" ではない) |
(2) preparing a buffer by fdopen(fd, "a+"). (not "w+") |
バッファリングの後、バイトオーダを決定し、 |
(3) determing the byte order of the OX connection. |
oxf_setopt() で関数ポインタを設定し直す。*/ |
(4) setting function pointers by 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 120 void oxf_determine_byteorder_client(OXFILE *oxfp) |
|
Line 120 void oxf_determine_byteorder_client(OXFILE *oxfp) |
|
oxf_setopt(oxfp, mode); |
oxf_setopt(oxfp, mode); |
} |
} |
|
|
/* Server 側ではこちらを用いる */ |
/* If the program is an OX server, then you must use this function. */ |
/* いまの実装は dup されていることが前提になっている */ |
|
void oxf_determine_byteorder_server(OXFILE *oxfp) |
void oxf_determine_byteorder_server(OXFILE *oxfp) |
{ |
{ |
int offer = OX_BYTE_LITTLE_ENDIAN; |
int offer = OX_BYTE_LITTLE_ENDIAN; |
Line 274 int oxc_start(char *remote_host, short port, char *pas |
|
Line 273 int oxc_start(char *remote_host, short port, char *pas |
|
return pid; |
return pid; |
} |
} |
|
|
|
/* Remarks: ssh determines remote host by his name, i.e. by arg[0]. */ |
|
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]; |
|
|
|
if (gethostname(localhost, MAXHOSTNAMELEN)==0) { |
|
if (pipe(pipefd) < 0) { |
|
return -1; |
|
} |
|
if ((pid = fork()) == 0) { |
|
dup2(pipefd[1], 0); |
|
close(pipefd[0]); |
|
close(pipefd[1]); |
|
execlp("ssh", remote_host, cmd, NULL); |
|
exit(1); |
|
} |
|
close(pipefd[1]); |
|
pipe_send_info(pipefd[0], localhost, port, passwd); |
|
} |
|
return pid; |
|
} |
|
|
|
static void pipe_send_string(int fd, char *s) |
|
{ |
|
int len = strlen(s); |
|
int lenN = htonl(len); |
|
write(fd, &lenN, sizeof(int)); |
|
write(fd, s, len+1); |
|
} |
|
|
|
static char *pipe_read_string() |
|
{ |
|
int len; |
|
char *s; |
|
read(0, &len, sizeof(int)); |
|
len = ntohl(len)+1; |
|
s = malloc(len); |
|
read(0, s, len); |
|
return s; |
|
} |
|
|
|
/* The data format used by pipe_send_info() is defined in OX-RFC-101. */ |
|
void pipe_send_info(int fd, char *hostname, int port, char *password) |
|
{ |
|
port = htonl(port); |
|
write(fd, &port, sizeof(int)); |
|
pipe_send_string(fd, hostname); |
|
pipe_send_string(fd, password); |
|
} |
|
|
|
void pipe_read_info(char **hostname, int *port, char **password) |
|
{ |
|
if (read(0, port, sizeof(int)) > 0) { |
|
*port = ntohl(*port); |
|
*hostname = pipe_read_string(); |
|
*password = pipe_read_string(); |
|
return 0; |
|
} |
|
return -1; |
|
} |
|
|
/* Example: oxf_execute_cmd(oxfp, "ox_sm1"); */ |
/* Example: oxf_execute_cmd(oxfp, "ox_sm1"); */ |
OXFILE *oxf_execute_cmd(OXFILE *oxfp, char *cmd) |
OXFILE *oxf_execute_cmd(OXFILE *oxfp, char *cmd) |
{ |
{ |
Line 281 OXFILE *oxf_execute_cmd(OXFILE *oxfp, char *cmd) |
|
Line 345 OXFILE *oxf_execute_cmd(OXFILE *oxfp, char *cmd) |
|
int listened; |
int listened; |
|
|
if ((listened = oxf_listen(&port)) != -1) { |
if ((listened = oxf_listen(&port)) != -1) { |
send_ox_cmo(oxfp, (cmo *)new_cmo_int32(port)); |
cmo_list *args = list_appendl(NULL, list_append(new_cmo_list(), new_cmo_int32(port)), new_cmo_string(cmd), NULL); |
send_ox_cmo(oxfp, (cmo *)new_cmo_string(cmd)); |
send_ox_cmo(oxfp, (cmo *)args); |
send_ox_cmo(oxfp, (cmo *)new_cmo_int32(2)); /* number of arguments */ |
send_ox_command(oxfp, SM_control_spawn_server); |
send_ox_cmo(oxfp, (cmo *)new_cmo_string("oxc_open")); |
|
send_ox_command(oxfp, SM_executeFunction); |
|
return oxf_connect_passive(listened); |
return oxf_connect_passive(listened); |
} |
} |
return NULL; |
return NULL; |