version 1.17, 2003/06/02 10:25:57 |
version 1.24, 2016/06/30 01:14:00 |
|
|
/* -*- mode: C; coding: euc-japan -*- */ |
/* -*- mode: C; coding: euc-japan -*- */ |
/* $OpenXM: OpenXM/src/ox_toolkit/oxf.c,v 1.16 2003/05/29 15:50:49 ohara Exp $ */ |
/* $OpenXM: OpenXM/src/ox_toolkit/oxf.c,v 1.23 2015/08/27 03:03:33 ohara Exp $ */ |
|
|
/* |
/* |
This module includes functions for sending/receiveng CMO's. |
This module includes functions for sending/receiveng CMO's. |
Some commnets are written in Japanese by the EUC-JP coded |
|
character set. |
|
*/ |
*/ |
|
|
|
#if defined(_MSC_VER) |
|
#define _CRT_RAND_S |
|
#endif |
|
|
#include <stdio.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <stdlib.h> |
#include <string.h> |
#include <string.h> |
#include <unistd.h> |
|
#include <fcntl.h> |
#include <fcntl.h> |
#include <sys/file.h> |
|
#include <sys/param.h> |
|
#include <time.h> |
#include <time.h> |
|
#include <limits.h> |
|
|
#if defined(__sun__) |
#if defined(__sun__) |
#include <netdb.h> |
#include <netdb.h> |
|
|
#include <netinet/in.h> |
#include <netinet/in.h> |
#endif |
#endif |
|
|
|
#if defined(__sun__) |
|
#include <synch.h> |
|
#else |
|
#include <inttypes.h> |
|
#endif |
|
|
|
#if defined(_MSC_VER) |
|
#include <io.h> |
|
#include <winsock2.h> |
|
#define X_OK 0x01 |
|
#define R_OK 0x04 |
|
#define MAXHOSTNAMELEN 256 |
|
#define srandom(s) (srand((s))) |
|
static int random() |
|
{ |
|
int r; |
|
rand_s(&r); |
|
return r; |
|
} |
|
#else |
|
#include <unistd.h> |
|
#include <sys/file.h> |
|
#include <sys/param.h> |
|
#endif |
|
|
#include "mysocket.h" |
#include "mysocket.h" |
#include "ox_toolkit.h" |
#include "ox_toolkit.h" |
|
|
Line 32 static int send_int32_nbo(OXFILE *oxfp, int int32); |
|
Line 57 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 int send_int64_nbo_le(OXFILE *oxfp, double int64); |
|
static int send_int64_lbo(OXFILE *oxfp, double int64); |
|
static double receive_int64_nbo_le(OXFILE *oxfp); |
|
static double receive_int64_lbo(OXFILE *oxfp); |
|
|
|
static void pipe_send_info(int fd, char *hostname, int port, char *password); |
|
|
|
/* translating double of little endian byte order to one of big endian. */ |
|
double htonll_le(double n) |
|
{ |
|
int i; |
|
double r; |
|
char *sp = (char *)&n, *dp = (char *)&r + sizeof(double)-1; |
|
for(i=0; i<sizeof(double); i++) { |
|
*dp-- = *sp++; |
|
} |
|
return r; |
|
} |
|
|
/* enable write buffering */ |
/* enable write buffering */ |
int oxf_setbuffer(OXFILE *oxfp, char *buf, int size) |
int oxf_setbuffer(OXFILE *oxfp, char *buf, int size) |
{ |
{ |
Line 44 int oxf_setbuffer(OXFILE *oxfp, char *buf, int size) |
|
Line 88 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) |
{ |
{ |
int n = read(oxfp->fd, buffer, size*num); |
int n = read(oxfp->fd, buffer, size*num); |
if (n <= 0) { |
if (n <= 0) { |
|
#if 0 |
oxfp->error = 1; |
oxfp->error = 1; |
|
#else |
|
exit(0); |
|
#endif |
} |
} |
return n; |
return n; |
} |
} |
Line 70 int oxf_write(void *buffer, size_t size, size_t num, O |
|
Line 119 int oxf_write(void *buffer, size_t size, size_t num, O |
|
return sz; |
return sz; |
} |
} |
|
|
|
/* sending an object of int64 type with Network Byte Order. */ |
|
static int send_int64_nbo_le(OXFILE *oxfp, double int64) |
|
{ |
|
int64 = htonll_le(int64); |
|
return oxf_write(&int64, sizeof(double), 1, oxfp); |
|
} |
|
|
|
/* sending an object of int64 type with Local Byte Order. */ |
|
static int send_int64_lbo(OXFILE *oxfp, double int64) |
|
{ |
|
return oxf_write(&int64, sizeof(double), 1, oxfp); |
|
} |
|
|
|
/* receiving an object of int64 type with Network Byte Order. */ |
|
static double receive_int64_nbo_le(OXFILE *oxfp) |
|
{ |
|
double tag; |
|
oxf_read(&tag, sizeof(double), 1, oxfp); |
|
return htonll_le(tag); |
|
} |
|
|
|
/* receiving an object of int64 type with Local Byte Order. */ |
|
static double receive_int64_lbo(OXFILE *oxfp) |
|
{ |
|
double tag; |
|
oxf_read(&tag, sizeof(double), 1, oxfp); |
|
return tag; |
|
} |
|
|
/* sending an object of int32 type with Network Byte Order. |
/* sending an object of int32 type with Network Byte Order. |
(not equal to cmo_int32 type) */ |
(not equal to cmo_int32 type) */ |
static int send_int32_nbo(OXFILE *oxfp, int int32) |
static int send_int32_nbo(OXFILE *oxfp, int int32) |
Line 122 OXFILE *oxf_open(int fd) |
|
Line 200 OXFILE *oxf_open(int fd) |
|
oxfp->wbuf = NULL; |
oxfp->wbuf = NULL; |
oxfp->wbuf_size = 0; |
oxfp->wbuf_size = 0; |
oxfp->wbuf_count = 0; |
oxfp->wbuf_count = 0; |
|
oxfp->send_double = send_int64_lbo; |
|
oxfp->receive_double = receive_int64_lbo; |
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 186 void oxf_close(OXFILE *oxfp) |
|
Line 266 void oxf_close(OXFILE *oxfp) |
|
|
|
void oxf_setopt(OXFILE *oxfp, int mode) |
void oxf_setopt(OXFILE *oxfp, int mode) |
{ |
{ |
if (mode == OXF_SETOPT_LBO) { |
int m = 1; |
oxfp->send_int32 = send_int32_lbo; |
if (mode == OXF_SETOPT_NBO && *(char *)&m) { |
oxfp->receive_int32 = receive_int32_lbo; |
/* Little endian architecture. */ |
}else if (mode == OXF_SETOPT_NBO) { |
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->send_double = send_int64_nbo_le; |
|
oxfp->receive_double = receive_int64_nbo_le; |
|
}else { |
|
oxfp->send_int32 = send_int32_lbo; |
|
oxfp->receive_int32 = receive_int32_lbo; |
|
oxfp->send_double = send_int64_lbo; |
|
oxfp->receive_double = receive_int64_lbo; |
} |
} |
} |
} |
|
|
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 289 char *which(char *exe, const char *env) |
|
Line 375 char *which(char *exe, const char *env) |
|
return NULL; |
return NULL; |
} |
} |
|
|
|
#if !defined(_MSC_VER) |
/* 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 399 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 333 int oxc_start_with_pipe(char *remote_host, int port, c |
|
Line 419 int oxc_start_with_pipe(char *remote_host, int port, c |
|
} |
} |
return pid; |
return pid; |
} |
} |
|
#endif |
|
|
static void pipe_send_string(int fd, char *s) |
static void pipe_send_string(int fd, char *s) |
{ |
{ |
Line 362 void pipe_send_info(int fd, char *hostname, int port, |
|
Line 449 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 463 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); |