| version 1.16, 2003/05/29 15:50:49 |
version 1.18, 2003/09/15 09:31:42 |
|
|
| /* -*- mode: C; coding: euc-japan -*- */ |
/* -*- mode: C; coding: euc-japan -*- */ |
| /* $OpenXM: OpenXM/src/ox_toolkit/oxf.c,v 1.15 2003/03/23 20:17:35 ohara Exp $ */ |
/* $OpenXM: OpenXM/src/ox_toolkit/oxf.c,v 1.17 2003/06/02 10:25:57 ohara Exp $ */ |
| |
|
| /* |
/* |
| This module includes functions for sending/receiveng CMO's. |
This module includes functions for sending/receiveng CMO's. |
| Line 32 static int send_int32_nbo(OXFILE *oxfp, int int32); |
|
| Line 32 static int send_int32_nbo(OXFILE *oxfp, int int32); |
|
| static int receive_int32_lbo(OXFILE *oxfp); |
static int receive_int32_lbo(OXFILE *oxfp); |
| static int receive_int32_nbo(OXFILE *oxfp); |
static int receive_int32_nbo(OXFILE *oxfp); |
| |
|
| |
static void pipe_send_info(int fd, char *hostname, int port, char *password); |
| |
|
| /* enable write buffering */ |
/* enable write buffering */ |
| int oxf_setbuffer(OXFILE *oxfp, char *buf, int size) |
int oxf_setbuffer(OXFILE *oxfp, char *buf, int size) |
| { |
{ |
| if (buf == NULL && size > 0) { |
if (buf == NULL && size > 0) { |
| buf = malloc(size); |
buf = MALLOC(size); |
| } |
} |
| if (oxfp->wbuf != NULL) { |
if (oxfp->wbuf != NULL) { |
| oxf_flush(oxfp); |
oxf_flush(oxfp); |
| Line 44 int oxf_setbuffer(OXFILE *oxfp, char *buf, int size) |
|
| Line 46 int oxf_setbuffer(OXFILE *oxfp, char *buf, int size) |
|
| oxfp->wbuf = buf; |
oxfp->wbuf = buf; |
| oxfp->wbuf_size = size; |
oxfp->wbuf_size = size; |
| oxfp->wbuf_count = 0; |
oxfp->wbuf_count = 0; |
| |
return 0; |
| } |
} |
| |
|
| 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) |
| Line 110 static int receive_int32_lbo(OXFILE *oxfp) |
|
| Line 113 static int receive_int32_lbo(OXFILE *oxfp) |
|
| */ |
*/ |
| OXFILE *oxf_open(int fd) |
OXFILE *oxf_open(int fd) |
| { |
{ |
| OXFILE *oxfp = (OXFILE *)malloc(sizeof(OXFILE)); |
OXFILE *oxfp = (OXFILE *)MALLOC(sizeof(OXFILE)); |
| oxfp = (OXFILE *)malloc(sizeof(OXFILE)); |
oxfp = (OXFILE *)MALLOC(sizeof(OXFILE)); |
| 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; |
| Line 195 void oxf_setopt(OXFILE *oxfp, int mode) |
|
| Line 198 void oxf_setopt(OXFILE *oxfp, int mode) |
|
| } |
} |
| } |
} |
| |
|
| int oxf_listen(short *portp) |
int oxf_listen(int *portp) |
| { |
{ |
| char localhost[MAXHOSTNAMELEN]; |
char localhost[MAXHOSTNAMELEN]; |
| if (gethostname(localhost, MAXHOSTNAMELEN)==0) { |
if (gethostname(localhost, MAXHOSTNAMELEN)==0) { |
| Line 238 char *generate_otp() |
|
| Line 241 char *generate_otp() |
|
| int oxf_confirm_client(OXFILE *oxfp, char *passwd) |
int oxf_confirm_client(OXFILE *oxfp, char *passwd) |
| { |
{ |
| int len = strlen(passwd)+1; |
int len = strlen(passwd)+1; |
| char *buf = alloca(len); |
char *buf = ALLOCA(len); |
| |
|
| oxf_read(buf, 1, len, oxfp); |
oxf_read(buf, 1, len, oxfp); |
| return !strcmp(passwd, buf); |
return !strcmp(passwd, buf); |
| Line 274 char *which(char *exe, const char *env) |
|
| Line 277 char *which(char *exe, const char *env) |
|
| char *tok; |
char *tok; |
| char *path; |
char *path; |
| char delim[] = ":"; |
char delim[] = ":"; |
| char *e = alloca(strlen(env)+1); |
char *e = ALLOCA(strlen(env)+1); |
| strcpy(e, env); |
strcpy(e, env); |
| tok = strtok(e, delim); |
tok = strtok(e, delim); |
| while (tok != NULL) { |
while (tok != NULL) { |
| path = malloc(strlen(tok)+strlen(exe)+2); |
path = MALLOC(strlen(tok)+strlen(exe)+2); |
| sprintf(path, "%s/%s", tok, exe); |
sprintf(path, "%s/%s", tok, exe); |
| if (access(path, X_OK&R_OK) == 0) { |
if (access(path, X_OK&R_OK) == 0) { |
| return path; |
return path; |
| } |
} |
| free(path); |
FREE(path); |
| tok = strtok(NULL, delim); |
tok = strtok(NULL, delim); |
| } |
} |
| return NULL; |
return NULL; |
| } |
} |
| |
|
| /* Remarks: ssh determines remote host by his name, i.e. by arg[0]. */ |
/* Remarks: ssh determines remote host by his name, i.e. by arg[0]. */ |
| int oxc_start(char *remote_host, short port, char *passwd) |
int oxc_start(char *remote_host, int port, char *passwd) |
| { |
{ |
| char localhost[MAXHOSTNAMELEN]; |
char localhost[MAXHOSTNAMELEN]; |
| char ports[128]; |
char ports[128]; |
| Line 312 int oxc_start(char *remote_host, short port, char *pas |
|
| Line 315 int oxc_start(char *remote_host, short port, char *pas |
|
| int oxc_start_with_pipe(char *remote_host, int port, char *passwd) |
int oxc_start_with_pipe(char *remote_host, int port, char *passwd) |
| { |
{ |
| char localhost[MAXHOSTNAMELEN]; |
char localhost[MAXHOSTNAMELEN]; |
| char ports[128]; |
|
| int pid = 0; |
int pid = 0; |
| char *cmd = "oxc"; |
char *cmd = "oxc"; |
| int pipefd[2]; |
int pipefd[2]; |
| Line 348 static char *pipe_read_string() |
|
| Line 350 static char *pipe_read_string() |
|
| char *s; |
char *s; |
| read(0, &len, sizeof(int)); |
read(0, &len, sizeof(int)); |
| len = ntohl(len)+1; |
len = ntohl(len)+1; |
| s = malloc(len); |
s = MALLOC(len); |
| read(0, s, len); |
read(0, s, len); |
| return s; |
return s; |
| } |
} |
| Line 362 void pipe_send_info(int fd, char *hostname, int port, |
|
| Line 364 void pipe_send_info(int fd, char *hostname, int port, |
|
| pipe_send_string(fd, password); |
pipe_send_string(fd, password); |
| } |
} |
| |
|
| void pipe_read_info(char **hostname, int *port, char **password) |
int pipe_read_info(char **hostname, int *port, char **password) |
| { |
{ |
| if (read(0, port, sizeof(int)) > 0) { |
if (read(0, port, sizeof(int)) > 0) { |
| *port = ntohl(*port); |
*port = ntohl(*port); |
| Line 376 void pipe_read_info(char **hostname, int *port, char * |
|
| Line 378 void pipe_read_info(char **hostname, int *port, char * |
|
| /* 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) |
| { |
{ |
| short port = 0; |
int port = 0; |
| int listened; |
int listened; |
| |
|
| if ((listened = oxf_listen(&port)) != -1) { |
if ((listened = oxf_listen(&port)) != -1) { |
| cmo_list *args = list_appendl(NULL, list_append(new_cmo_list(), new_cmo_int32(port)), new_cmo_string(cmd), NULL); |
cmo_list *args = list_appendl(NULL, list_append(new_cmo_list(), (cmo *)new_cmo_int32(port)), new_cmo_string(cmd), NULL); |
| send_ox_cmo(oxfp, (cmo *)args); |
send_ox_cmo(oxfp, (cmo *)args); |
| send_ox_command(oxfp, SM_control_spawn_server); |
send_ox_command(oxfp, SM_control_spawn_server); |
| return oxf_connect_passive(listened); |
return oxf_connect_passive(listened); |