Annotation of OpenXM_contrib2/asir2000/io/tcpf.c, Revision 1.1.1.1
1.1 noro 1: /* $OpenXM: OpenXM/src/asir99/io/tcpf.c,v 1.8 1999/11/19 10:41:08 noro Exp $ */
2: #if INET
3: #include "ca.h"
4: #include "parse.h"
5: #include "com.h"
6: #include <signal.h>
7: #if !defined(VISUAL)
8: #include <sys/types.h>
9: #include <pwd.h>
10: #endif
11: #include "ox.h"
12:
13: #if defined(VISUAL)
14: #include <winsock.h>
15: #endif
16:
17: #define OX_XTERM "ox_xterm"
18:
19: #if !defined(_PA_RISC1_1)
20: #define RSH "rsh"
21: #else
22: #define RSH "remsh"
23: #endif
24:
25: static struct m_c {
26: int m,c,af_unix;
27: } *m_c_tab;
28:
29: static int m_c_i,m_c_s;
30:
31: #if MPI
32: extern int mpi_nprocs;
33: #define valid_mctab_index(ind)\
34: if((ind)<0||(ind)>=(mpi_nprocs-1)){error("invalid server id");}
35: #else
36: #define valid_mctab_index(ind)\
37: if((ind)<0||(ind)>=m_c_i||\
38: (!m_c_tab[ind].m&&!m_c_tab[ind].c)){error("invalid server id");}
39: #endif
40:
41: int register_server();
42: int get_mcindex(int);
43:
44: void Pox_launch(),Pox_launch_nox(),Pox_launch_main();
45: void Pox_launch_generic();
46: void Pox_shutdown();
47:
48: void Pox_rpc(),Pox_cmo_rpc(),Pox_reset(),Pox_sync(),Pox_select();
49:
50: void Pox_push_local(),Pox_push_cmo(),Pox_push_vl(),Pox_push_cmd();
51:
52: void Pox_pop_local(),Pox_pop_cmo();
53: void Pox_pop0_local(),Pox_pop0_cmo();
54: void Pox_pop_string(),Pox_pop0_string();
55: void Pox_get(),Pox_pops();
56:
57: void Pox_execute_function(),Pox_execute_string();
58: void Pox_setname(), Pox_evalname();
59: void Pox_flush();
60: void Pgenerate_port(),Ptry_bind_listen(),Ptry_connect(),Ptry_accept();
61: void Pregister_server();
62: void Pox_get_serverinfo();
63:
64: void ox_launch_generic();
65:
66: pointer bevalf();
67:
68: struct ftab tcp_tab[] = {
69: {"ox_get_serverinfo",Pox_get_serverinfo,-1},
70: {"generate_port",Pgenerate_port,-1},
71: {"try_bind_listen",Ptry_bind_listen,1},
72: {"try_connect",Ptry_connect,2},
73: {"try_accept",Ptry_accept,2},
74: {"register_server",Pregister_server,4},
75: {"ox_flush",Pox_flush,1},
76: {"ox_launch",Pox_launch,-3},
77: {"ox_launch_nox",Pox_launch_nox,-3},
78: {"ox_launch_generic",Pox_launch_generic,7},
79: {"ox_shutdown",Pox_shutdown,1},
80:
81: {"ox_rpc",Pox_rpc,-99999999},
82: {"ox_cmo_rpc",Pox_cmo_rpc,-99999999},
83:
84: {"ox_sync",Pox_sync,1},
85: #if !MPI
86: {"ox_reset",Pox_reset,-2},
87: {"ox_select",Pox_select,-2},
88: #endif
89:
90: {"ox_pop_string",Pox_pop_string,1},
91: {"ox_pop0_string",Pox_pop0_string,1},
92: {"ox_pop_local",Pox_pop_local,1},
93: {"ox_pop0_local",Pox_pop0_local,1},
94: {"ox_pop_cmo",Pox_pop_cmo,1},
95: {"ox_pop0_cmo",Pox_pop0_cmo,1},
96: {"ox_get",Pox_get,1},
97: {"ox_pops",Pox_pops,-2},
98:
99: {"ox_push_vl",Pox_push_vl,1},
100: {"ox_push_local",Pox_push_local,-99999999},
101: {"ox_push_cmo",Pox_push_cmo,-99999999},
102: {"ox_push_cmd",Pox_push_cmd,2},
103:
104: {"ox_setname",Pox_setname,2},
105: {"ox_evalname",Pox_evalname,2},
106:
107: {"ox_execute_string",Pox_execute_string,2},
108: {"ox_execute_function",Pox_execute_function,3},
109:
110:
111: {0,0,0},
112: };
113:
114: extern struct IOFP iofp[];
115: extern MATHCAP my_mathcap;
116:
117: char *getenv();
118:
119: void Pox_get_serverinfo(arg,rp)
120: NODE arg;
121: LIST *rp;
122: {
123: int i,c;
124: Q sid;
125: NODE t,n0,n;
126: LIST list,l;
127:
128: if ( !arg ) {
129: for ( i = 0, n0 = 0; i < m_c_i; i++ )
130: if ( m_c_tab[i].m || m_c_tab[i].c ) {
131: c = m_c_tab[i].c;
132: ox_get_serverinfo(c,&list);
133: STOQ(i,sid);
134: t = mknode(2,sid,list);
135: MKLIST(l,t);
136: NEXTNODE(n0,n);
137: BDY(n) = (pointer)l;
138: }
139: if ( n0 )
140: NEXT(n) = 0;
141: MKLIST(*rp,n0);
142: } else {
143: i = QTOS((Q)ARG0(arg));
144: if ( i >= 0 && i < m_c_i && (m_c_tab[i].m || m_c_tab[i].c) )
145: ox_get_serverinfo(m_c_tab[i].c,rp);
146: else {
147: MKLIST(*rp,0);
148: }
149: }
150: }
151:
152: /*
153: if noarg or arg[0]==0 then use IP socket and return a port number
154: else use UNIX socket and return a string which represents a path name
155: */
156:
157: void Pgenerate_port(arg,rp)
158: NODE arg;
159: Obj *rp;
160: {
161: char port_str[BUFSIZ];
162: int port;
163: char *s;
164: STRING str;
165: Q q;
166:
167: if ( !arg || !ARG0(arg) ) {
168: generate_port(0,port_str);
169: port = atoi(port_str);
170: STOQ(port,q);
171: *rp = (Obj)q;
172: } else {
173: generate_port(1,port_str);
174: s = (char *)MALLOC(strlen(port_str)+1);
175: strcpy(s,port_str);
176: MKSTR(str,s);
177: *rp = (Obj)str;
178: }
179: }
180:
181: /*
182: try_bind_listen(port)
183: */
184:
185: void Ptry_bind_listen(arg,rp)
186: NODE arg;
187: Q *rp;
188: {
189: char port_str[BUFSIZ];
190: int port,s,use_unix;
191:
192: if ( !ARG0(arg) || NUM(ARG0(arg)) ) {
193: port = QTOS((Q)ARG0(arg));
194: sprintf(port_str,"%d",port);
195: use_unix = 0;
196: } else {
197: strcpy(port_str,BDY((STRING)ARG0(arg)));
198: use_unix = 1;
199: }
200: s = try_bind_listen(use_unix,port_str);
201: STOQ(s,*rp);
202: }
203:
204: /*
205: try_connect(host,port)
206: */
207:
208: void Ptry_connect(arg,rp)
209: NODE arg;
210: Q *rp;
211: {
212: char port_str[BUFSIZ];
213: char *host;
214: int port,s,use_unix;
215:
216: if ( !ARG1(arg) || NUM(ARG1(arg)) ) {
217: port = QTOS((Q)ARG1(arg));
218: sprintf(port_str,"%d",port);
219: use_unix = 0;
220: } else {
221: strcpy(port_str,BDY((STRING)ARG1(arg)));
222: use_unix = 1;
223: }
224: host = BDY((STRING)ARG0(arg));
225: s = try_connect(use_unix,host,port_str);
226: STOQ(s,*rp);
227: }
228:
229: /*
230: try_accept(sock,port)
231: */
232:
233: void Ptry_accept(arg,rp)
234: NODE arg;
235: Q *rp;
236: {
237: int use_unix,s;
238:
239: if ( !ARG1(arg) || NUM(ARG1(arg)) )
240: use_unix = 0;
241: else
242: use_unix = 1;
243: s = try_accept(use_unix,QTOS((Q)ARG0(arg)));
244: STOQ(s,*rp);
245: }
246:
247: /*
248: register_server(cs,cport,ss,sport)
249: */
250:
251: void Pregister_server(arg,rp)
252: NODE arg;
253: Q *rp;
254: {
255: int cs,ss,cn,sn,ind,use_unix,id;
256: char cport_str[BUFSIZ],sport_str[BUFSIZ];
257: MATHCAP server_mathcap;
258:
259: cs = QTOS((Q)ARG0(arg));
260: ss = QTOS((Q)ARG2(arg));
261: if ( !ARG1(arg) || NUM(ARG1(arg)) ) {
262: sprintf(cport_str,"%d",QTOS((Q)ARG1(arg)));
263: use_unix = 0;
264: } else {
265: strcpy(cport_str,BDY((STRING)ARG1(arg)));
266: use_unix = 1;
267: }
268: if ( !ARG3(arg) || NUM(ARG3(arg)) ) {
269: if ( use_unix )
270: error("register_server : the protocol should conincide for two sockets");
271: sprintf(sport_str,"%d",QTOS((Q)ARG3(arg)));
272: } else {
273: if ( !use_unix )
274: error("register_server : the protocol should conincide for two sockets");
275: strcpy(sport_str,BDY((STRING)ARG3(arg)));
276: }
277:
278: /* client mode */
279: cn = get_iofp(cs,cport_str,0);
280: sn = get_iofp(ss,sport_str,0);
281:
282: /* register server to the server list */
283: ind = register_server(use_unix,cn,sn);
284:
285: /* request remote mathcap */
286: ox_send_cmd(sn,SM_mathcap);
287: ox_send_cmd(sn,SM_popCMO);
288: ox_flush_stream_force(sn);
289: ox_recv(sn,&id,&server_mathcap);
290: store_remote_mathcap(sn,server_mathcap);
291:
292: /* send my mathcap */
293: create_my_mathcap("asir");
294: ox_send_data(sn,my_mathcap);
295: ox_send_cmd(sn,SM_setMathcap);
296:
297: /* return the server id */
298: STOQ(ind,*rp);
299: }
300:
301: /*
302: ox_launch_generic(host,launcher,server,use_unix,use_ssh,use_x,conn_to_serv)
303:
304: Input
305: host: hostname on which servers run
306: launcher: path name of the launcher
307: server: path name of the server
308: use_unix: use UNIX domain socket if 1
309: use_ssh: use ssh if 1
310: use_x: use X11 facilities if 1
311: conn_to_serv: connect to server if 1
312: */
313:
314: void Pox_launch_generic(arg,rp)
315: NODE arg;
316: Q *rp;
317: {
318: int use_unix,use_ssh,use_x,conn_to_serv;
319: char *host,*launcher,*server;
320:
321: host = (arg&&ARG0(arg))?BDY((STRING)ARG0(arg)):0;
322: launcher = BDY((STRING)ARG1(arg));
323: server = BDY((STRING)ARG2(arg));
324: use_unix = ARG3(arg) ? 1 : 0;
325: use_ssh = ARG4(arg) ? 1 : 0;
326: use_x = ARG5(arg) ? 1 : 0;
327: conn_to_serv = QTOS((Q)ARG6(arg));
328: if ( !host )
329: use_unix = 1;
330: ox_launch_generic(host,launcher,server,
331: use_unix,use_ssh,use_x,conn_to_serv,rp);
332: }
333:
334: void ox_launch_generic(host,launcher,server,
335: use_unix,use_ssh,use_x,conn_to_serv,rp)
336: char *host,*launcher,*server;
337: int use_unix,use_ssh,use_x,conn_to_serv;
338: Q *rp;
339: {
340: int cs,ss,cn,sn,ind,id;
341: char control_port_str[BUFSIZ];
342: char server_port_str[BUFSIZ];
343: MATHCAP server_mathcap;
344:
345: control_port_str[0] = 0;
346: server_port_str[0] = 0;
347: do {
348: generate_port(use_unix,control_port_str);
349: generate_port(use_unix,server_port_str);
350: if ( !conn_to_serv ) {
351: cs = try_bind_listen(use_unix,control_port_str);
352: ss = try_bind_listen(use_unix,server_port_str);
353: }
354: spawn_server(host,launcher,server,
355: use_unix,use_ssh,use_x,conn_to_serv,
356: control_port_str,server_port_str);
357: if ( conn_to_serv ) {
358: cs = try_connect(use_unix,host,control_port_str);
359: ss = try_connect(use_unix,host,server_port_str);
360: } else {
361: cs = try_accept(use_unix,cs);
362: ss = try_accept(use_unix,ss);
363: }
364: } while ( cs < 0 || ss < 0 );
365:
366: /* client mode */
367: cn = get_iofp(cs,control_port_str,0);
368: sn = get_iofp(ss,server_port_str,0);
369:
370: /* register server to the server list */
371: ind = register_server(use_unix,cn,sn);
372:
373: /* request remote mathcap */
374: ox_send_cmd(sn,SM_mathcap);
375: ox_send_cmd(sn,SM_popCMO);
376: ox_flush_stream_force(sn);
377: ox_recv(sn,&id,&server_mathcap);
378: store_remote_mathcap(sn,server_mathcap);
379:
380: /* send my mathcap */
381: create_my_mathcap("asir");
382: ox_send_data(sn,my_mathcap);
383: ox_send_cmd(sn,SM_setMathcap);
384:
385: /* return the server id */
386: STOQ(ind,*rp);
387: }
388:
389: int spawn_server(host,launcher,server,
390: use_unix,use_ssh,use_x,conn_to_serv,
391: control_port_str,server_port_str)
392: char *host,*launcher,*server;
393: int use_unix,use_ssh,use_x,conn_to_serv;
394: char *control_port_str,*server_port_str;
395: {
396: char cmd[BUFSIZ];
397: char localhost[BUFSIZ];
398: char *dname,*conn_str,*rsh;
399:
400: dname = use_x ? (char *)getenv("DISPLAY") : 0;
401: conn_str = conn_to_serv ? "1" : "0";
402: rsh = use_ssh ? "ssh" : RSH;
403: gethostname(localhost,BUFSIZ);
404: if ( use_unix ) {
405: if ( !fork() ) {
406: if ( dname )
407: execlp("xterm","xterm","-name",OX_XTERM,"-display",dname,
408: "-geometry","60x10","-e",launcher,".",conn_str,
409: control_port_str,server_port_str,server,dname,0);
410: else
411: execlp(launcher,launcher,".",conn_str,
412: control_port_str,server_port_str,server,"0",0);
413: }
414: } else if ( conn_to_serv == 2 ) {
415: /* special support for java */
416: if ( dname )
417: sprintf(cmd,
418: "%s -n %s \"(cd %s; xterm -name %s -display %s -geometry 60x10 -e java %s -host %s -control %s -data %s)>&/dev/null&\">/dev/null",
419: rsh,host,launcher,OX_XTERM,dname,server,localhost,control_port_str,server_port_str);
420: else
421: sprintf(cmd,
422: "%s -n %s \"(cd %s; java %s -host %s -control %s -data %s)>&/dev/null&\">/dev/null",
423: rsh,host,launcher,server,localhost,
424: control_port_str,server_port_str,server);
425: fprintf(stderr,"%s\n",cmd);
426: sleep(20);
427: /* system(cmd); */
428: } else {
429: if ( dname )
430: sprintf(cmd,
431: "%s -n %s \"xterm -name %s -display %s -geometry 60x10 -e %s %s %s %s %s %s %s>&/dev/null&\">/dev/null",
432: rsh,host,OX_XTERM,dname,launcher,localhost,conn_str,
433: control_port_str,server_port_str,server,dname);
434: else
435: sprintf(cmd,
436: "%s -n %s \"%s %s %s %s %s %s %s>&/dev/null&\">/dev/null",
437: rsh,host,launcher,localhost,conn_str,
438: control_port_str,server_port_str,server,"0");
439: system(cmd);
440: }
441: }
442:
443: void Pox_launch(arg,rp)
444: NODE arg;
445: Obj *rp;
446: {
447: Pox_launch_main(1,arg,rp);
448: }
449:
450: void Pox_launch_nox(arg,rp)
451: NODE arg;
452: Obj *rp;
453: {
454: Pox_launch_main(0,arg,rp);
455: }
456:
457: /*
458: ox_launch() : invoke local ox_asir
459: ox_launch(0,ox_xxx) : invoke local ox_xxx with asir_libdir/ox_launch
460: ox_launch(remote,lib,ox_xxx) : invoke remote ox_xxx with lib/ox_launch
461: */
462:
463: void Pox_launch_main(with_x,arg,rp)
464: int with_x;
465: NODE arg;
466: Obj *rp;
467: {
468: char *str;
469: char *hostname,*servername,*dname;
470: char *control;
471: int use_unix;
472: extern char *asir_libdir;
473:
474: if ( arg && ARG0(arg) && argc(arg) != 3 )
475: error("ox_launch : argument mismatch");
476: control = (char *)MALLOC(BUFSIZ);
477: if ( !arg || ( !ARG0(arg) && argc(arg) == 1 ) ) {
478: sprintf(control,"%s/ox_launch",asir_libdir);
479: use_unix = 1;
480: servername = (char *)MALLOC(BUFSIZ);
481: sprintf(servername,"%s/ox_asir",asir_libdir);
482: } else if ( !ARG0(arg) && argc(arg) == 2 ) {
483: sprintf(control,"%s/ox_launch",asir_libdir);
484: use_unix = 1;
485: str = BDY((STRING)ARG1(arg));
486: if ( str[0] == '/' )
487: servername = str;
488: else {
489: servername = (char *)MALLOC(BUFSIZ);
490: sprintf(servername,"%s/%s",asir_libdir,str);
491: }
492: } else {
493: sprintf(control,"%s/ox_launch",BDY((STRING)ARG1(arg)));
494: if ( !ARG0(arg) )
495: use_unix = 1;
496: else
497: use_unix = 0;
498: str = BDY((STRING)ARG2(arg));
499: if ( str[0] == '/' )
500: servername = str;
501: else {
502: servername = (char *)MALLOC(BUFSIZ);
503: sprintf(servername,"%s/%s",BDY((STRING)ARG1(arg)),str);
504: }
505: }
506: if ( arg && ARG0(arg) )
507: hostname = BDY((STRING)ARG0(arg));
508: else
509: hostname = 0;
510: ox_launch_generic(hostname,control,servername,use_unix,0,with_x,0,rp);
511: }
512:
513: int register_server(af_unix,m,c)
514: int af_unix,m,c;
515: {
516: int s,i,ci;
517: struct m_c *t;
518:
519: if ( c < 0 )
520: return -1;
521: if ( !m_c_tab ) {
522: s = BUFSIZ*sizeof(struct m_c);
523: m_c_tab = (struct m_c *)MALLOC_ATOMIC(s); bzero(m_c_tab,s);
524: m_c_s = BUFSIZ;
525: }
526: #if !MPI
527: for ( i = 0; i < m_c_i; i++ )
528: if ( !m_c_tab[i].m && !m_c_tab[i].c )
529: break;
530: if ( i < m_c_i ) {
531: m_c_tab[i].m = m; m_c_tab[i].c = c;
532: m_c_tab[i].af_unix = af_unix;
533: return i;
534: }
535: #endif
536: if ( m_c_i == m_c_s ) {
537: s = (m_c_s+BUFSIZ)*sizeof(struct m_c);
538: t = (struct m_c *)MALLOC_ATOMIC(s); bzero(m_c_tab,s);
539: bcopy(m_c_tab,t,m_c_s*sizeof(struct m_c));
540: m_c_s += BUFSIZ; m_c_tab = t;
541: }
542: m_c_tab[m_c_i].m = m; m_c_tab[m_c_i].c = c;
543: m_c_tab[m_c_i].af_unix = af_unix;
544: return m_c_i++;
545: }
546:
547: /* iofp index => m_c_tab index */
548:
549: int get_mcindex(i)
550: int i;
551: {
552: int j;
553:
554: for ( j = 0; j < m_c_i; j++ )
555: if ( m_c_tab[j].c == i )
556: return j;
557: return -1;
558: }
559:
560: /* arg = [ind0,ind1,...]; indk = index to m_c_tab */
561:
562: void Pox_select(arg,rp)
563: NODE arg;
564: LIST *rp;
565: {
566: int fd,n,i,index,mcind;
567: fd_set r,w,e;
568: NODE list,t,t1;
569: Q q;
570: double max;
571: struct timeval interval;
572: struct timeval *tvp;
573:
574: list = BDY((LIST)ARG0(arg)); arg = NEXT(arg);
575: if ( arg ) {
576: max = ToReal((Num)BDY(arg));
577: interval.tv_sec = (int)max;
578: interval.tv_usec = (int)((max-(int)max)*1000000);
579: tvp = &interval;
580: } else
581: tvp = 0;
582:
583: FD_ZERO(&r); FD_ZERO(&w); FD_ZERO(&e);
584: for ( t = list; t; t = NEXT(t) ) {
585: index = QTOS((Q)BDY(t));
586: valid_mctab_index(index);
587: fd = get_fd(m_c_tab[index].c); FD_SET(fd,&r);
588: }
589: n = select(FD_SETSIZE,&r,&w,&e,tvp);
590: for ( i = 0, t = 0; n && i < FD_SETSIZE; i++ )
591: if ( FD_ISSET(i,&r) ) {
592: /* index : index to iofp array */
593: index = get_index(i);
594: /* mcind : index to m_c_tab array */
595: mcind = get_mcindex(index);
596: n--; STOQ(mcind,q); MKNODE(t1,q,t); t = t1;
597: }
598: MKLIST(*rp,t);
599: }
600:
601: void Pox_flush(arg,rp)
602: NODE arg;
603: Q *rp;
604: {
605: int index = QTOS((Q)ARG0(arg));
606:
607: valid_mctab_index(index);
608: ox_flush_stream_force(m_c_tab[index].c);
609: *rp = ONE;
610: }
611:
612: void Pox_push_local(arg,rp)
613: NODE arg;
614: Obj *rp;
615: {
616: int s;
617: struct oLIST dummy;
618: VL vl;
619: int index = QTOS((Q)ARG0(arg));
620:
621: valid_mctab_index(index);
622: s = m_c_tab[index].c; arg = NEXT(arg);
623:
624: dummy.id = O_LIST; dummy.body = arg;
625: get_vars_recursive((Obj)&dummy,&vl);
626:
627: ox_send_local_ring(s,vl);
628: for ( ; arg; arg = NEXT(arg) )
629: ox_send_local_data(s,BDY(arg));
630: *rp = 0;
631: }
632:
633: void Pox_push_cmo(arg,rp)
634: NODE arg;
635: Obj *rp;
636: {
637: int s;
638: int index = QTOS((Q)ARG0(arg));
639:
640: valid_mctab_index(index);
641: s = m_c_tab[index].c; arg = NEXT(arg);
642: for ( ; arg; arg = NEXT(arg) )
643: ox_send_data(s,BDY(arg));
644: *rp = 0;
645: }
646:
647: void Pox_push_vl(arg,rp)
648: NODE arg;
649: Obj *rp;
650: {
651: int s;
652: int index = QTOS((Q)ARG0(arg));
653:
654: valid_mctab_index(index);
655: ox_send_local_ring(m_c_tab[index].c,CO);
656: *rp = 0;
657: }
658:
659: void Pox_pop_local(arg,rp)
660: NODE arg;
661: Obj *rp;
662: {
663: int s;
664: int index = QTOS((Q)ARG0(arg));
665:
666: valid_mctab_index(index);
667: s = m_c_tab[index].c;
668: ox_send_cmd(s,SM_popSerializedLocalObject);
669: ox_flush_stream_force(s);
670: ox_get_result(s,rp);
671: }
672:
673: void Pox_pop_cmo(arg,rp)
674: NODE arg;
675: Obj *rp;
676: {
677: int s;
678: int index = QTOS((Q)ARG0(arg));
679:
680: valid_mctab_index(index);
681: s = m_c_tab[index].c;
682: ox_send_cmd(s,SM_popCMO);
683: ox_flush_stream_force(s);
684: ox_get_result(s,rp);
685: }
686:
687: void Pox_pop0_local(arg,rp)
688: NODE arg;
689: Obj *rp;
690: {
691: int index = QTOS((Q)ARG0(arg));
692:
693: valid_mctab_index(index);
694: ox_send_cmd(m_c_tab[index].c,SM_popSerializedLocalObject);
695: *rp = 0;
696: }
697:
698: void Pox_pop0_cmo(arg,rp)
699: NODE arg;
700: Obj *rp;
701: {
702: int index = QTOS((Q)ARG0(arg));
703:
704: valid_mctab_index(index);
705: ox_send_cmd(m_c_tab[index].c,SM_popCMO);
706: *rp = 0;
707: }
708:
709: void Pox_pop0_string(arg,rp)
710: NODE arg;
711: STRING *rp;
712: {
713: int index = QTOS((Q)ARG0(arg));
714:
715: valid_mctab_index(index);
716: ox_send_cmd(m_c_tab[index].c,SM_popString);
717: *rp = 0;
718: }
719:
720: void Pox_pop_string(arg,rp)
721: NODE arg;
722: STRING *rp;
723: {
724: int s,id;
725: int index = QTOS((Q)ARG0(arg));
726:
727: valid_mctab_index(index);
728: s = m_c_tab[index].c;
729: ox_send_cmd(s,SM_popString);
730: ox_flush_stream_force(s);
731: ox_get_result(s,rp);
732: }
733:
734: void Pox_get(arg,rp)
735: NODE arg;
736: Obj *rp;
737: {
738: int index = QTOS((Q)ARG0(arg));
739: int s;
740:
741: valid_mctab_index(index);
742: s = m_c_tab[index].c;
743: ox_flush_stream_force(s);
744: ox_get_result(s,rp);
745: }
746:
747: void Pox_pops(arg,rp)
748: NODE arg;
749: Obj *rp;
750: {
751: int s;
752: USINT n;
753: int index = QTOS((Q)ARG0(arg));
754:
755: valid_mctab_index(index);
756: s = m_c_tab[index].c;
757: if ( NEXT(arg) )
758: MKUSINT(n,QTOS((Q)ARG1(arg)));
759: else
760: MKUSINT(n,1);
761: ox_send_data(s,n);
762: ox_send_cmd(s,SM_pops);
763: *rp = 0;
764: }
765:
766: void Pox_execute_function(arg,rp)
767: NODE arg;
768: Obj *rp;
769: {
770: int s;
771: USINT ui;
772: int index = QTOS((Q)ARG0(arg));
773:
774: valid_mctab_index(index);
775: s = m_c_tab[index].c;
776: MKUSINT(ui,QTOS((Q)ARG2(arg)));
777: ox_send_data(s,ui);
778: ox_send_data(s,ARG1(arg));
779: ox_send_cmd(s,SM_executeFunction);
780: *rp = 0;
781: }
782:
783: void Pox_setname(arg,rp)
784: NODE arg;
785: Obj *rp;
786: {
787: int s;
788: int index = QTOS((Q)ARG0(arg));
789:
790: valid_mctab_index(index);
791: s = m_c_tab[index].c;
792: ox_send_data(s,ARG1(arg));
793: ox_send_cmd(s,SM_setName);
794: *rp = 0;
795: }
796:
797: void Pox_evalname(arg,rp)
798: NODE arg;
799: Obj *rp;
800: {
801: int s;
802: int index = QTOS((Q)ARG0(arg));
803:
804: valid_mctab_index(index);
805: s = m_c_tab[index].c;
806: ox_send_data(s,ARG1(arg));
807: ox_send_cmd(s,SM_evalName);
808: *rp = 0;
809: }
810:
811: void Pox_execute_string(arg,rp)
812: NODE arg;
813: Obj *rp;
814: {
815: int s;
816: int index = QTOS((Q)ARG0(arg));
817:
818: valid_mctab_index(index);
819: s = m_c_tab[index].c;
820: ox_send_data(s,ARG1(arg));
821: ox_send_cmd(s,SM_executeStringByLocalParser);
822: *rp = 0;
823: }
824:
825: /* arg=[sid,fname,arg0,arg1,...,arg{n-1}] */
826:
827: void Pox_rpc(arg,rp)
828: NODE arg;
829: Obj *rp;
830: {
831: int s,i,n;
832: STRING f;
833: USINT ui;
834: pointer *w;
835: NODE t;
836: int index = QTOS((Q)ARG0(arg));
837:
838: valid_mctab_index(index);
839: s = m_c_tab[index].c; arg = NEXT(arg);
840: f = (STRING)BDY(arg); arg = NEXT(arg);
841: ox_send_local_ring(s,CO);
842: for ( n = 0, t = arg; t; t = NEXT(t), n++ );
843: w = (pointer *)ALLOCA(n*sizeof(pointer));
844: for ( i = 0, t = arg; i < n; t = NEXT(t), i++ )
845: w[i] = BDY(t);
846: for ( i = n-1; i >= 0; i-- )
847: ox_send_local_data(s,w[i]);
848: MKUSINT(ui,n);
849: ox_send_data(s,ui);
850: ox_send_data(s,f);
851: ox_send_cmd(s,SM_executeFunction);
852: *rp = 0;
853: }
854:
855: void Pox_cmo_rpc(arg,rp)
856: NODE arg;
857: Obj *rp;
858: {
859: int s,i,n;
860: STRING f;
861: USINT ui;
862: NODE t;
863: pointer *w;
864: int index = QTOS((Q)ARG0(arg));
865:
866: valid_mctab_index(index);
867: s = m_c_tab[index].c; arg = NEXT(arg);
868: f = (STRING)BDY(arg); arg = NEXT(arg);
869: for ( n = 0, t = arg; t; t = NEXT(t), n++ );
870: w = (pointer *)ALLOCA(n*sizeof(pointer));
871: for ( i = 0, t = arg; i < n; t = NEXT(t), i++ )
872: w[i] = BDY(t);
873: for ( i = n-1; i >= 0; i-- )
874: ox_send_data(s,w[i]);
875: MKUSINT(ui,n);
876: ox_send_data(s,ui);
877: ox_send_data(s,f);
878: ox_send_cmd(s,SM_executeFunction);
879: *rp = 0;
880: }
881:
882: void Pox_reset(arg,rp)
883: NODE arg;
884: Q *rp;
885: {
886: USINT t;
887: int s,id,c,m;
888: Obj obj;
889: int index = QTOS((Q)ARG0(arg));
890:
891: valid_mctab_index(index);
892: m = m_c_tab[index].m;
893: c = m_c_tab[index].c;
894: if ( m >= 0 ) {
895: if ( argc(arg) == 1 ) {
896: ox_send_cmd(m,SM_control_reset_connection);
897: ox_flush_stream_force(m);
898: ox_recv(m,&id,&t);
899: }
900: *rp = ONE;
901: #if defined(VISUAL)
902: Sleep(100);
903: ox_send_cmd(c,SM_nop);
904: ox_flush_stream_force(c);
905: #endif
906: while ( 1 ) {
907: ox_recv(c,&id,&obj);
908: if ( id == OX_SYNC_BALL )
909: break;
910: }
911: ox_send_sync(c);
912: } else
913: *rp = 0;
914: }
915:
916: void Pox_sync(arg,rp)
917: NODE arg;
918: Q *rp;
919: {
920: int c;
921: int index = QTOS((Q)ARG0(arg));
922:
923: valid_mctab_index(index);
924: c = m_c_tab[index].c;
925: ox_send_sync(c);
926: *rp = 0;
927: }
928:
929: void Pox_shutdown(arg,rp)
930: NODE arg;
931: Q *rp;
932: {
933: int s;
934: int index = QTOS((Q)ARG0(arg));
935: int status;
936:
937: valid_mctab_index(index);
938: s = m_c_tab[index].m;
939: ox_send_cmd(s,SM_shutdown);
940: free_iofp(s);
941: #if !MPI && !defined(VISUAL)
942: if ( m_c_tab[index].af_unix )
943: wait(&status);
944: #endif
945: m_c_tab[index].m = 0; m_c_tab[index].c = 0;
946: m_c_tab[index].af_unix = 0;
947: *rp = 0;
948: }
949:
950: void Pox_push_cmd(arg,rp)
951: NODE arg;
952: Q *rp;
953: {
954: unsigned int ui;
955: int index = QTOS((Q)ARG0(arg));
956:
957: valid_mctab_index(index);
958: ui = (unsigned int)QTOS((Q)ARG1(arg));
959: ox_send_cmd(m_c_tab[index].c,ui);
960: *rp = 0;
961: }
962: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>