| version 1.10, 2000/12/14 01:41:03 |
version 1.17, 2003/06/02 10:25:57 |
|
|
| /* -*- mode: C; coding: euc-japan -*- */ |
/* -*- mode: C; coding: euc-japan -*- */ |
| /* $OpenXM: OpenXM/src/ox_toolkit/oxf.c,v 1.9 2000/12/03 16:15:03 ohara Exp $ */ |
/* $OpenXM: OpenXM/src/ox_toolkit/oxf.c,v 1.16 2003/05/29 15:50:49 ohara Exp $ */ |
| |
|
| /* |
/* |
| This module includes functions for sending/receiveng CMO's. |
This module includes functions for sending/receiveng CMO's. |
|
|
| #include <sys/param.h> |
#include <sys/param.h> |
| #include <time.h> |
#include <time.h> |
| |
|
| |
#if defined(__sun__) |
| |
#include <netdb.h> |
| |
#include <sys/types.h> |
| |
#include <netinet/in.h> |
| |
#endif |
| |
|
| #include "mysocket.h" |
#include "mysocket.h" |
| #include "ox_toolkit.h" |
#include "ox_toolkit.h" |
| |
|
| Line 26 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); |
| |
|
| |
/* enable write buffering */ |
| |
int oxf_setbuffer(OXFILE *oxfp, char *buf, int size) |
| |
{ |
| |
if (buf == NULL && size > 0) { |
| |
buf = MALLOC(size); |
| |
} |
| |
if (oxfp->wbuf != NULL) { |
| |
oxf_flush(oxfp); |
| |
} |
| |
oxfp->wbuf = buf; |
| |
oxfp->wbuf_size = size; |
| |
oxfp->wbuf_count = 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) |
| { |
{ |
| int n = read(oxfp->fd, buffer, size*num); |
int n = read(oxfp->fd, buffer, size*num); |
| Line 37 int oxf_read(void *buffer, size_t size, size_t num, OX |
|
| Line 57 int oxf_read(void *buffer, size_t size, size_t num, OX |
|
| |
|
| int oxf_write(void *buffer, size_t size, size_t num, OXFILE *oxfp) |
int oxf_write(void *buffer, size_t size, size_t num, OXFILE *oxfp) |
| { |
{ |
| return write(oxfp->fd, buffer, size*num); |
size_t sz = size*num; |
| |
if (oxfp->wbuf == NULL) { /* no buffering */ |
| |
return write(oxfp->fd, buffer, sz); |
| |
} |
| |
if ((oxfp->wbuf_count + sz) >= oxfp->wbuf_size) { |
| |
oxf_flush(oxfp); |
| |
return write(oxfp->fd, buffer, sz); |
| |
} |
| |
memcpy(oxfp->wbuf + oxfp->wbuf_count, buffer, sz); |
| |
oxfp->wbuf_count += sz; |
| |
return sz; |
| } |
} |
| |
|
| /* sending an object of int32 type with Network Byte Order. |
/* sending an object of int32 type with Network Byte Order. |
| Line 80 static int receive_int32_lbo(OXFILE *oxfp) |
|
| Line 110 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->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 88 OXFILE *oxf_open(int fd) |
|
| Line 119 OXFILE *oxf_open(int fd) |
|
| oxfp->control = NULL; |
oxfp->control = NULL; |
| oxfp->error = 0; |
oxfp->error = 0; |
| oxfp->mathcap = NULL; |
oxfp->mathcap = NULL; |
| |
oxfp->wbuf = NULL; |
| |
oxfp->wbuf_size = 0; |
| |
oxfp->wbuf_count = 0; |
| return oxfp; |
return oxfp; |
| /* oxfp->fp = fdopen(fd, "a+"); */ |
/* oxfp->fp = fdopen(fd, "a+"); */ |
| /* return (oxfp->fp != NULL)? oxfp: NULL; */ |
/* return (oxfp->fp != NULL)? oxfp: NULL; */ |
| Line 135 void oxf_determine_byteorder_server(OXFILE *oxfp) |
|
| Line 169 void oxf_determine_byteorder_server(OXFILE *oxfp) |
|
| |
|
| void oxf_flush(OXFILE *oxfp) |
void oxf_flush(OXFILE *oxfp) |
| { |
{ |
| /* fflush(oxfp->fp); */ |
if (oxfp->wbuf != NULL) { |
| |
write(oxfp->fd, oxfp->wbuf, oxfp->wbuf_count); |
| |
oxfp->wbuf_count = 0; |
| |
} |
| } |
} |
| |
|
| void oxf_close(OXFILE *oxfp) |
void oxf_close(OXFILE *oxfp) |
| { |
{ |
| |
oxf_flush(oxfp); |
| close(oxfp->fd); |
close(oxfp->fd); |
| /* fclose(oxfp->fp); */ |
|
| } |
} |
| |
|
| #define OXF_SETOPT_NBO 0 |
#define OXF_SETOPT_NBO 0 |
| Line 170 int oxf_listen(short *portp) |
|
| Line 207 int oxf_listen(short *portp) |
|
| 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); |
| return oxf_open(fd); |
return (fd < 0)? NULL: oxf_open(fd); |
| } |
} |
| |
|
| OXFILE *oxf_connect_passive(int listened) |
OXFILE *oxf_connect_passive(int listened) |
| { |
{ |
| int fd = mysocketAccept(listened); |
int fd = mysocketAccept(listened); |
| return oxf_open(fd); |
return (fd < 0)? NULL: oxf_open(fd); |
| } |
} |
| |
|
| #define LENGTH_OF_ONETIME_PASSWORD 64 |
#define LENGTH_OF_ONETIME_PASSWORD 64 |
| Line 201 char *generate_otp() |
|
| Line 238 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 237 char *which(char *exe, const char *env) |
|
| Line 274 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; |
| Line 263 int oxc_start(char *remote_host, short port, char *pas |
|
| Line 300 int oxc_start(char *remote_host, short port, char *pas |
|
| if (gethostname(localhost, MAXHOSTNAMELEN)==0) { |
if (gethostname(localhost, MAXHOSTNAMELEN)==0) { |
| if ((pid = fork()) == 0) { |
if ((pid = fork()) == 0) { |
| sprintf(ports, "%d", port); |
sprintf(ports, "%d", port); |
| #ifdef DEBUG |
ox_printf("oxf.c:: oxc_start() does %s(ssh) -f %s -h %s -p %s -c %s\n", remote_host, cmd, localhost, ports, passwd); |
| fprintf(stderr, "oxf.c:: oxc_start() does %s(ssh) -f %s -h %s -p %s -c %s\n", remote_host, cmd, localhost, ports, passwd); |
|
| #endif |
|
| execlp("ssh", remote_host, "-f", cmd, |
execlp("ssh", remote_host, "-f", cmd, |
| "-h", localhost, "-p", ports,"-c", passwd, NULL); |
"-h", localhost, "-p", ports,"-c", passwd, NULL); |
| } |
} |
| Line 313 static char *pipe_read_string() |
|
| Line 348 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; |
| } |
} |