| version 1.5, 2000/11/24 05:49:27 |
version 1.8, 2000/12/01 07:27:03 |
|
|
| /* -*- mode: C; coding: euc-japan -*- */ |
/* -*- mode: C; coding: euc-japan -*- */ |
| /* $OpenXM: OpenXM/src/ox_toolkit/oxf.c,v 1.4 2000/10/12 15:53:25 ohara Exp $ */ |
/* $OpenXM: OpenXM/src/ox_toolkit/oxf.c,v 1.7 2000/11/28 22:11:14 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 mathcap *oxf_mathcap(OXFILE *oxfp); |
| |
|
| static int send_int32_lbo(OXFILE *oxfp, int int32); |
static int send_int32_lbo(OXFILE *oxfp, int int32); |
| static int send_int32_nbo(OXFILE *oxfp, int int32); |
static int send_int32_nbo(OXFILE *oxfp, int int32); |
| static int receive_int32_lbo(OXFILE *oxfp); |
static int receive_int32_lbo(OXFILE *oxfp); |
| Line 82 OXFILE *oxf_open(int fd) |
|
| Line 84 OXFILE *oxf_open(int fd) |
|
| oxfp->fd = fd; |
oxfp->fd = fd; |
| oxfp->send_int32 = send_int32_nbo; |
oxfp->send_int32 = send_int32_nbo; |
| oxfp->receive_int32 = receive_int32_nbo; |
oxfp->receive_int32 = receive_int32_nbo; |
| |
oxfp->serial_number = 0; |
| oxfp->control = NULL; |
oxfp->control = NULL; |
| oxfp->error = 0; |
oxfp->error = 0; |
| oxfp->mathcap = NULL; |
oxfp->mathcap = NULL; |
| Line 90 OXFILE *oxf_open(int fd) |
|
| Line 93 OXFILE *oxf_open(int fd) |
|
| /* return (oxfp->fp != NULL)? oxfp: NULL; */ |
/* return (oxfp->fp != NULL)? oxfp: NULL; */ |
| } |
} |
| |
|
| |
int oxf_fileno(OXFILE *oxfp) |
| |
{ |
| |
return oxfp->fd; |
| |
} |
| |
|
| OXFILE *oxf_control(OXFILE *oxfp) |
OXFILE *oxf_control(OXFILE *oxfp) |
| { |
{ |
| return oxfp->control; |
return oxfp->control; |
| Line 205 int oxf_confirm_server(OXFILE *oxfp, char *passwd) |
|
| Line 213 int oxf_confirm_server(OXFILE *oxfp, char *passwd) |
|
| return oxf_write(passwd, 1, strlen(passwd)+1, oxfp); |
return oxf_write(passwd, 1, strlen(passwd)+1, oxfp); |
| } |
} |
| |
|
| void oxf_mathcap_update(OXFILE *oxfp, cmo_mathcap *ob) |
__inline__ |
| |
static mathcap *oxf_mathcap(OXFILE *oxfp) |
| { |
{ |
| if (oxfp->mathcap == NULL) { |
if (oxfp->mathcap == NULL) { |
| oxfp->mathcap = new_mathcap(); |
oxfp->mathcap = new_mathcap(); |
| } |
} |
| mathcap_update(oxfp->mathcap, ob); |
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")); */ |
/* example: which("xterm", getenv("PATH")); */ |
| char *which(char *exe, const char *env) |
char *which(char *exe, const char *env) |
| { |
{ |
| Line 253 int oxc_start(char *remote_host, short port, char *pas |
|
| Line 272 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; |
| |
} |
| |
|
| |
/* pipe_*_info で送る情報の形式の定義 */ |
| |
/* Integer port : 4byte, ポート番号, Network byte order |
| |
String hostname: ホスト名 |
| |
String password: パスワード |
| |
|
| |
String は C のストリングではなくて、cmo_string のような、長さ付きの |
| |
ストリングである。ただし、\0 文字を含む。 |
| |
すなわち、"Hello" は (int32)6 H e l l o \0 に展開される(合計10byte)。 |
| |
*/ |
| |
|
| |
static void pipe_send_string(int fd, char *s) |
| |
{ |
| |
int len = strlen(s)+1; |
| |
int lenN = htonl(len); |
| |
write(fd, &lenN, sizeof(int)); |
| |
write(fd, s, len); |
| |
} |
| |
|
| |
static char *pipe_read_string() |
| |
{ |
| |
int len; |
| |
char *s; |
| |
read(0, &len, sizeof(int)); |
| |
len = ntohl(len); |
| |
s = malloc(len); |
| |
read(0, s, len); |
| |
return s; |
| |
} |
| |
|
| |
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"); */ |