| version 1.2, 2003/11/08 12:34:00 |
version 1.3, 2003/11/15 09:06:20 |
|
|
| /* $OpenXM: OpenXM/src/ox_ntl/oxserv.c,v 1.1 2003/11/03 03:11:21 iwane Exp $ */ |
/* $OpenXM: OpenXM/src/ox_ntl/oxserv.c,v 1.2 2003/11/08 12:34:00 iwane Exp $ */ |
| |
|
| #include <stdio.h> |
#include <stdio.h> |
| #include <stdlib.h> |
#include <stdlib.h> |
| #include <string.h> |
#include <string.h> |
| #include <errno.h> |
#include <errno.h> |
| #include <signal.h> |
#include <signal.h> |
| |
#include <setjmp.h> |
| |
|
| #include "oxserv.h" |
#include "oxserv.h" |
| #include "oxstack.h" |
#include "oxstack.h" |
| |
|
| |
#include "gc/gc.h" |
| |
|
| #define DPRINTF(x) printf x; fflush(stdout) |
#define DPRINTF(x) printf x; fflush(stdout) |
| |
|
| #if 0 |
#define FP stdout |
| |
#define EPRINTF(x) fprintf x; fflush(FP) |
| |
|
| |
#if 1 |
| /*===========================================================================* |
/*===========================================================================* |
| * for DEBUG |
* for DEBUG |
| *===========================================================================*/ |
*===========================================================================*/ |
| Line 38 dprintf(const char *fmt, ...) |
|
| Line 43 dprintf(const char *fmt, ...) |
|
| /*===========================================================================* |
/*===========================================================================* |
| * MACRO |
* MACRO |
| *===========================================================================*/ |
*===========================================================================*/ |
| #define MOXSERV_GET_CMO_TAG(m) ((G_getCmoTag == NULL) ? m->tag : G_getCmoTag(m)) |
#define oxserv_get_cmo_tag(m) ((G_getCmoTag == NULL) ? m->tag : G_getCmoTag(m)) |
| |
|
| |
|
| #define oxserv_delete_cmo(c) \ |
#define oxserv_delete_cmo(c) \ |
| do { \ |
do { \ |
| if (G_DeleteCmo != NULL) \ |
if (c != NULL) { \ |
| |
if (G_DeleteCmo != NULL) \ |
| G_DeleteCmo(c); \ |
G_DeleteCmo(c); \ |
| else \ |
else \ |
| c = NULL; \ |
c = NULL; \ |
| |
} \ |
| } while (0) |
} while (0) |
| |
|
| |
|
| |
|
| /*===========================================================================* |
/*===========================================================================* |
| * Global Variables. |
* Global Variables. |
| *===========================================================================*/ |
*===========================================================================*/ |
|
|
| static OXFILE *G_oxfilep = NULL; |
static OXFILE *G_oxfilep = NULL; |
| static cmo_mathcap *G_oxserv_mathcap = NULL; |
static cmo_mathcap *G_oxserv_mathcap = NULL; |
| |
|
| |
/* signal */ |
| |
sigset_t G_oxserv_sigusr1; |
| |
static jmp_buf G_jmpbuf; |
| |
|
| /* User Function */ |
/* User Function */ |
| static void (*G_userExecuteFunction)(const char *, cmo **, int) = NULL; |
static void (*G_userExecuteFunction)(const char *, cmo **, int) = NULL; |
| static void (*G_userExecuteStringParser)(const char *) = NULL; |
static void (*G_userExecuteStringParser)(const char *) = NULL; |
| Line 68 static void (*G_DeleteCmo)(cmo *) = NULL; |
|
| Line 78 static void (*G_DeleteCmo)(cmo *) = NULL; |
|
| |
|
| static int (*G_getCmoTag)(cmo *) = NULL; |
static int (*G_getCmoTag)(cmo *) = NULL; |
| |
|
| |
|
| /*===========================================================================* |
/*===========================================================================* |
| |
* CMO_ERROR2 |
| |
*===========================================================================*/ |
| |
#define new_cmo_error2_string(msg) new_cmo_error2((cmo *)new_cmo_string(msg)) |
| |
|
| |
|
| |
static void |
| |
oxserv_push_errormes(char *msg) |
| |
{ |
| |
EPRINTF((FP, "%s\n", msg)); |
| |
oxstack_push((cmo *)new_cmo_error2_string(msg)); |
| |
} |
| |
|
| |
/*===========================================================================* |
| |
* synchronized malloc |
| |
*===========================================================================*/ |
| |
void * |
| |
oxserv_malloc(size_t size) |
| |
{ |
| |
void *ptr; |
| |
|
| |
BLOCK_INPUT(); |
| |
ptr = GC_malloc(size); |
| |
UNBLOCK_INPUT(); |
| |
|
| |
return (ptr); |
| |
} |
| |
|
| |
void |
| |
oxserv_free(void *ptr, size_t size) |
| |
{ |
| |
/* nothing */ |
| |
} |
| |
|
| |
void * |
| |
oxserv_realloc(void *org, size_t old, size_t size) |
| |
{ |
| |
void *ptr; |
| |
|
| |
BLOCK_INPUT(); |
| |
ptr = GC_realloc(org, size); |
| |
UNBLOCK_INPUT(); |
| |
|
| |
return (ptr); |
| |
} |
| |
|
| |
|
| |
|
| |
/*===========================================================================* |
| * OX_SERVER |
* OX_SERVER |
| *===========================================================================*/ |
*===========================================================================*/ |
| |
|
| Line 83 static int (*G_getCmoTag)(cmo *) = NULL; |
|
| Line 142 static int (*G_getCmoTag)(cmo *) = NULL; |
|
| static void |
static void |
| oxserv_sm_popCMO(OXFILE *fd) |
oxserv_sm_popCMO(OXFILE *fd) |
| { |
{ |
| cmo *m = oxstack_pop(); |
cmo *m, *n; |
| |
m = oxstack_pop(); |
| if (m == NULL) { |
if (m == NULL) { |
| |
EPRINTF((FP, "stack underflow in popCMO\n")); |
| m = new_cmo_null(); |
m = new_cmo_null(); |
| } else if (G_convertCmo) { |
} else if (G_convertCmo) { |
| m = G_convertCmo(m); |
n = G_convertCmo(m); |
| |
if (m != n) |
| |
oxserv_delete_cmo(m); |
| |
m = n; |
| } |
} |
| |
|
| send_ox_cmo(fd, m); |
send_ox_cmo(fd, m); |
| Line 110 oxserv_sm_popString(OXFILE *fd) |
|
| Line 174 oxserv_sm_popString(OXFILE *fd) |
|
| cmo *m = oxstack_pop(); |
cmo *m = oxstack_pop(); |
| cmo_string *m_str; |
cmo_string *m_str; |
| |
|
| if (m == NULL) |
if (m == NULL) { |
| |
EPRINTF((FP, "stack underflow in popString\n")); |
| m = new_cmo_null(); |
m = new_cmo_null(); |
| |
} |
| |
|
| str = new_string_set_cmo(m); |
str = new_string_set_cmo(m); |
| |
|
| Line 141 oxserv_sm_pops() |
|
| Line 207 oxserv_sm_pops() |
|
| int i; |
int i; |
| |
|
| c = (cmo_int32 *)oxstack_pop(); /* suppose */ |
c = (cmo_int32 *)oxstack_pop(); /* suppose */ |
| |
if (c == NULL) { |
| |
EPRINTF((FP, "stack underflow in pops\n")); |
| |
return ; |
| |
} |
| |
|
| n = oxstack_get_stack_pointer(); |
n = oxstack_get_stack_pointer(); |
| if (c->i < n) |
if (c->i < n) |
|
|
| oxserv_sm_executeStringByLocalParserInBatchMode(void) |
oxserv_sm_executeStringByLocalParserInBatchMode(void) |
| { |
{ |
| cmo_string *str = (cmo_string *)oxstack_peek(); |
cmo_string *str = (cmo_string *)oxstack_peek(); |
| |
if (str == NULL) { |
| |
oxserv_push_errormes("stack underflow in executeStringByLocalParserInBatchMode"); |
| |
return ; |
| |
} |
| G_userExecuteStringParser(str->s); |
G_userExecuteStringParser(str->s); |
| } |
} |
| |
|
|
|
| oxserv_sm_executeStringByLocalParser(void) |
oxserv_sm_executeStringByLocalParser(void) |
| { |
{ |
| cmo_string *str = (cmo_string *)oxstack_pop(); |
cmo_string *str = (cmo_string *)oxstack_pop(); |
| |
if (str == NULL) { |
| |
oxserv_push_errormes("stack underflow in executeStringByLocalParser"); |
| |
return ; |
| |
} |
| G_userExecuteStringParser(str->s); |
G_userExecuteStringParser(str->s); |
| } |
} |
| |
|
| Line 320 oxserv_sm_executeFunction(void) |
|
| Line 398 oxserv_sm_executeFunction(void) |
|
| int i; |
int i; |
| cmo_string *name = (cmo_string *)oxstack_pop(); |
cmo_string *name = (cmo_string *)oxstack_pop(); |
| cmo_int32 *cnt = (cmo_int32 *)oxstack_pop(); |
cmo_int32 *cnt = (cmo_int32 *)oxstack_pop(); |
| cmo **arg = (cmo **)malloc(cnt->i * sizeof(cmo *)); |
cmo **arg; |
| |
|
| |
arg = (cmo **)malloc(cnt->i * sizeof(cmo *)); |
| |
|
| |
if (name == NULL || cnt == NULL) { |
| |
oxserv_push_errormes("stack underflow in executeFunction"); |
| |
return ; |
| |
} |
| |
|
| for (i = 0; i < cnt->i; i++) { |
for (i = 0; i < cnt->i; i++) { |
| arg[i] = oxstack_pop(); |
arg[i] = oxstack_pop(); |
| |
if (arg[i] == NULL) { |
| |
oxserv_push_errormes("stack underflow in executeFunction"); |
| |
return ; |
| |
} |
| } |
} |
| |
|
| /* user function */ |
/* user function */ |
|
|
| oxserv_sm_pushCMOtag() |
oxserv_sm_pushCMOtag() |
| { |
{ |
| cmo *c = oxstack_peek(); |
cmo *c = oxstack_peek(); |
| cmo_int32 *tag = new_cmo_int32(MOXSERV_GET_CMO_TAG(c)); |
cmo_int32 *tag = new_cmo_int32(oxserv_get_cmo_tag(c)); |
| oxstack_push((cmo *)tag); |
oxstack_push((cmo *)tag); |
| } |
} |
| |
|
| |
|
| |
/***************************************************************************** |
| |
* -- SM_dupErrors -- |
| |
* |
| |
* PARAM : NONE |
| |
* RETURN: NONE |
| |
*****************************************************************************/ |
| static void |
static void |
| oxserv_sm_dupErrors() |
oxserv_sm_dupErrors() |
| { |
{ |
| Line 375 oxserv_sm_dupErrors() |
|
| Line 470 oxserv_sm_dupErrors() |
|
| oxstack_push((cmo *)list); |
oxstack_push((cmo *)list); |
| } |
} |
| |
|
| |
|
| |
|
| |
|
| |
/***************************************************************************** |
| |
* -- SM_control_reset_connection -- signal handler for SIGUSR1 -- |
| |
* |
| |
* PARAM : NONE |
| |
* RETURN: NONE |
| |
*****************************************************************************/ |
| static void |
static void |
| oxserv_sm_control_reset_connection(int sig) |
oxserv_sm_control_reset_connection(int sig) |
| { |
{ |
| int tag; |
int tag; |
| OXFILE *fd = G_oxfilep; |
OXFILE *fd = G_oxfilep; |
| |
|
| DPRINTF(("reset -- start\n")); |
DPRINTF(("reset -- start ==> ")); |
| send_ox_tag(fd, OX_SYNC_BALL); |
send_ox_tag(fd, OX_SYNC_BALL); |
| |
|
| oxstack_init_stack(); |
oxstack_init_stack(); |
| |
|
| for (;;) { |
for (;;) { |
| tag = receive_ox_tag(fd); |
tag = receive_ox_tag(fd); |
| DPRINTF(("[%d=0x%x]", tag, tag)); |
DPRINTF(("[OX:%d=0x%x]", tag, tag)); |
| if (tag == OX_SYNC_BALL) |
if (tag == OX_SYNC_BALL) |
| break; |
break; |
| if (tag == OX_DATA) |
if (tag == OX_DATA) |
| receive_cmo(fd); |
receive_cmo(fd); |
| |
else |
| |
receive_int32(fd); |
| } |
} |
| DPRINTF(("-- end.\n")); |
DPRINTF((" <== end.\n")); |
| |
|
| |
longjmp(G_jmpbuf, sig); |
| } |
} |
| |
|
| |
/***************************************************************************** |
| |
* execute sm command |
| |
* |
| |
* PARAM : NONE |
| |
* RETURN: NONE |
| |
*****************************************************************************/ |
| static int |
static int |
| oxserv_receive_and_execute_sm_command(OXFILE *fd) |
oxserv_execute_sm_command(OXFILE *fd, int code) |
| { |
{ |
| int code = receive_int32(fd); |
|
| |
|
| |
DPRINTF(("[SM:%d=0x%x]", code, code)); |
| |
|
| switch (code) { |
switch (code) { |
| case SM_popCMO: |
case SM_popCMO: /* 262 */ |
| oxserv_sm_popCMO(fd); |
oxserv_sm_popCMO(fd); |
| break; |
break; |
| case SM_executeStringByLocalParser: |
case SM_executeStringByLocalParser: /* 268 */ |
| if (G_userExecuteStringParser) |
if (G_userExecuteStringParser) |
| oxserv_sm_executeStringByLocalParser(); |
oxserv_sm_executeStringByLocalParser(); |
| break; |
break; |
| case SM_executeStringByLocalParserInBatchMode: |
case SM_executeStringByLocalParserInBatchMode: /* 274 */ |
| if (G_userExecuteStringParser) |
if (G_userExecuteStringParser) |
| oxserv_sm_executeStringByLocalParserInBatchMode(); |
oxserv_sm_executeStringByLocalParserInBatchMode(); |
| break; |
break; |
| case SM_pops: |
case SM_pops: /* 265 */ |
| oxserv_sm_pops(); |
oxserv_sm_pops(); |
| break; |
break; |
| case SM_popString: |
case SM_popString: /* 263 */ |
| oxserv_sm_popString(fd); |
oxserv_sm_popString(fd); |
| break; |
break; |
| case SM_getsp: |
case SM_getsp: /* 275 */ |
| oxserv_sm_getsp(); |
oxserv_sm_getsp(); |
| break; |
break; |
| case SM_mathcap: |
case SM_mathcap: /* 264 */ |
| oxserv_sm_mathcap(); |
oxserv_sm_mathcap(); |
| break; |
break; |
| case SM_setMathCap: |
case SM_setMathCap: /* 273 */ |
| /* dont support */ |
/* dont support */ |
| oxstack_pop(); |
oxstack_pop(); |
| break; |
break; |
| case SM_executeFunction: |
case SM_executeFunction: /* 269 */ |
| if (G_userExecuteFunction) |
if (G_userExecuteFunction) |
| oxserv_sm_executeFunction(); |
oxserv_sm_executeFunction(); |
| break; |
break; |
| case SM_pushCMOtag: |
case SM_pushCMOtag: /* 277 */ |
| oxserv_sm_pushCMOtag(); |
oxserv_sm_pushCMOtag(); |
| break; |
break; |
| case SM_dupErrors: |
case SM_dupErrors: /* 276 */ |
| oxserv_sm_dupErrors(); |
oxserv_sm_dupErrors(); |
| break; |
break; |
| |
case SM_popSerializedLocalObject: |
| |
case SM_setName: |
| |
case SM_evalName: |
| |
case SM_beginBlock: |
| |
case SM_endBlock: |
| |
case SM_shutdown: |
| |
case SM_executeFunctionAndPopCMO: |
| |
case SM_executeFunctionAndPopSerializedLocalObject: |
| case SM_control_reset_connection: |
case SM_control_reset_connection: |
| case SM_control_reset_connection_server: |
case SM_control_reset_connection_server: |
| default: |
default: |
| Line 456 oxserv_receive_and_execute_sm_command(OXFILE *fd) |
|
| Line 579 oxserv_receive_and_execute_sm_command(OXFILE *fd) |
|
| * PARAM : fd : OXFILE |
* PARAM : fd : OXFILE |
| * RETURN: NONE |
* RETURN: NONE |
| *****************************************************************************/ |
*****************************************************************************/ |
| int |
static int |
| oxserv_receive(OXFILE *fd) |
oxserv_ox_receive(OXFILE *fd) |
| { |
{ |
| int tag; |
int tag; |
| cmo *c; |
cmo *c; |
| int ret = OXSERV_SUCCESS; |
int ret = OXSERV_SUCCESS; |
| |
int code; |
| |
|
| tag = receive_ox_tag(fd); |
tag = receive_ox_tag(fd); |
| |
|
| switch (tag) { |
switch (tag) { |
| case OX_DATA: |
case OX_DATA: |
| c = receive_cmo(fd); |
c = receive_cmo(fd); |
| DPRINTF(("[CMO:%d]", c->tag)); |
DPRINTF(("[CMO:%d=0x%x]", c->tag, c->tag)); |
| oxstack_push(c); |
oxstack_push(c); |
| break; |
break; |
| |
|
| case OX_COMMAND: |
case OX_COMMAND: |
| DPRINTF(("[SM:%d=0x%x]", tag, tag)); |
code = receive_int32(fd); |
| ret = oxserv_receive_and_execute_sm_command(fd); |
ret = oxserv_execute_sm_command(fd, code); |
| break; |
break; |
| |
|
| default: |
default: |
| Line 485 oxserv_receive(OXFILE *fd) |
|
| Line 609 oxserv_receive(OXFILE *fd) |
|
| return (ret); |
return (ret); |
| } |
} |
| |
|
| |
int |
| |
oxserv_receive(OXFILE *fd) |
| |
{ |
| |
int i = 0; |
| |
int ret; |
| |
|
| |
ret = setjmp(G_jmpbuf); |
| |
if (ret == 0) { |
| |
DPRINTF(("setjmp first time -- %d\n", ret)); |
| |
} else { |
| |
DPRINTF(("setjmp return from longjmp() -- %d -- \n", ret)); |
| |
} |
| |
|
| |
for (;; i++) { |
| |
ret = oxserv_ox_receive(fd); |
| |
if (ret != OXSERV_SUCCESS) |
| |
break; |
| |
} |
| |
return (ret); |
| |
} |
| |
|
| |
|
| /***************************************************************************** |
/***************************************************************************** |
| * initialize oxserver |
* initialize oxserver |
| * |
* |
| Line 500 oxserv_init(OXFILE *oxfp, int ver, char *vstr, char *s |
|
| Line 645 oxserv_init(OXFILE *oxfp, int ver, char *vstr, char *s |
|
| { |
{ |
| int ret; |
int ret; |
| |
|
| |
DPRINTF(("init start\n")); |
| |
|
| ret = oxstack_init_stack(); |
ret = oxstack_init_stack(); |
| if (ret != OXSERV_SUCCESS) |
if (ret != OXSERV_SUCCESS) |
| return (ret); |
return (ret); |
| Line 508 oxserv_init(OXFILE *oxfp, int ver, char *vstr, char *s |
|
| Line 655 oxserv_init(OXFILE *oxfp, int ver, char *vstr, char *s |
|
| |
|
| oxserv_mathcap_init(ver, vstr, sysname, cmos, sms); |
oxserv_mathcap_init(ver, vstr, sysname, cmos, sms); |
| |
|
| |
/* signal */ |
| |
sigemptyset(&G_oxserv_sigusr1); |
| |
sigaddset(&G_oxserv_sigusr1, SIGUSR1); |
| signal(SIGUSR1, oxserv_sm_control_reset_connection); |
signal(SIGUSR1, oxserv_sm_control_reset_connection); |
| |
|
| |
/* initialize GMP memory functions. */ |
| |
mp_set_memory_functions(oxserv_malloc, oxserv_realloc, oxserv_free); |
| |
|
| |
/* session start */ |
| oxf_determine_byteorder_server(oxfp); |
oxf_determine_byteorder_server(oxfp); |
| |
|
| return (OXSERV_SUCCESS); |
return (OXSERV_SUCCESS); |
| Line 517 oxserv_init(OXFILE *oxfp, int ver, char *vstr, char *s |
|
| Line 671 oxserv_init(OXFILE *oxfp, int ver, char *vstr, char *s |
|
| |
|
| |
|
| /***************************************************************************** |
/***************************************************************************** |
| * set oxserver |
* set oxserver behavior |
| * |
* |
| * PARAM : mode : mode |
* PARAM : mode : mode |
| * : |
* : |