Annotation of OpenXM/src/kan96xx/plugin/Old/oxmisc2.c, Revision 1.1.1.1
1.1 maekawa 1: #include <stdio.h>
2: #include "ox_kan.h"
3: #include "oxmisc2.h" /* This file requires sm1 object description. */
4: extern FILE *MyErrorOut;
5:
6: int oxGet(oxclientp client, struct object *op,int *isObj)
7: /* This method should be synchronized. */
8: /* oxGet is a function for client. */
9: {
10: int ans;
11: ox_stream os;
12: int m;
13: struct object rob;
14: *isObj = 0;
15: op->tag = Snull;
16: os = client->datafp2;
17: switch(client->dstate) {
18: case DSTATE_ANY:
19: m = oxGetInt32(os);
20: switch(m) {
21: case OX_DATA:
22: client->dstate = DSTATE_WAIT_OX_DATA;
23: return(oxGet(client,op,isObj));
24: case OX_SYNC_BALL:
25: client->dstate = DSTATE_ANY;
26: return(OX_SYNC_BALL);
27: default:
28: errorOxmisc2("oxGet: cannot handle this tag.\n");
29: client->dstate = DSTATE_ERROR;
30: return(-1);
31: }
32: break;
33: case DSTATE_FIRST_SYNC: /* waiting the first sync ball */
34: /* I need to clear the buffer?? */
35: oxWaitSyncBall(os);
36: client->dstate = DSTATE_ANY;
37: oxSendSyncBall(os);
38: return(OX_SYNC_BALL);
39: break;
40: case DSTATE_WAIT_OX_DATA: /* waiting a cmo data. */
41: *op = cmoObjectFromStream2(client->datafp2);
42: client->dstate = DSTATE_ANY;
43: *isObj = 1;
44: return(0);
45: break;
46: case DSTATE_ERROR:
47: client->dstate = DSTATE_ERROR;
48: errorOxmisc2("oxGet: dstate == DSTATE_ERROR (error state)\n");
49: return(-1);
50: default:
51: client->dstate = DSTATE_ERROR;
52: errorOxmisc2("oxGet: Unknown state number.");
53: }
54:
55: return(-1);
56: }
57:
58: int oxGetFromControl(oxclientp client)
59: {
60: int ans = -1;
61: if (client->cstate != -1) {
62: ans = oxGetResultOfControlInt32(client->controlfd);
63: if (ans != -1) { client->cstate = 0; }
64: else {client->cstate = -1; }
65: }
66: return(ans);
67: }
68:
69: int oxReq(oxclientp client,int func,struct object ob)
70: {
71: /* request to the control channel */
72: if (func == SM_control_reset_connection ||
73: func == SM_control_kill) {
74: switch(func) {
75: case SM_control_reset_connection:
76: oxReqControlResetConnection(client->controlfd);
77: client->cstate = 1;
78: client->dstate = DSTATE_FIRST_SYNC;
79: break;
80: case SM_control_kill:
81: oxReqControlKill(client->controlfd);
82: client->cstate = 0;
83: client->dstate = DSTATE_ANY;
84: break;
85: }
86: fflush(NULL);
87: return(0);
88: }
89:
90: /* request to the data channel */
91: if (client->dstate != DSTATE_ANY) {
92: errorOxmisc2("oxReq: client->dstate != DSTATE_ANY, data channel is not ready to send data.\n");
93: return(-1);
94: }
95: switch(func) {
96: case SM_DUMMY_sendcmo:
97: oxSendInt32(client->datafp2,OX_DATA);
98: cmoObjectToStream2(ob,client->datafp2);
99: client->dstate = DSTATE_ANY;
100: break;
101: case SM_sync_ball:
102: oxSendSyncBall(client->datafp2);
103: client->dstate = DSTATE_ANY; /* We do not expect the sync ball.*/
104: client->cstate = 0; /* clear the cstate */
105: break;
106: case SM_popCMO:
107: oxReqPopCMO(client->datafp2);
108: client->dstate = DSTATE_ANY;
109: break;
110: case SM_mathcap:
111: oxReqMathCap(client->datafp2);
112: client->dstate = DSTATE_ANY;
113: break;
114: case SM_pops:
115: if (ob.tag != Sinteger) {
116: errorOxmisc2("SM_pops : the argument must be an integer.");
117: return(-1);
118: }
119: oxReqPops(client->datafp2, KopInteger(ob));
120: client->dstate = DSTATE_ANY;
121: break;
122: case SM_executeStringByLocalParser:
123: if (ob.tag != Sdollar) {
124: errorOxmisc2("SM_executeStringByLocalParser : the argument must be a string.");
125: return(-1);
126: }
127: oxReqExecuteStringByLocalParser(client->datafp2,KopString(ob));
128: client->dstate = DSTATE_ANY;
129: break;
130: case SM_executeFunction:
131: if (ob.tag != Sdollar) {
132: errorOxmisc2("SM_executeFunction : the argument must be a string.");
133: return(-1);
134: }
135: oxReqExecuteFunction(client->datafp2,KopString(ob));
136: client->dstate = DSTATE_ANY;
137: break;
138: case SM_popString:
139: oxReqPopString(client->datafp2);
140: client->dstate = DSTATE_ANY;
141: break;
142: case SM_evalName:
143: if (ob.tag != Sdollar) {
144: errorOxmisc2("SM_evalName : the argument must be a string.");
145: return(-1);
146: }
147: oxReqEvalName(client->datafp2,KopString(ob));
148: client->dstate = DSTATE_ANY;
149: break;
150: case SM_setName:
151: if (ob.tag != Sdollar) {
152: errorOxmisc2("SM_setName : the argument must be a string.");
153: return(-1);
154: }
155: oxReqSetName(client->datafp2,KopString(ob));
156: client->dstate = DSTATE_ANY;
157: break;
158: default:
159: fprintf(MyErrorOut,"func=%d ",func);
160: errorOxmisc2("This function is not implemented.");
161: break;
162: }
163: fp2fflush(client->datafp2);
164: return(0);
165: }
166:
167: struct object KoxCreateClient(struct object ip,
168: struct object portStream,
169: struct object portControl)
170: {
171: struct object rob;
172: oxclientp client;
173: rob.tag = Snull;
174: if (ip.tag != Sdollar) {
175: errorOxmisc2("KoxCreateClient(): The first argument must be a hostname given by a string.");
176: return(rob);
177: }
178: if (portStream.tag == Sdollar) {
179: client = oxCreateClientFile(KopString(ip),KopString(portStream),
180: "/dev/null","w");
181: if (client == NULL) {
182: errorOxmisc2("KoxCreateClient(): Open error.");
183: return(rob);
184: }
185: rob = newObjectArray(N_OF_CLIENT_FIELDS);
186: oxClientToObject(client,rob);
187: return(rob);
188: }
189:
190: if (portStream.tag != Sinteger) {
191: errorOxmisc2("KoxCreateClient(): The second argument must be a port number given in an integer.");
192: return(rob);
193: }
194: if (portControl.tag != Sinteger) {
195: errorOxmisc2("KoxCreateClient(): The third argument must be a port number given in an integer.");
196: return(rob);
197: }
198: client = oxCreateClient(KopString(ip),KopInteger(portStream),KopInteger(portControl));
199: if (client == NULL) {
200: errorOxmisc2("KoxCreateClient(): Open error.");
201: return(rob);
202: }
203: rob = newObjectArray(N_OF_CLIENT_FIELDS);
204: oxClientToObject(client,rob);
205: return(rob);
206: }
207:
208: static int isItClientObject(struct object ob)
209: {
210: int size,i;
211: struct object ee[N_OF_CLIENT_FIELDS];
212: if (ob.tag != Sarray) {
213: return(0);
214: }
215: size = getoaSize(ob);
216: if (size != N_OF_CLIENT_FIELDS) return(0);
217: for (i=0; i<N_OF_CLIENT_FIELDS; i++) {
218: ee[i] = getoa(ob,i);
219: }
220:
221: if (ee[0].tag != Sdollar) return(0);
222: if (strcmp(KopString(ee[0]),"client")!=0) return(0);
223:
224: if (ee[1].tag != Sfile) return(0);
225: if (strcmp((ee[1]).lc.str,MAGIC2) != 0) return(0);
226:
227: for (i=2; i<N_OF_CLIENT_FIELDS; i++) {
228: if (ee[i].tag != Sinteger) return(0);
229: }
230: return(1);
231: }
232:
233:
234: struct object KoxIsThereErrorClient(struct object ob)
235: {
236: struct object rob;
237: int ans;
238: int size;
239: oxclient cc;
240: rob.tag = Snull;
241: if (!isItClientObject(ob)) {
242: errorOxmisc2("KoxIsThereErrorClient(): the argument must be an array for client object.");
243: return(rob);
244: }
245: if (oxObjectToClient(ob,&cc) == -1) return(KpoInteger(-1));
246: ans = oxIsThereErrorClient(&cc);
247: return(KpoInteger(ans));
248: }
249:
250: int oxClientToObject(oxclientp client,struct object rob)
251: {
252: struct object ob;
253: if (client == NULL) return;
254: /* rob = newObjectArray(N_OF_CLIENT_FIELDS); */
255: if (rob.tag != Sarray) {
256: errorOxmisc2("oxClientToObject(): the second argument must be an array.");
257: return(-1);
258: }
259: if (getoaSize(rob) != N_OF_CLIENT_FIELDS) {
260: errorOxmisc2("oxClientToObject(): the second argument must be an array of size N_OF_CLIENT_FIELDS.");
261: return(-1);
262: }
263:
264: ob = KpoString("client");
265: putoa(rob,0,ob);
266:
267: ob.tag = Sfile; ob.lc.str = MAGIC2; ob.rc.voidp = (void *)(client->datafp2);
268: putoa(rob,1,ob);
269:
270: putoa(rob,2,KpoInteger(client->dataport));
271: putoa(rob,3,KpoInteger(client->controlfd));
272: putoa(rob,4,KpoInteger(client->controlport));
273: putoa(rob,5,KpoInteger(client->dstate));
274: putoa(rob,6,KpoInteger(client->cstate));
275: putoa(rob,7,KpoInteger(client->humanio));
276: putoa(rob,8,KpoInteger(client->id));
277: putoa(rob,9,KpoInteger(client->type));
278: return(0);
279: }
280:
281: int oxObjectToClient(struct object ob,oxclientp cp)
282: {
283: struct object ob1;
284: if (cp == NULL) {
285: errorOxmisc2("oxObjectToClient(): the second argument is NULL");
286: return(-1);
287: }
288: if (!isItClientObject(ob)) {
289: errorOxmisc2("oxObjectToClient(): the first argument is not client object.");
290: oxInitClient(cp);
291: return(-1);
292: }
293:
294: ob1 = getoa(ob,1);
295: cp->datafp2 = (FILE2 *) (ob1.rc.voidp);
296:
297: ob1 = getoa(ob,2);
298: cp->dataport = KopInteger(ob1);
299:
300: ob1 = getoa(ob,3);
301: cp->controlfd = KopInteger(ob1);
302:
303: ob1 = getoa(ob,4);
304: cp->controlport = KopInteger(ob1);
305:
306: ob1 = getoa(ob,5);
307: cp->dstate = KopInteger(ob1);
308:
309: ob1 = getoa(ob,6);
310: cp->cstate = KopInteger(ob1);
311:
312: ob1 = getoa(ob,7);
313: cp->humanio = KopInteger(ob1);
314:
315: ob1 = getoa(ob,8);
316: cp->id = KopInteger(ob1);
317:
318: ob1 = getoa(ob,9);
319: cp->type = KopInteger(ob1);
320:
321: return(0);
322: }
323:
324: struct object KoxReq(struct object client,
325: struct object func,
326: struct object ob1)
327: {
328: int ans;
329: static oxclientp cc1 = NULL;
330: struct object rob;
331: rob.tag = Snull;
332: if (cc1 == NULL) {
333: cc1 = (oxclientp) mymalloc(sizeof(oxclient));
334: if (cc1 == NULL) {
335: errorOxmisc2("KoxReq(): no more memory.");
336: return(rob);
337: }
338: oxInitClient(cc1);
339: }
340:
341: if (oxObjectToClient(client,cc1) == -1) return(rob);
342: if (cc1 == NULL) {
343: errorOxmisc2("KoxReq(): the first argument must be a client object.");
344: return(rob);
345: }
346: if (func.tag != Sinteger) {
347: errorOxmisc2("KoxReq(): the second argument must be an integer.");
348: return(rob);
349: }
350: ans = oxReq(cc1,KopInteger(func),ob1);
351: /* synchronize cc1 and client. */
352: oxClientToObject(cc1,client);
353:
354: return(KpoInteger(ans));
355: }
356:
357: struct object KoxGet(struct object client)
358: {
359: int ans,k;
360: static oxclientp cc1 = NULL;
361: struct object rob;
362: rob.tag = Snull;
363: if (cc1 == NULL) {
364: cc1 = (oxclientp) mymalloc(sizeof(oxclient));
365: if (cc1 == NULL) {
366: errorOxmisc2("KoxGet(): no more memory.");
367: return(rob);
368: }
369: oxInitClient(cc1);
370: }
371:
372: if (oxObjectToClient(client,cc1) == -1) return(rob);
373: if (cc1 == NULL) {
374: errorOxmisc2("KoxGet(): the first argument must be a client object.");
375: return(rob);
376: }
377:
378: ans = oxGet(cc1,&rob,&k);
379: /* synchronize cc1 and client. */
380: oxClientToObject(cc1,client);
381:
382: if (k) return(rob);
383: else {
384: return(KpoInteger(ans));
385: }
386: }
387:
388: struct object KoxGetFromControl(struct object client)
389: {
390: int ans;
391: static oxclientp cc1 = NULL;
392: struct object rob;
393: rob.tag = Snull;
394: if (cc1 == NULL) {
395: cc1 = (oxclientp) mymalloc(sizeof(oxclient));
396: if (cc1 == NULL) {
397: errorOxmisc2("KoxGetFromControl(): no more memory.");
398: return(rob);
399: }
400: oxInitClient(cc1);
401: }
402:
403: if (oxObjectToClient(client,cc1) == -1) return(rob);
404: if (cc1 == NULL) {
405: errorOxmisc2("KoxGetFromControl(): the first argument must be a client object.");
406: return(rob);
407: }
408:
409: ans = oxGetFromControl(cc1);
410: /* synchronize cc1 and client. */
411: oxClientToObject(cc1,client);
412:
413: return(KpoInteger(ans));
414: }
415:
416: struct object KoxMultiSelect(struct object oclients,struct object t)
417: {
418: static int first = 1;
419: static int csize = 0;
420: static oxclientp *clients = NULL;
421: oxclientp cc1;
422: struct object rob;
423: int i;
424: int tt;
425: struct object ob1;
426: struct object ob2;
427: struct object ob0;
428: int size;
429: int ans;
430: int dataready[1024];
431: int controlready[1024];
432:
433: rob.tag = Snull;
434: if (oclients.tag != Sarray) {
435: errorOxmisc2("KoxMultiSelect(): the first argument must be an array.");
436: return(rob);
437: }
438: size = getoaSize(oclients);
439: if (first) {
440: first = 0; csize = size;
441: clients = (oxclientp *)mymalloc(sizeof(oxclientp)*(size+1));
442: if (clients == NULL) {
443: errorOxmisc2("KoxMultiSelect(): no more memory.");
444: return(rob);
445: }
446: for (i=0; i<size; i++) {
447: clients[i] = (oxclientp) mymalloc(sizeof(oxclient));
448: if (clients[i] == NULL) {
449: errorOxmisc2("KoxMultiSelect(): no more memory.");
450: return(rob);
451: }
452: oxInitClient(clients[i]);
453: }
454: }
455: if (csize < size) {
456: first = 1;
457: return(KoxMultiSelect(oclients,t));
458: }
459: for (i=0; i<size; i++) {
460: ob0 = getoa(oclients,i);
461: if (oxObjectToClient(ob0,clients[i]) == -1) return(rob);
462: }
463: if (t.tag != Sinteger) {
464: errorOxmisc2("KoxMultiSelect(): the second argument must be an integer.");
465: }
466: tt = KopInteger(t);
467: ans = oxclientMultiSelect(clients,dataready,controlready,size,tt);
468: /* synchronize oclients and clients. */
469: for (i=0; i<size; i++) {
470: ob0 = getoa(oclients,i);
471: oxClientToObject(clients[i],ob0);
472: putoa(oclients,i,ob0);
473: }
474: rob = newObjectArray(3);
475: putoa(rob,0,KpoInteger(ans));
476: ob1 = newObjectArray(size);
477: ob2 = newObjectArray(size);
478: for (i=0; i<size; i++) {
479: putoa(ob1,i,KpoInteger(dataready[i]));
480: putoa(ob2,i,KpoInteger(controlready[i]));
481: }
482: putoa(rob,1,ob1);
483: putoa(rob,2,ob2);
484: return(rob);
485: }
486:
487: struct object KoxWatch(struct object client,struct object f)
488: /* f is not used for now. It should be log file. */
489: {
490: int ans,k;
491: static oxclientp cc1 = NULL;
492: struct object rob;
493: rob.tag = Snull;
494: if (cc1 == NULL) {
495: cc1 = (oxclientp) mymalloc(sizeof(oxclient));
496: if (cc1 == NULL) {
497: errorOxmisc2("KoxWatch(): no more memory.");
498: return(rob);
499: }
500: oxInitClient(cc1);
501: }
502:
503: if (oxObjectToClient(client,cc1) == -1) return(rob);
504: if (cc1 == NULL) {
505: errorOxmisc2("KoxWatch(): the first argument must be a client object.");
506: return(rob);
507: }
508:
509: k = fp2watch(cc1->datafp2,stdout);
510: /* synchronize cc1 and client. */
511: oxClientToObject(cc1,client);
512:
513: return(KpoInteger(ans));
514: }
515:
516:
517: struct object KoxCloseClient(struct object client) {
518: oxclientp cc1 = NULL;
519: oxclient cc;
520: struct object rob;
521: rob.tag = Snull;
522: cc1 = &cc;
523: if (oxObjectToClient(client,cc1) == -1) return(rob);
524: if (cc1 == NULL) {
525: errorOxmisc2("KoxCloseClient(): the first argument must be a client object.");
526: return(rob);
527: }
528:
529: fp2fflush(cc1->datafp2);
530: if (cc1->humanio) {
531: /* Do not close the file. */
532: return(KpoInteger(0));
533: }
534: switch (cc1->type) {
535: case CLIENT_SOCKET:
536: fp2fclose(cc1->datafp2);
537: close(cc1->controlfd);
538: break;
539: case CLIENT_FILE:
540: fp2fclose(cc1->datafp2);
541: close(cc1->controlfd);
542: break;
543: default:
544: errorOxmisc2("Unknown client->type\n");
545: break;
546: }
547: return(KpoInteger(0));
548:
549: }
550:
551:
552: errorOxmisc2(char *s) {
553: fprintf(MyErrorOut,"error in oxmisc2.c: %s\n",s);
554: return;
555: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>