version 1.13, 2000/10/10 05:23:20 |
version 1.24, 2003/05/25 16:35:40 |
|
|
/* -*- mode: C; coding: euc-japan -*- */ |
/* -*- mode: C; coding: euc-japan -*- */ |
/* $OpenXM: OpenXM/src/ox_toolkit/ox.c,v 1.12 2000/03/10 12:24:38 ohara Exp $ */ |
/* $OpenXM: OpenXM/src/ox_toolkit/ox.c,v 1.23 2003/03/30 08:05:22 ohara Exp $ */ |
|
|
/* |
/* |
This module includes functions for sending/receiveng CMO's. |
This module includes functions for sending/receiveng CMO's. |
|
|
|
|
#include <stdio.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <stdlib.h> |
|
#include <stdarg.h> |
#include <string.h> |
#include <string.h> |
#include <unistd.h> |
#include <unistd.h> |
#include <errno.h> |
|
#include <fcntl.h> |
#include <fcntl.h> |
#include <sys/file.h> |
#include <sys/file.h> |
#include <time.h> |
#include <time.h> |
|
|
#include "ox_toolkit.h" |
#include "ox_toolkit.h" |
#include "parse.h" |
#include "parse.h" |
|
|
/* CMO_xxx の値の順にならべること(デバッグのため) */ |
static FILE *ox_stderr = NULL; |
|
|
|
/* sorting by the value of CMO_xxx. (for debugging) */ |
static cmo_null* receive_cmo_null(OXFILE *oxfp); |
static cmo_null* receive_cmo_null(OXFILE *oxfp); |
static cmo_int32* receive_cmo_int32(OXFILE *oxfp); |
static cmo_int32* receive_cmo_int32(OXFILE *oxfp); |
static cmo_string* receive_cmo_string(OXFILE *oxfp); |
static cmo_string* receive_cmo_string(OXFILE *oxfp); |
static cmo_mathcap* receive_cmo_mathcap(OXFILE *oxfp); |
static cmo_mathcap* receive_cmo_mathcap(OXFILE *oxfp); |
static cmo_list* receive_cmo_list(OXFILE *oxfp); |
static cmo_list* receive_cmo_list(OXFILE *oxfp); |
static cmo_monomial32* receive_cmo_monomial32(OXFILE *oxfp); |
static cmo_monomial32* receive_cmo_monomial32(OXFILE *oxfp); |
static cmo_zz* receive_cmo_zz(OXFILE *oxfp); |
|
static cmo_zero* receive_cmo_zero(OXFILE *oxfp); |
static cmo_zero* receive_cmo_zero(OXFILE *oxfp); |
static cmo_dms_generic* receive_cmo_dms_generic(OXFILE *oxfp); |
static cmo_dms_generic* receive_cmo_dms_generic(OXFILE *oxfp); |
static cmo_ring_by_name* receive_cmo_ring_by_name(OXFILE *oxfp); |
static cmo_ring_by_name* receive_cmo_ring_by_name(OXFILE *oxfp); |
static cmo_distributed_polynomial* receive_cmo_distributed_polynomial(OXFILE *oxfp); |
static cmo_distributed_polynomial* receive_cmo_distributed_polynomial(OXFILE *oxfp); |
|
|
static cmo_error2* receive_cmo_error2(OXFILE *oxfp); |
static cmo_error2* receive_cmo_error2(OXFILE *oxfp); |
static void receive_mpz(OXFILE *oxfp, mpz_ptr mpz); |
|
|
|
static int send_cmo_null(OXFILE *oxfp, cmo_null* c); |
static int send_cmo_null(OXFILE *oxfp, cmo_null* c); |
static int send_cmo_int32(OXFILE *oxfp, cmo_int32* m); |
static int send_cmo_int32(OXFILE *oxfp, cmo_int32* m); |
Line 42 static int send_cmo_string(OXFILE *oxfp, cmo_ |
|
Line 41 static int send_cmo_string(OXFILE *oxfp, cmo_ |
|
static int send_cmo_mathcap(OXFILE *oxfp, cmo_mathcap* c); |
static int send_cmo_mathcap(OXFILE *oxfp, cmo_mathcap* c); |
static int send_cmo_list(OXFILE *oxfp, cmo_list* c); |
static int send_cmo_list(OXFILE *oxfp, cmo_list* c); |
static int send_cmo_monomial32(OXFILE *oxfp, cmo_monomial32* c); |
static int send_cmo_monomial32(OXFILE *oxfp, cmo_monomial32* c); |
static int send_cmo_zz(OXFILE *oxfp, cmo_zz* c); |
|
static int send_cmo_error2(OXFILE *oxfp, cmo_error2* c); |
static int send_cmo_error2(OXFILE *oxfp, cmo_error2* c); |
static int send_mpz(OXFILE *oxfp, mpz_ptr mpz); |
|
static int send_cmo_distributed_polynomial(OXFILE *oxfp, cmo_distributed_polynomial* c); |
static int send_cmo_distributed_polynomial(OXFILE *oxfp, cmo_distributed_polynomial* c); |
|
|
int ssh_ox_server(char *, char *, char *, short, short); |
static cmo_zz* receive_cmo_zz(OXFILE *oxfp); |
|
static void receive_mpz(OXFILE *oxfp, mpz_ptr mpz); |
|
static int send_cmo_zz(OXFILE *oxfp, cmo_zz* c); |
|
static int send_mpz(OXFILE *oxfp, mpz_ptr mpz); |
|
|
OXFILE *current_fd = NULL; |
|
void set_current_fd(OXFILE *oxfp) |
|
{ |
|
current_fd = oxfp; |
|
} |
|
|
|
/* hook functions. (yet not implemented) */ |
/* hook functions. (yet not implemented) */ |
static hook_t hook_before_send_cmo = NULL; |
static hook_t hook_before_send_cmo = NULL; |
static hook_t hook_after_send_cmo = NULL; |
static hook_t hook_after_send_cmo = NULL; |
Line 87 static cmo *call_hook_after_send_cmo(OXFILE *oxfp, cmo |
|
Line 81 static cmo *call_hook_after_send_cmo(OXFILE *oxfp, cmo |
|
return c; |
return c; |
} |
} |
|
|
int oxf_read(void *buffer, size_t size, size_t num, OXFILE *oxfp) |
|
{ |
|
return read(oxfp->fd, buffer, size*num); |
|
/* return fread(buffer, size, num, oxfp->fp); */ |
|
} |
|
|
|
int oxf_write(void *buffer, size_t size, size_t num, OXFILE *oxfp) |
|
{ |
|
return write(oxfp->fd, buffer, size*num); |
|
/* return fwrite(buffer, size, num, oxfp->fp); */ |
|
} |
|
|
|
/* Handling an error. */ |
/* Handling an error. */ |
static int current_received_serial = 0; |
static int current_received_serial = 0; |
|
|
Line 109 cmo_error2* make_error_object(int err_code, cmo *ob) |
|
Line 91 cmo_error2* make_error_object(int err_code, cmo *ob) |
|
list_append(li, (cmo *)new_cmo_int32(current_received_serial)); |
list_append(li, (cmo *)new_cmo_int32(current_received_serial)); |
list_append(li, (cmo *)new_cmo_int32(err_code)); |
list_append(li, (cmo *)new_cmo_int32(err_code)); |
list_append(li, ob); |
list_append(li, ob); |
/* 他の情報を加えるならココ */ |
|
return new_cmo_error2((cmo *)li); |
return new_cmo_error2((cmo *)li); |
} |
} |
|
|
#define DEFAULT_SERIAL_NUMBER 0x0000ffff |
|
#define receive_serial_number(x) (receive_int32((x))) |
|
|
|
/* getting a next serial number. */ |
/* getting a next serial number. */ |
int next_serial(OXFILE *oxfp) |
int next_serial(OXFILE *oxfp) |
{ |
{ |
/* |
|
static int serial_number = DEFAULT_SERIAL_NUMBER; |
|
*/ |
|
return oxfp->serial_number++; |
return oxfp->serial_number++; |
} |
} |
|
|
Line 131 int send_int32(OXFILE *oxfp, int int32) |
|
Line 106 int send_int32(OXFILE *oxfp, int int32) |
|
return oxfp->send_int32(oxfp, int32); |
return oxfp->send_int32(oxfp, int32); |
} |
} |
|
|
/* sending an object of int32 type with Network Byte Order. |
|
(not equal to cmo_int32 type) */ |
|
int send_int32_nbo(OXFILE *oxfp, int int32) |
|
{ |
|
int32 = htonl(int32); |
|
return oxf_write(&int32, sizeof(int), 1, oxfp); |
|
} |
|
|
|
/* sending an object of int32 type with Local Byte Order. |
|
(not equal to cmo_int32 type) */ |
|
int send_int32_lbo(OXFILE *oxfp, int int32) |
|
{ |
|
return oxf_write(&int32, sizeof(int), 1, oxfp); |
|
} |
|
|
|
/* receiving an object of int32 type. (not equal to cmo_int32 type) */ |
/* receiving an object of int32 type. (not equal to cmo_int32 type) */ |
int receive_int32(OXFILE *oxfp) |
int receive_int32(OXFILE *oxfp) |
{ |
{ |
return oxfp->receive_int32(oxfp); |
return oxfp->receive_int32(oxfp); |
} |
} |
|
|
/* receiving an object of int32 type with Network Byte Order. |
|
(not equal to cmo_int32 type) */ |
|
int receive_int32_nbo(OXFILE *oxfp) |
|
{ |
|
int tag; |
|
oxf_read(&tag, sizeof(int), 1, oxfp); |
|
return ntohl(tag); |
|
} |
|
|
|
/* receiving an object of int32 type with Local Byte Order. |
|
(not equal to cmo_int32 type) */ |
|
int receive_int32_lbo(OXFILE *oxfp) |
|
{ |
|
int tag; |
|
oxf_read(&tag, sizeof(int), 1, oxfp); |
|
return tag; |
|
} |
|
|
|
/* socket システムコールなどで socket を開いたのち、 |
|
fdopen(sd, "a+") でバッファリングする。("w+" ではない) |
|
バッファリングの後、バイトオーダを決定し、 |
|
oxf_setopt() で関数ポインタを設定し直す。*/ |
|
|
|
/* receiving an (OX_tag, serial number) */ |
/* receiving an (OX_tag, serial number) */ |
int receive_ox_tag(OXFILE *oxfp) |
int receive_ox_tag(OXFILE *oxfp) |
{ |
{ |
int tag = receive_int32(oxfp); |
int tag = receive_int32(oxfp); |
current_received_serial = receive_serial_number(oxfp); |
oxfp->received_serial_number = receive_int32(oxfp); |
return tag; |
return tag; |
} |
} |
|
|
Line 291 static cmo_error2* receive_cmo_error2(OXFILE *oxfp) |
|
Line 228 static cmo_error2* receive_cmo_error2(OXFILE *oxfp) |
|
return new_cmo_error2(ob); |
return new_cmo_error2(ob); |
} |
} |
|
|
/* receive_ox_tag() == OX_DATA の後に呼び出される */ |
/* receive_cmo() is called after receive_ox_tag(). */ |
/* 関数ポインタを使った方がきれいに書けるような気がする. */ |
|
/* if (foo[tag] != NULL) foo[tag](oxfp); とか */ |
|
|
|
cmo* receive_cmo(OXFILE *oxfp) |
cmo* receive_cmo(OXFILE *oxfp) |
{ |
{ |
cmo* m; |
|
int tag = receive_int32(oxfp); |
int tag = receive_int32(oxfp); |
|
return receive_cmo_tag(oxfp, tag); |
|
} |
|
|
|
cmo *receive_cmo_tag(OXFILE *oxfp, int tag) |
|
{ |
|
cmo* m; |
switch(tag) { |
switch(tag) { |
case CMO_NULL: |
case CMO_NULL: |
m = receive_cmo_null(oxfp); |
m = receive_cmo_null(oxfp); |
Line 340 cmo* receive_cmo(OXFILE *oxfp) |
|
Line 279 cmo* receive_cmo(OXFILE *oxfp) |
|
case CMO_QQ: |
case CMO_QQ: |
default: |
default: |
m = NULL; |
m = NULL; |
fprintf(stderr, "the CMO (%d) is not implemented.\n", tag); |
ox_printf("the CMO (%d) is not implemented.\n", tag); |
} |
} |
return m; |
return m; |
} |
} |
Line 367 void send_ox_command(OXFILE *oxfp, int sm_command) |
|
Line 306 void send_ox_command(OXFILE *oxfp, int sm_command) |
|
void ox_close(OXFILE *sv) |
void ox_close(OXFILE *sv) |
{ |
{ |
send_ox_command(oxf_control(sv), SM_control_kill); |
send_ox_command(oxf_control(sv), SM_control_kill); |
#ifdef DEBUG |
|
sleep(2); |
sleep(2); |
/* We wait thar an OpenXM server terminates. */ |
/* We wait thar an OpenXM server terminates. */ |
fprintf(stderr, "I have closed the connection to an Open XM server.\n"); |
ox_printf("I have closed the connection to an Open XM server.\n"); |
#endif |
|
} |
} |
|
|
void ox_shutdown(OXFILE *sv) |
void ox_shutdown(OXFILE *sv) |
Line 447 int ox_flush(OXFILE *sv) |
|
Line 384 int ox_flush(OXFILE *sv) |
|
void ox_reset(OXFILE *sv) |
void ox_reset(OXFILE *sv) |
{ |
{ |
send_ox_command(oxf_control(sv), SM_control_reset_connection); |
send_ox_command(oxf_control(sv), SM_control_reset_connection); |
|
|
receive_ox_tag(oxf_control(sv)); /* OX_DATA */ |
|
receive_cmo(oxf_control(sv)); /* (CMO_INT32, 0) */ |
|
|
|
while(receive_ox_tag(sv) != OX_SYNC_BALL) { |
while(receive_ox_tag(sv) != OX_SYNC_BALL) { |
receive_cmo(sv); /* skipping a message. */ |
receive_cmo(sv); /* skipping a message. */ |
} |
} |
|
|
send_ox_tag(sv, OX_SYNC_BALL); |
send_ox_tag(sv, OX_SYNC_BALL); |
#ifdef DEBUG |
ox_printf("I have reset an Open XM server.\n"); |
fprintf(stderr, "I have reset an Open XM server.\n"); |
|
#endif |
|
} |
} |
|
|
void send_ox(OXFILE *oxfp, ox *m) |
void send_ox(OXFILE *oxfp, ox *m) |
Line 635 ox_sync_ball* new_ox_sync_ball() |
|
Line 566 ox_sync_ball* new_ox_sync_ball() |
|
ox_sync_ball *m = malloc(sizeof(ox_sync_ball)); |
ox_sync_ball *m = malloc(sizeof(ox_sync_ball)); |
m->tag = OX_SYNC_BALL; |
m->tag = OX_SYNC_BALL; |
return m; |
return m; |
|
} |
|
|
|
int ox_stderr_init(FILE *fp) |
|
{ |
|
ox_stderr = fp; |
|
if (ox_stderr != NULL) { |
|
setbuf(ox_stderr, NULL); |
|
} |
|
} |
|
|
|
int ox_printf(char *format, ...) |
|
{ |
|
if (ox_stderr != NULL) { |
|
va_list ap; |
|
va_start(ap, format); |
|
vfprintf(ox_stderr, format, ap); |
|
} |
} |
} |