=================================================================== RCS file: /home/cvs/OpenXM/src/ox_math/Attic/ox.c,v retrieving revision 1.7 retrieving revision 1.11 diff -u -p -r1.7 -r1.11 --- OpenXM/src/ox_math/Attic/ox.c 1999/11/04 06:21:58 1.7 +++ OpenXM/src/ox_math/Attic/ox.c 1999/11/06 21:39:36 1.11 @@ -1,5 +1,5 @@ /* -*- mode: C; coding: euc-japan -*- */ -/* $OpenXM: OpenXM/src/ox_math/ox.c,v 1.6 1999/11/04 03:05:50 ohara Exp $ */ +/* $OpenXM: OpenXM/src/ox_math/ox.c,v 1.10 1999/11/05 12:34:25 ohara Exp $ */ /* 関数の名前付け規約(その2): @@ -31,6 +31,8 @@ YYY_cmo_XXX 関数が処理する. cmo の内部に cmo_ZZZ への #include #include #include +#include +#include #include "mysocket.h" #include "ox.h" @@ -87,7 +89,6 @@ static int send_cmo_error2(int fd, cmo_error2 static int send_mpz(int fd, mpz_ptr mpz); static int send_cmo_distributed_polynomial(int fd, cmo_distributed_polynomial* c); - /* エラーハンドリングのため */ static int current_received_serial = 0; @@ -143,13 +144,12 @@ int send_ox_tag(int fd, int tag) return send_int32(fd, next_serial()); } - /* CMO_LIST 関係の関数群 */ -cell* new_cell(cmo* newcmo) +cell* new_cell() { cell* h = malloc(sizeof(cell)); h->next = NULL; - h->cmo = newcmo; + h->cmo = NULL; return h; } @@ -158,28 +158,28 @@ cell* next_cell(cell* this) return this->next; } -static cell* *tailp(cmo_list* this) { - cell **cp = &this->head; - while (*cp != NULL) { - cp = &((*cp)->next); +static cell *tail(cmo_list* this) { + cell *cp = this->head; + while (cp->next != NULL) { + cp = cp->next; } return cp; } -int length_cmo_list(cmo_list* this) -{ - return this->length; -} - int append_cmo_list(cmo_list* this, cmo* newcmo) { - /* リストの最後尾のNULLを保持している変数へのポインタ */ - cell **cp = tailp(this); - *cp = new_cell(newcmo); + cell *cp = tail(this); + cp->cmo = newcmo; + cp->next = new_cell(); this->length++; return 0; } +int length_cmo_list(cmo_list* this) +{ + return this->length; +} + /** receive_cmo_XXX 関数群 **/ static cmo_null* receive_cmo_null(int fd) { @@ -397,7 +397,7 @@ cmo_list* new_cmo_list() cmo_list* c = malloc(sizeof(cmo_list)); c->tag = CMO_LIST; c->length = 0; - c->head = NULL; + c->head->next = NULL; return c; } @@ -489,7 +489,7 @@ cmo_distributed_polynomial* new_cmo_distributed_polyno cmo_distributed_polynomial* c = malloc(sizeof(cmo_distributed_polynomial)); c->tag = CMO_DISTRIBUTED_POLYNOMIAL; c->length = 0; - c->head = NULL; + c->head->next = NULL; c->ringdef = NULL; return c; } @@ -511,7 +511,16 @@ void send_ox_command(int fd, int sm_command) int print_cmo(cmo* c) { int tag = c->tag; - fprintf(stderr, "local::tag = (%d): ", tag); + +#ifdef DEBUG + symbol* symp = lookup_by_tag(tag); + if (symp != NULL) { + fprintf(stderr, "local::tag = %s: ", symp->key); + }else { + fprintf(stderr, "local::tag = %d: ", tag); + } +#endif + switch(tag) { case CMO_LIST: print_cmo_list((cmo_list *)c); @@ -563,19 +572,20 @@ int print_cmo_string(cmo_string* c) void ox_close(ox_file_t sv) { send_ox_command(sv->control, SM_control_kill); -#if DEBUG +#ifdef DEBUG sleep(2); /* OpenXM server の終了を待つ. あまり意味はない. */ - fprintf(stderr, "I have closed an Open XM server.\n"); + fprintf(stderr, "I have closed the connection to an Open XM server.\n"); #endif } void ox_executeStringByLocalParser(ox_file_t sv, char* s) { - /* 文字列ををスタックにプッシュ. */ - send_ox_cmo(sv->stream, (cmo *)new_cmo_string(s)); - - /* サーバに実行させる. */ - send_ox_command(sv->stream, SM_executeStringByLocalParser); + if (s != NULL) { + /* 文字列ををスタックにプッシュ. */ + send_ox_cmo(sv->stream, (cmo *)new_cmo_string(s)); + /* サーバに実行させる. */ + send_ox_command(sv->stream, SM_executeStringByLocalParser); + } } /* ox_mathcap() をコールする. */ @@ -614,60 +624,118 @@ static char *create_otp() /* OneTimePassword の処理 */ static int login_with_otp(int fd, char* passwd) { - char buff[1024]; - int n = read(fd, buff, 1024); - int len = strlen(passwd)+1; - if (n != len) { + int len = strlen(passwd)+1; + char *buf = alloca(len); + int n = read(fd, buf, len); + int ret = strcmp(passwd, buf); + +#ifdef DEBUG + if (ret != 0) { fprintf(stderr, "Socket#%d: Login incorrect.\n", fd); - fprintf(stderr, "password = (%s), length = (%d).\n", passwd, len); - fprintf(stderr, "received = (%d), length = (%d).\n", buff, n); - fflush(stderr); - } + }else { + fprintf(stderr, "Socket#%d: login!.\n", fd); + } + fprintf(stderr, "password = (%s), %d bytes.\n", passwd, len); + fprintf(stderr, "received = (%s), %d bytes.\n", buf, n); + fflush(stderr); +#endif + + return ret; } -/* +static int exists_ox(char *dir, char *prog) +{ + char *path = alloca(strlen(dir)+strlen(prog)+6); + sprintf(path, "%s/%s", dir, prog); + return access(path, X_OK|R_OK); +} + +static char *search_ox(char *prog) +{ + char *env = getenv("OpenXM_HOME"); + char *dir; + if (env != NULL) { + dir = malloc(strlen(env)+5); + sprintf(dir, "%s/bin", env); + if (exists_ox(dir, prog) == 0) { + return dir; + } + free(dir); + } + dir = "/usr/local/OpenXM/bin"; + if (exists_ox(dir, prog) == 0) { + return dir; + } + dir = "."; + if (exists_ox(dir, prog) == 0) { + return dir; + } + return NULL; +} + +static int mysocketAccept2(int fd, char *pass) +{ + fd = mysocketAccept(fd); + if(login_with_otp(fd, pass)==0) { + decideByteOrderClient(fd, 0); + return fd; + } + close(fd); + return -1; +} + +/* (-reverse 版の ox_start) ox_start は クライアントが呼び出すための関数である. - サーバでは使われない. prog1 は コントロールサーバであり, + サーバでは使われない. ctl_prog は コントロールサーバであり, -ox, -reverse, -data, -control, -pass, -host - というオプションを理解することを仮定する. prog2 は計算サーバである. + というオプションを理解することを仮定する. dat_prog は計算サーバである. 接続時には, sv->control を先にオープンする. */ -ox_file_t ox_start(char* host, char* prog1, char* prog2) +ox_file_t ox_start(char* host, char* ctl_prog, char* dat_prog) { - char *pass = create_otp(); + char *pass; char ctl[16], dat[16]; short portControl = 0; /* short であることに注意 */ short portStream = 0; - ox_file_t sv = malloc(sizeof(__ox_file_struct)); + ox_file_t sv = NULL; + char *dir; + if ((dir = search_ox(ctl_prog)) == NULL) { + fprintf(stderr, "client:: %s not found.\n", ctl_prog); + return NULL; + } + sv = malloc(sizeof(__ox_file_struct)); sv->control = mysocketListen(host, &portControl); sv->stream = mysocketListen(host, &portStream); + sprintf(ctl, "%d", portControl); sprintf(dat, "%d", portStream); + pass = create_otp(); if (fork() == 0) { dup2(2, 1); dup2(open(DEFAULT_LOGFILE, O_RDWR|O_CREAT|O_TRUNC, 0644), 2); - execl(prog1, prog1, "-reverse", "-ox", prog2, + chdir(dir); + execl(ctl_prog, ctl_prog, "-reverse", "-ox", dat_prog, "-data", dat, "-control", ctl, "-pass", pass, "-host", host, NULL); } - sv->control = mysocketAccept(sv->control); - login_with_otp(sv->control, pass); - decideByteOrderClient(sv->control, 0); + if ((sv->control = mysocketAccept2(sv->control, pass)) == -1) { + close(sv->stream); + return NULL; + } /* 10マイクロ秒, 時間稼ぎする. */ usleep(10); - sv->stream = mysocketAccept(sv->stream); - login_with_otp(sv->stream, pass); - decideByteOrderClient(sv->stream, 0); - + if((sv->stream = mysocketAccept2(sv->stream, pass)) == -1) { + return NULL; + } return sv; } -/* +/* (-insecure 版の ox_start) まだ、中身はありません。 ox_start_insecure_nonreverse は クライアントが呼び出すための関数である. 接続時には, sv->control を先にオープンする. @@ -681,9 +749,14 @@ ox_file_t ox_start_insecure_nonreverse(char* host, sho ox_file_t sv = malloc(sizeof(__ox_file_struct)); sv->control = mysocketOpen(host, portControl); +#if 0 + /* ox は insecure のとき byte order の決定が正しくできないようだ... */ + decideByteOrderClient(sv->control, 0); +#endif /* 10マイクロ秒, 時間稼ぎする. */ usleep(10); sv->stream = mysocketOpen(host, portStream); + decideByteOrderClient(sv->stream, 0); return sv; } @@ -699,7 +772,7 @@ void ox_reset(ox_file_t sv) } send_ox_tag(sv->stream, OX_SYNC_BALL); -#if DEBUG +#ifdef DEBUG fprintf(stderr, "I have reset an Open XM server.\n"); #endif } @@ -731,10 +804,10 @@ static int cmolen_cmo_mathcap(cmo_mathcap* c) static int cmolen_cmo_list(cmo_list* c) { - int size = sizeof(c->head); + int size = sizeof(int); cell* cp = c->head; - while(cp != NULL) { + while(cp->next != NULL) { size += cmolen_cmo(cp->cmo); cp = cp->next; } @@ -777,6 +850,7 @@ int cmolen_cmo(cmo* c) break; case CMO_MATHCAP: case CMO_RING_BY_NAME: + case CMO_INDETERMINATE: case CMO_ERROR2: size += cmolen_cmo_mathcap((cmo_mathcap *)c); break; @@ -834,7 +908,7 @@ static int dump_cmo_list(cmo_list* m) int len = length_cmo_list(m); dump_integer(len); - while(cp != NULL) { + while(cp->next != NULL) { dump_cmo(cp->cmo); cp = cp->next; } @@ -886,6 +960,7 @@ int dump_cmo(cmo* m) break; case CMO_MATHCAP: case CMO_RING_BY_NAME: + case CMO_INDETERMINATE: case CMO_ERROR2: dump_cmo_mathcap((cmo_mathcap *)m); break; @@ -1001,7 +1076,7 @@ static int send_cmo_list(int fd, cmo_list* c) int len = length_cmo_list(c); send_int32(fd, len); - while(cp != NULL) { + while(cp->next != NULL) { send_cmo(fd, cp->cmo); cp = cp->next; } @@ -1015,7 +1090,7 @@ static int send_cmo_distributed_polynomial(int fd, cmo send_int32(fd, len); send_cmo(fd, c->ringdef); - while(cp != NULL) { + while(cp->next != NULL) { send_cmo(fd, cp->cmo); cp = cp->next; } @@ -1125,42 +1200,48 @@ static int known_types[] = { CMO_ERROR2, }; -#define ID_TEMP "(CMO_MATHCAP, (CMO_LIST, (CMO_LIST, (CMO_INT32, %d), (CMO_STRING, \"%s\"), (CMO_STRING, \"%s\"), (CMO_STRING, \"%s\")), (CMO_LIST, (CMO_INT32, 1), (CMO_INT32, 2), (CMO_INT32, 4), (CMO_INT32, 5), (CMO_INT32, 17), (CMO_INT32, 20), (CMO_INT32, 2130706434))))\n" +#define ID_TEMP "(CMO_LIST, (CMO_INT32, %d), (CMO_STRING, \"%s\"), (CMO_STRING, \"%s\"), (CMO_STRING, \"%s\"))" -cmo* make_mathcap_object2(int ver, char* ver_s, char* sysname) + +static cmo_list* make_list_of_id(int ver, char* ver_s, char* sysname) { - cmo *cap; - char buff[8192]; + cmo_list *cap; + char buff[512]; setgetc(mygetc); sprintf(buff, ID_TEMP, ver, sysname, ver_s, getenv("HOSTTYPE")); - setmode_mygetc(buff, 8192); + setmode_mygetc(buff, 512); cap = parse(); resetgetc(); return cap; } -cmo* make_mathcap_object(int version, char* id_string) +static cmo_list *make_list_of_tag(int type) { - cmo_list *li_ver, *li_cmo, *li; - - int i; - li_ver = new_cmo_list(); - append_cmo_list(li_ver, (cmo *)new_cmo_int32(version)); - append_cmo_list(li_ver, (cmo *)new_cmo_string(id_string)); + cmo_list *li = new_cmo_list(); + symbol *symp; + int i = 0; + while((symp = lookup(i++))->key != NULL) { + if (symp->type == type) { + append_cmo_list(li, (cmo *)new_cmo_int32(symp->tag)); + } + } + return li; +} - li_cmo = new_cmo_list(); - for(i=0; itag) { case CMO_ZZ: return convert_zz_to_string((cmo_zz *)m); @@ -1242,7 +1325,8 @@ char *convert_cmo_to_string(cmo *m) case CMO_NULL: return convert_null_to_string(); default: - fprintf(stderr, "sorry, not implemented CMO\n"); + symp = lookup_by_tag(m->tag); + fprintf(stderr, "I do not know how to convert %s to a string.\n", symp->key); /* まだ実装していません. */ return NULL; }