Annotation of OpenXM/src/kan96xx/plugin/oxmisc.c, Revision 1.1.1.1
1.1 maekawa 1: #include <stdio.h>
2: #include <sys/types.h>
3: #include <sys/stat.h>
4: #include <sys/socket.h>
5: #include <sys/time.h>
6: #include <netinet/in.h>
7: #include <netdb.h>
8: #include <fcntl.h>
9: #include <stdlib.h>
10: #include <unistd.h>
11: #include <signal.h>
12: #include <setjmp.h>
13: FILE *MyErrorOut = stdout;
14:
15: /* Include files to understand object */
16: #include "../Kan/datatype.h"
17: #include "../Kan/stackm.h"
18: #include "../Kan/extern.h"
19:
20: #include "ox_kan.h"
21:
22: #define READBUFSIZE 5000
23:
24: int OxVersion = 199909080;
25: int UseOXPacketSerial = 1;
26: int SerialOX = 1;
27: extern int Quiet;
28:
29: static char *OxPortFileName = ".ox.dummy";
30:
31:
32: int readOneByte(int fd) /* blocking */
33: {
34: static char data[1];
35: int size;
36: int ans;
37: int watch = 1;
38:
39: if (fd < 0) {
40: fprintf(MyErrorOut,"readOneByte fd < 0 ??? .\n");
41: return(-1);
42: }
43:
44: if (oxSocketSelect0(fd,-1)) { /* block */
45: size = read(fd,data,1);
46: if (size == 0) {
47: fprintf(MyErrorOut,"oxSocketSelect0() returns 1, but there is no data. You peer may be killed.\n");
48: return(-1);
49: }
50: return(data[0]);
51: }else{
52: fprintf(MyErrorOut,"readOneByte: select error in block mode. Retrying.\n");
53: return(-1);
54: }
55: }
56:
57: int readOneByte_org(int fd) /* blocking */
58: {
59: static char data[READBUFSIZE];
60: static int thisFd = -1;
61: static int from = 0;
62: static int to = 0;
63: int size;
64: int ans;
65: int watch = 1;
66:
67: if ((thisFd == -1) && (fd >= 0)) {thisFd = fd;}
68: if (fd < 0) {
69: fprintf(MyErrorOut,"readOneByte fd < 0 ??? .\n");
70: return(-1);
71: }
72:
73: if (fd != thisFd) {
74: fprintf(MyErrorOut,"readOneByte can be used only for one fd.\n");
75: fflush(NULL);
76: return(-1);
77: }
78: if (to > from) {
79: ans = data[from];
80: from++;
81: if (watch) {
82: printf("%2x ",ans);
83: fflush(stdout);
84: }
85: return(ans);
86: }
87:
88: while (1) {
89: if (oxSocketSelect0(fd,-1)) { /* block */
90: size = read(fd,data,READBUFSIZE-1);
91: if (size == 0) {
92: fprintf(MyErrorOut,"oxSocketSelect0() returns 1, but there is no data. You peer may be killed.\n");
93: return(-1);
94: }
95: from = 0;
96: to = size;
97: return(readOneByte(fd));
98: }else{
99: fprintf(MyErrorOut,"readOneByte: select error in block mode. Retrying.\n"); }
100: }
101: }
102:
103: int oxfdGetInt32(int fd)
104: {
105: char d[4];
106: int i;
107: for (i=0; i<4; i++) {
108: d[i] = readOneByte(fd);
109: }
110: return(ntohl(* ( (int *)d)));
111: }
112:
113: int oxGetInt32(ox_stream ostream)
114: {
115: char d[4];
116: int i;
117: for (i=0; i<4; i++) {
118: d[i] = fp2fgetc(ostream);
119: }
120: return(ntohl(* ( (int *)d)));
121: }
122: int oxGetCMOInt32(ox_stream ostream)
123: {
124: int id;
125: id = oxGetInt32(ostream);
126: if (id != CMO_INT32) {
127: fprintf(MyErrorOut,"It is not CMO_INT32.\n");
128: return(0);
129: }
130: return(oxGetInt32(ostream));
131: }
132: char *oxGetCMOString(ox_stream ostream) {
133: int id;
134: int size;
135: char *r;
136: int i;
137: id = oxGetInt32(ostream);
138: if (id != CMO_STRING) {
139: fprintf(MyErrorOut,"It is not CMO_STRING.\n");
140: return(NULL);
141: }
142: size = oxGetInt32(ostream);
143: if (size <0) {
144: return(NULL);
145: }else{
146: r = (char *)mymalloc(size+1);
147: for (i=0; i<size; i++) {
148: r[i] = fp2fgetc(ostream);
149: }
150: r[size] = '\0';
151: return(r);
152: }
153: }
154:
155: void oxfdSendSyncBall(int fd)
156: {
157: oxfdSendOXheader(fd,OX_SYNC_BALL,SerialOX++);
158: }
159:
160: void oxSendSyncBall(ox_stream os)
161: {
162: oxSendOXheader(os,OX_SYNC_BALL,SerialOX++);
163: }
164:
165: int oxWaitSyncBall(ox_stream ostream)
166: {
167: int sss;
168: int mtag;
169: while ((mtag = oxGetOXheader(ostream,&sss)) != OX_SYNC_BALL) {
170: fprintf(stderr,"Looking for the next message tag. mtag=%d\n",mtag);
171: /* or stdout */
172: fflush(NULL);
173: }
174: }
175:
176: int oxWaitSyncBall_org(ox_stream ostream)
177: {
178: int mtag;
179: char data[4];
180: int c;
181: data[0] = data[1] = data[2] = data[3] = 0xff;
182: while (1) {
183: /* This part should be revised so that this part understands
184: the cmo format.
185: */
186:
187: if ((c = fp2fgetc(ostream)) < 0) {
188: /* never use read directory. readOneByte() is buffers every thing. */
189: fprintf(MyErrorOut,"End of file.\n");
190: return(-1);
191: }
192: data[0] = data[1];
193: data[1] = data[2];
194: data[2] = data[3];
195: data[3] = (char)c;
196: mtag = ntohl(*((int *)(data)));
197: if (mtag == OX_SYNC_BALL) {
198: printf("Found the OX_SYNC_BALL. \n");
199: fflush(NULL);
200: return(mtag);
201: }
202: fprintf(stderr,"Looking for the next message tag.. %2x, mtag=%d\n",c,mtag);
203: /* or stdout */
204: fflush(NULL);
205: }
206: }
207:
208:
209: void oxfdSendCmoNull(int fd)
210: {
211: char data[4];
212: *((int *)&data[0]) = htonl(CMO_NULL);
213: write(fd,data,4);
214: fflush((FILE *)NULL);
215: }
216: void oxSendCmoNull(ox_stream os)
217: {
218: char data[4];
219: *((int *)&data[0]) = htonl(CMO_NULL);
220: fp2write(os,data,4);
221: fp2fflush(os);
222: }
223:
224: void oxSendCmoError(ox_stream os)
225: {
226: char data[4];
227: *((int *)&data[0]) = htonl(CMO_ERROR);
228: fp2write(os,data,4);
229: fp2fflush(os);
230: }
231:
232: void oxSendCmoError2(ox_stream os,char *s)
233: {
234: char data[4];
235: *((int *)&data[0]) = htonl(CMO_ERROR2);
236: fp2write(os,data,4);
237: fp2fflush(os);
238: oxSendCmoString(os,s);
239: }
240:
241: void oxfdSendInt32(int fd,int k)
242: {
243: char data[4];
244: *((int *)&data[0]) = htonl(k);
245: write(fd,data,4);
246: fflush((FILE *)NULL);
247: }
248: void oxSendInt32(ox_stream os,int k)
249: {
250: char data[4];
251: *((int *)&data[0]) = htonl(k);
252: fp2write(os,data,4);
253: fp2fflush(os);
254: }
255:
256: void oxfdSendCmoInt32(int fd,int k)
257: {
258: char data[4*2];
259: *((int *)&data[0]) = htonl(CMO_INT32);
260: *((int *)&data[4]) = htonl(k);
261: write(fd,data,4*2);
262: fflush((FILE *)NULL);
263: }
264: void oxSendCmoInt32(ox_stream os,int k)
265: {
266: char data[4*2];
267: *((int *)&data[0]) = htonl(CMO_INT32);
268: *((int *)&data[4]) = htonl(k);
269: fp2write(os,data,4*2);
270: fp2fflush(os);
271: }
272: void oxfdSendCmoString(int fd,char *s)
273: {
274: char data[4*2];
275: int n;
276: if (s == NULL) n = 0;
277: else {
278: n = strlen(s);
279: }
280: *((int *)&data[0]) = htonl(CMO_STRING);
281: *((int *)&data[4]) = htonl(n);
282: write(fd,data,4*2);
283: if (s != NULL) {
284: write(fd,s,n);
285: }
286: fflush((FILE *)NULL);
287: }
288:
289: void oxSendCmoString(ox_stream os,char *s)
290: {
291: char data[4*2];
292: int n;
293: if (s == NULL) n = 0;
294: else {
295: n = strlen(s);
296: }
297: *((int *)&data[0]) = htonl(CMO_STRING);
298: *((int *)&data[4]) = htonl(n);
299: fp2write(os,data,4*2);
300: if (s != NULL) {
301: fp2write(os,s,n);
302: }
303: fp2fflush(os);
304: }
305:
306:
307:
308: void oxReqPushString(ox_stream os, char *s)
309: {
310: oxSendOXheader(os,OX_DATA,SerialOX++);
311: oxSendCmoString(os,s);
312: }
313:
314: void oxSendResultOfControlInt32(int fd,int i)
315: {
316: char data[4*2];
317: oxfdSendOXheader(fd,OX_DATA,SerialOX++);
318: *((int *)&data[0]) = htonl(CMO_INT32);
319: *((int *)&data[4]) = htonl(i);
320: write(fd,data,4*2);
321: fflush((FILE *)NULL);
322: }
323:
324: void oxSendResultOfControl(int fd)
325: {
326: char data[4*1];
327: oxfdSendOXheader(fd,OX_DATA,SerialOX++);
328: *((int *)&data[0]) = htonl(CMO_NULL);
329: write(fd,data,4*1);
330: fflush((FILE *)NULL);
331: }
332:
333:
334:
335: void oxSendMathCap(ox_stream os,struct mathCap *mathcap)
336: {
337: int i,n,infosize;
338: struct object mathinfo;
339: /* printf("ox sending mathcap\n"); fflush(stdout); */
340: mathinfo = *((struct object *)(mathcap->infop));
341: infosize = getoaSize(mathinfo);
342:
343: oxSendInt32(os,CMO_MATHCAP);
344:
345: oxSendInt32(os,CMO_LIST);
346: oxSendInt32(os,3);
347:
348: /* [0] */
349: oxSendInt32(os,CMO_LIST);
350: oxSendInt32(os,infosize);
351: oxSendCmoInt32(os,KopInteger(getoa(mathinfo,0)));
352: for (i=1; i<infosize; i++) {
353: oxSendCmoString(os,KopString(getoa(mathinfo,i)));
354: }
355:
356: /* [1] */
357: oxSendInt32(os,CMO_LIST);
358: oxSendInt32(os,mathcap->smSize);
359: n = mathcap->smSize;
360: for (i=0; i<n; i++) {
361: oxSendCmoInt32(os,(mathcap->sm)[i]);
362: }
363:
364: /* [2] */
365: oxSendInt32(os,CMO_LIST);
366: oxSendInt32(os,2);
367:
368: /* first element */
369: oxSendInt32(os,CMO_LIST);
370: oxSendInt32(os,mathcap->oxSize);
371: n = mathcap->oxSize;
372: for (i=0; i<n; i++) {
373: oxSendCmoInt32(os,(mathcap->ox)[i]);
374: }
375: /* second element */
376: oxSendInt32(os,CMO_LIST);
377: oxSendInt32(os,mathcap->n);
378: n = mathcap->n;
379: for (i=0; i<n; i++) {
380: oxSendCmoInt32(os,(mathcap->cmo)[i]);
381: /* printf("i=%d %d, ",i,(mathcap->cmo)[i]); */
382: }
383: /* printf("\n"); fflush(stdout); */
384: }
385:
386: void oxReqMathCap(ox_stream os) {
387: oxSendOXheader(os,OX_COMMAND,SerialOX++);
388: oxSendInt32(os,SM_mathcap);
389: fp2fflush(os);
390: }
391:
392: void oxReqSetMathCap(ox_stream os,struct mathCap *mathcap) {
393: oxSendOXheader(os,OX_DATA,SerialOX++);
394: oxSendMathCap(os,mathcap);
395: oxSendOXheader(os,OX_COMMAND,SerialOX++);
396: oxSendInt32(os,SM_setMathCap);
397: fp2fflush(os);
398: }
399: void oxReqPops(ox_stream os,int n) {
400: oxSendOXheader(os,OX_DATA,SerialOX++);
401: oxSendCmoInt32(os,n);
402: oxSendOXheader(os,OX_COMMAND,SerialOX++);
403: oxSendInt32(os,SM_pops);
404: fp2fflush(os);
405: }
406: void oxReqSetName(ox_stream os,char *s) {
407: oxSendOXheader(os,OX_DATA,SerialOX++);
408: oxSendCmoString(os,s);
409: oxSendOXheader(os,OX_COMMAND,SerialOX++);
410: oxSendInt32(os,SM_setName);
411: fp2fflush(os);
412: }
413: void oxReqEvalName(ox_stream os,char *s) {
414: oxSendOXheader(os,OX_DATA,SerialOX++);
415: oxSendCmoString(os,s);
416: oxSendOXheader(os,OX_COMMAND,SerialOX++);
417: oxSendInt32(os,SM_evalName);
418: fp2fflush(os);
419: }
420:
421: void oxReqExecuteStringByLocalParser(ox_stream os,char *s)
422: {
423: oxSendOXheader(os,OX_DATA,SerialOX++);
424: oxSendCmoString(os,s);
425: oxSendOXheader(os,OX_COMMAND,SerialOX++);
426: oxSendInt32(os,SM_executeStringByLocalParser);
427: fp2fflush(os);
428: }
429:
430: void oxReqExecuteFunction(ox_stream os,char *s)
431: {
432: oxSendOXheader(os,OX_DATA,SerialOX++);
433: oxSendCmoString(os,s);
434: oxSendOXheader(os,OX_COMMAND,SerialOX++);
435: oxSendInt32(os,SM_executeFunction);
436: fp2fflush(os);
437: }
438:
439:
440: void oxReqPopString(ox_stream os)
441: {
442: oxSendOXheader(os,OX_COMMAND,SerialOX++);
443: oxSendInt32(os,SM_popString);
444: fp2fflush(os);
445: }
446:
447: void oxReqSingleOperand(ox_stream os,int smtag)
448: {
449: oxSendOXheader(os,OX_COMMAND,SerialOX++);
450: oxSendInt32(os,smtag);
451: fp2fflush(os);
452: }
453:
454:
455: void oxReqControlResetConnection(int fd) {
456: oxfdSendOXheader(fd,OX_COMMAND,SerialOX++);
457: oxfdSendInt32(fd,SM_control_reset_connection);
458: fflush(NULL);
459: }
460:
461: void oxReqControlKill(int fd) {
462: oxfdSendOXheader(fd,OX_COMMAND,SerialOX++);
463: oxfdSendInt32(fd,SM_control_kill);
464: fflush(NULL);
465: }
466:
467: void oxReqPopCMO(ox_stream os) {
468: oxSendOXheader(os,OX_COMMAND,SerialOX++);
469: oxSendInt32(os,SM_popCMO);
470: fp2fflush(os);
471: }
472:
473:
474: int oxGetResultOfControlInt32(int fd) {
475: int k; int sss;
476: k = oxfdGetOXheader(fd,&sss);
477: if (k != OX_DATA) {
478: fprintf(MyErrorOut,"oxGetResultOfControlInt32: wrong header.");
479: return(-1);
480: }
481: k = oxfdGetInt32(fd); /* CMO_INT32 */
482: k = oxfdGetInt32(fd);
483: return(k);
484: }
485:
486: int oxclientMultiSelect(oxclientp clients[],int dataready[],
487: int controlready[], int size, int t)
488: {
489: int i, ddd;
490: int fd;
491: int humanfd = 0;
492: fd_set readfds;
493: struct timeval timeout;
494: extern int errno;
495:
496: /** printf("(1)"); fflush(NULL); */
497: FD_ZERO(&readfds);
498: timeout.tv_sec = 0;
499: timeout.tv_usec = (long) t;
500:
501: ddd = 0; fd = 0;
502: for (i=0; i<size; i++) {
503: dataready[i] = controlready[i] = 0;
504: }
505: for (i=0; i<size; i++) {
506: if (clients[i]->humanio) {
507: fd = (fd<humanfd?humanfd:fd);
508: FD_SET(humanfd,&readfds);
509: if (oxSocketSelect0(humanfd,0)) {
510: ddd = dataready[i] = 1; controlready[i] = 0;
511: }else{
512: dataready[i] = 0; controlready[i] = 0;
513: }
514: }else{
515: fd = (fd<clients[i]->controlfd?clients[i]->controlfd:fd);
516: FD_SET(clients[i]->controlfd,&readfds);
517: if (oxSocketSelect0(clients[i]->controlfd,0)) {
518: ddd = controlready[i] = 1;
519: }else{
520: controlready[i] = 0;
521: }
522: if (clients[i]->datafp2 != NULL) {
523: fd = (fd<clients[i]->datafp2->fd?clients[i]->datafp2->fd:fd);
524: FD_SET(clients[i]->datafp2->fd,&readfds);
525: if (fp2select(clients[i]->datafp2,0)) {
526: ddd = dataready[i] = 1;
527: }else{
528: dataready[i] = 0;
529: }
530: }else{
531: dataready[i] = 0;
532: }
533: }
534: }
535: if (t > 0 ) {
536: if (ddd) return(1);
537: if (select(fd+1,&readfds,(fd_set *)NULL,(fd_set *)NULL,&timeout)<0) {
538: fprintf(MyErrorOut,"error");
539: return(-1);
540: }
541: return(oxclientMultiSelect(clients, dataready, controlready,size,0));
542: }else if (t == 0) {
543: return(ddd);
544: }else {
545: /** printf("(2)"); fflush(NULL); */
546: if (select(fd+1,&readfds,(fd_set *)NULL,(fd_set *)NULL,(struct timeval *)NULL)<0) {
547: fprintf(MyErrorOut,"error");
548: return(-1);
549: }
550: /** printf("(3)"); fflush(NULL); */
551: return(oxclientMultiSelect(clients, dataready, controlready,size,0));
552: }
553: }
554:
555: int oxGetControl(oxclientp client)
556: /* synchronized. */
557: {
558: int ans;
559: ox_stream os;
560: switch (client->cstate) {
561: case 1:
562: ans = oxGetResultOfControlInt32(client->controlfd);
563: client->cstate = 0;
564: return(ans);
565: default:
566: fprintf(MyErrorOut,"oxGet: unknown cstate.\n");
567: client->cstate = -1;
568: return(-1);
569: }
570:
571: return(-1);
572: }
573:
574: int oxInitClient(oxclientp client)
575: {
576: client->datafp2 = NULL;
577: client->dataport = 0;
578: client->controlport = 0;
579: client->controlfd = 0;
580: client->humanio = 0;
581: client->dstate = 0;
582: client->cstate = 0;
583: client->id = -1;
584: client->mathcapObjp = NULL;
585: client->controlByteOrder = OX_BYTE_NETWORK_BYTE_ORDER;
586: client->engineByteOrder = OX_BYTE_NETWORK_BYTE_ORDER;
587: return(0);
588: }
589:
590: int oxIsThereErrorClient(oxclientp client) {
591: if (client == NULL) return(1);
592: if (client->dstate == -1) return(1);
593: if (client->cstate == -1) return(1);
594: return(0);
595: }
596:
597: oxclientp oxCreateClient(char *sname,int portStream,int portControl)
598: /* you also need to change oxCreateClient2. */
599: {
600: static int clnum = 0;
601: int v = 0;
602: int fdControl = -1;
603: int fdStream = -1;
604: oxclientp client;
605: int controlByteOrder, engineByteOrder;
606: v = !Quiet;
607: if (portControl != -1) {
608: fdControl = socketConnect(sname,portControl);
609: if (v) fprintf(stderr,"\nControl port %d : Connected.\n",portControl);
610: }
611: if (portStream != -1) {
612: sleep(1); /* wait */
613: fdStream = socketConnect(sname,portStream);
614: if (v) fprintf(stderr,"\nStream port %d : Connected.\n",portStream);
615: }
616:
617: if (fdStream == -1 || fdControl == -1) {
618: fprintf(stderr,"\nOpen error in oxCreateClient.\n");
619: return(NULL);
620: }
621:
622: controlByteOrder = oxSetByteOrder(fdControl);
623: if (v) fprintf(stderr,"Byte order for control process is %s.\n",
624: (controlByteOrder == 0? "network byte order":
625: (controlByteOrder == 1? "little indican":
626: "big indian")));
627: engineByteOrder = oxSetByteOrder(fdStream);
628: if (v) fprintf(stderr,"Byte order for engine process is %s.\n",
629: (engineByteOrder == 0? "network byte order":
630: (engineByteOrder == 1? "little indican":
631: "big indian")));
632:
633: client = (oxclientp) mymalloc(sizeof(oxclient));
634: oxInitClient(client);
635: client->datafp2 = fp2open(fdStream);
636: if (client->datafp2 == NULL) {
637: fprintf(stderr,"oxCreateClient(): fp2open(fd) failed.\n");
638: return(NULL);
639: }
640: client->dataport = portStream;
641: client->controlport = portControl;
642: client->controlfd = fdControl;
643: client->id = clnum; clnum++;
644: client->type = CLIENT_SOCKET; /* socket */
645: client->engineByteOrder = engineByteOrder;
646: client->controlByteOrder = controlByteOrder;
647: return(client);
648: }
649:
650: oxclientp oxCreateClientFile(char *fname,char *mode,char *controlName,char *cmode)
651: {
652: static int clnum = 0x8000;
653: int v = 0;
654: int fdControl = -1;
655: int fdStream = -1;
656: oxclientp client;
657: v = 1;
658: if (strcmp(mode,"w") == 0) {
659: fdStream = creat(fname,S_IWRITE|S_IREAD|S_IRGRP|S_IROTH);
660: if (fdStream < 0) {
661: fprintf(stderr,"\nCreat failed for %s\n",fname); return(NULL);
662: }
663: }else if (strcmp(mode,"r")==0) {
664: fdStream = open(fname,O_RDONLY);
665: if (fdStream < 0) {
666: fprintf(stderr,"\nOpen failed for %s\n",fname); return(NULL);
667: }
668: }else {
669: fprintf(stderr,"\nThe mode %s is not supported.\n",mode); return(NULL);
670: }
671:
672: if (strcmp(cmode,"w") == 0) {
673: fdControl = creat(controlName,S_IWRITE|S_IREAD|S_IRGRP|S_IROTH);
674: if (fdControl < 0) {
675: fprintf(stderr,"\nCreat failed for %s\n",controlName); return(NULL);
676: }
677: }else if (strcmp(cmode,"r")==0) {
678: fdControl = open(controlName,O_RDONLY);
679: if (fdControl < 0) {
680: fprintf(stderr,"\nOpen failed for %s\n",controlName); return(NULL);
681: }
682: }else if (strcmp(cmode,"rw")==0) {
683: fdControl = open(controlName,O_RDWR);
684: if (fdControl < 0) {
685: fprintf(stderr,"\nOpen failed for %s\n",controlName); return(NULL);
686: }
687: }else {
688: fprintf(stderr,"\nThe mode %s is not supported.\n",cmode); return(NULL);
689: }
690:
691:
692: client = (oxclientp) mymalloc(sizeof(oxclient));
693: oxInitClient(client);
694: client->datafp2 = fp2open(fdStream);
695: if (client->datafp2 == NULL) {
696: fprintf(stderr,"oxCreateClientFile(): fp2open(fd) failed.\n");
697: return(NULL);
698: }
699: client->dataport = 0;
700: client->controlport = 0;
701: client->controlfd = fdControl;
702: client->id = clnum; clnum++;
703: client->type = CLIENT_FILE;
704: client->engineByteOrder = OX_BYTE_NETWORK_BYTE_ORDER;
705: client->controlByteOrder = OX_BYTE_NETWORK_BYTE_ORDER;
706: return(client);
707: }
708:
709: void oxSendOXheader_generic(int type,int fd,ox_stream ox,
710: int k,int serial)
711: {
712: static int ss = 0;
713: extern int UseOXPacketSerial;
714: if (serial >= 0) ss = serial;
715: else ss++;
716: if (ss < 0) ss=0;
717: if (type == 0) { /* fd */
718: oxfdSendInt32(fd,k);
719: if (UseOXPacketSerial) oxfdSendInt32(fd,ss);
720: }else {
721: oxSendInt32(ox,k);
722: if (UseOXPacketSerial) oxSendInt32(ox,ss);
723: }
724: }
725: void oxSendOXheader(ox_stream ostream,int k,int serial) {
726: oxSendOXheader_generic(1,-1,ostream,k,serial);
727: }
728: void oxfdSendOXheader(int fd,int k,int serial) {
729: oxSendOXheader_generic(0,fd,(ox_stream) NULL,k,serial);
730: }
731:
732: int oxfdGetOXheader(int fd,int *sss)
733: {
734: char d[4];
735: int i;
736: int m;
737:
738: for (i=0; i<4; i++) {
739: d[i] = readOneByte(fd);
740: }
741: m = ntohl(* ( (int *)d));
742: *sss = -1;
743: if (UseOXPacketSerial) {
744: for (i=0; i<4; i++) {
745: d[i] = readOneByte(fd);
746: }
747: *sss = ntohl(* ( (int *)d));
748: }
749: return(m);
750: }
751:
752: int oxGetOXheader(ox_stream ostream,int *sss)
753: {
754: char d[4];
755: int m;
756: int i;
757:
758: unlockCtrlCForOx(); /* temporary unlock */
759: while (fp2select(ostream,1000) == 0) ;
760: restoreLockCtrlCForOx();
761:
762: for (i=0; i<4; i++) {
763: d[i] = fp2fgetc(ostream);
764: }
765: m = ntohl(* ( (int *)d));
766: *sss = -1;
767: if (UseOXPacketSerial) {
768: for (i=0; i<4; i++) {
769: d[i] = fp2fgetc(ostream);
770: }
771: *sss = ntohl(* ( (int *)d));
772: }
773: return(m);
774: }
775:
776:
777: oxWritePortFile(int func,int port,char *fname) {
778: char name[1024];
779: FILE *fp;
780: strcpy(name,fname);
781: if (func == 0) {
782: strcat(name,".control");
783: fp = fopen(name,"w");
784: fprintf(fp,"%05d\n",port);
785: fclose(fp);
786: }else {
787: strcat(name,".data");
788: fp = fopen(name,"w");
789: fprintf(fp,"%05d\n",port);
790: fclose(fp);
791: }
792: }
793: oxReadPortFile(int func,char *fname) {
794: int port = 0;
795: char name[1024];
796: FILE *fp;
797: strcpy(name,fname);
798: if (func == 0) {
799: strcat(name,".control");
800: fp = fopen(name,"r");
801: fscanf(fp,"%d",&port);
802: fclose(fp);
803: }else {
804: strcat(name,".data");
805: fp = fopen(name,"r");
806: fscanf(fp,"%d",&port);
807: fclose(fp);
808: }
809: return(port);
810: }
811: char *oxGenPortFile(void) {
812: char *fname;
813: time_t tt;
814: char sstime[512];
815:
816: fname = (char *)malloc(1024*sizeof(char));
817: strcpy(fname,getenv("HOME"));
818: strcat(fname,"/.ox.");
819: tt = time(NULL);
820: sprintf(sstime,"%ld",(long) tt);
821: strcat(fname,sstime);
822: if (fname[strlen(fname)-1] == '\n') {
823: fname[strlen(fname)-1] = '\0';
824: }
825: /* fprintf(stderr,"OxPortFileName=%s\n",fname); */
826: OxPortFileName = fname;
827: return(fname);
828: }
829: int oxRemovePortFile(void) {
830: char fname[1024];
831: FILE *fp;
832: strcpy(fname,OxPortFileName);
833: strcat(fname,".control");
834: if ((fp=fopen(fname,"r")) == NULL) {
835: }{
836: fclose(fp);
837: if (unlink(fname)) {
838: fprintf(MyErrorOut,"fail unlink.\n");
839: }
840:
841: }
842: strcpy(fname,OxPortFileName);
843: strcat(fname,".data");
844: if ((fp=fopen(fname,"r")) == NULL) {
845: }{
846: fclose(fp);
847: if (unlink(fname)) {
848: fprintf(MyErrorOut,"fail unlink.\n");
849: }
850: }
851: }
852:
853: char *oxGenPass(void) {
854: int seed;
855: long p;
856: char *s;
857: seed = (int) time(NULL);
858: srandom((unsigned int) seed);
859: p = random();
860: s = (char *)malloc(128*sizeof(char));
861: sprintf(s,"%ld",p);
862: return(s);
863: }
864:
865:
866: static void cancelConnection() {
867: extern jmp_buf MyEnv_oxmisc;
868: signal(SIGALRM,SIG_IGN);
869: fprintf(stderr,"Time out in TCP/IP connection.\n");
870: longjmp(MyEnv_oxmisc,1);
871: }
872:
873: oxclientp oxCreateClient2(int fdstream,int portStream,
874: int fdcontrol,int portControl,int ipmask,char *pass)
875: {
876: static int clnum = 0;
877: int v = 0;
878: int fdControl = -1;
879: int fdStream = -1;
880: int m;
881:
882: char *s;
883: oxclientp client;
884: extern jmp_buf MyEnv_oxmisc ;
885: int controlByteOrder, engineByteOrder;
886:
887: v = !Quiet;
888: if (setjmp(MyEnv_oxmisc)) {
889: return(NULL);
890: }else{
891: }
892: alarm((unsigned int) 10); /* setup timeout. */
893: signal(SIGALRM,cancelConnection);
894:
895: switch(ipmask) {
896: case 0:/* only local */
897: fdControl = socketAcceptLocal(fdcontrol);
898: fdStream = socketAcceptLocal(fdstream);
899: break;
900: default:/* any */
901: fdControl = socketAccept(fdcontrol);
902: fdStream = socketAccept(fdstream);
903: break;
904: }
905: if (v) fprintf(stderr,"\nControl port %d : Connected.\n",portControl);
906: if (v) fprintf(stderr,"\nStream port %d : Connected.\n",portStream);
907:
908: if (fdStream == -1 || fdControl == -1) {
909: fprintf(stderr,"\nOpen error in oxCreateClient.\n");
910: return(NULL);
911: }
912:
913: /* Authentification by password. */
914: m = strlen(pass);
915: s = (char *)mymalloc(sizeof(char)*(m+1));
916: read(fdControl,s,m); s[m] = '\0';
917: if (strcmp(s,pass) != 0) {
918: fprintf(stderr,"oxCreateClient2(): password authentification failed for control channel.\n");
919: close(fdControl);
920: return(NULL);
921: }
922: read(fdStream,s,m); s[m] = '\0';
923: if (strcmp(s,pass) != 0) {
924: fprintf(stderr,"oxCreateClient2(): password authentification failed for data channel.\n");
925: close(fdStream);
926: return(NULL);
927: }
928: signal(SIGALRM,SIG_IGN);
929:
930: controlByteOrder = oxSetByteOrder(fdControl);
931: if (v) fprintf(stderr,"Byte order for control process is %s.\n",
932: (controlByteOrder == 0? "network byte order":
933: (controlByteOrder == 1? "little indican":
934: "big indian")));
935: engineByteOrder = oxSetByteOrder(fdStream);
936: if (v) fprintf(stderr,"Byte order for engine process is %s.\n",
937: (engineByteOrder == 0? "network byte order":
938: (engineByteOrder == 1? "little indican":
939: "big indian")));
940:
941:
942: client = (oxclientp) mymalloc(sizeof(oxclient));
943: oxInitClient(client);
944: client->datafp2 = fp2open(fdStream);
945: if (client->datafp2 == NULL) {
946: fprintf(stderr,"oxCreateClient2(): fp2open(fd) failed.\n");
947: return(NULL);
948: }
949: client->dataport = portStream;
950: client->controlport = portControl;
951: client->controlfd = fdControl;
952: client->id = clnum; clnum++;
953: client->type = CLIENT_SOCKET; /* socket */
954: client->engineByteOrder = engineByteOrder;
955: client->controlByteOrder = controlByteOrder;
956: return(client);
957: }
958:
959: int oxSetByteOrder(int fd) {
960: char data[1];
961: int peertype;
962: /* It is for client. read and next write. */
963: /* oxSocketSelect0(fd,10); wait. */
964: read(fd,data,1);
965: peertype = (unsigned char) data[0];
966:
967: /* We support only Network byte order */
968: data[0] = OX_BYTE_NETWORK_BYTE_ORDER;
969: write(fd,data,1);
970:
971: return(OX_BYTE_NETWORK_BYTE_ORDER);
972: }
973:
974: int oxTellMyByteOrder(int fd) {
975: char data[1];
976: int peertype;
977: /* It is for server. read and next write. */
978:
979: /* We support only Network byte order */
980: data[0] = OX_BYTE_NETWORK_BYTE_ORDER;
981: write(fd,data,1);
982: fsync(fd); /* returns 0 if normal. Does it work for socket? */
983:
984: read(fd,data,1);
985:
986: return(OX_BYTE_NETWORK_BYTE_ORDER);
987: }
988:
989:
990:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>