xref: /csrg-svn/usr.bin/tn3270/api/api_exch.c (revision 31474)
131460Sminshall #include <stdio.h>
231460Sminshall 
331460Sminshall #include "api_exch.h"
431460Sminshall 
531467Sminshall static int sock;		/* Socket number */
631467Sminshall 
7*31474Sminshall static char whoarewe[40] = "";
8*31474Sminshall 
931460Sminshall static char ibuffer[40], *ibuf_next, *ibuf_last;
1031460Sminshall #define	IBUFADDED(i)		ibuf_last += (i)
1131460Sminshall #define	IBUFAVAILABLE()		(ibuf_last -ibuf_next)
1231460Sminshall #define	IBUFFER()		ibuffer
1331460Sminshall #define	IBUFGETCHAR()		(*ibuf_next++)
1431460Sminshall #define	IBUFGETSHORT()		((*ibuf_next++<<8)|(*ibuf_next++&0xff))
1531460Sminshall #define	IBUFRESET()		(ibuf_next = ibuf_last = ibuffer)
1631460Sminshall 
1731460Sminshall char obuffer[40], *obuf_next;
1831460Sminshall #define	OBUFADDBYTES(w,l)	{ memcpy(obuf_next, w, l); obuf_next += l; }
1931460Sminshall #define	OBUFADDCHAR(c)		(*obuf_next++ = c)
2031460Sminshall #define	OBUFADDSHORT(s)		{*obuf_next++ = (s)>>8; *obuf_next++ = s; }
2131460Sminshall #define	OBUFAVAILABLE()		(obuf_next - obuffer)
2231460Sminshall #define	OBUFFER()		obuffer
2331460Sminshall #define	OBUFRESET()		obuf_next = obuffer
2431460Sminshall #define	OBUFROOM()		(obuffer+sizeof obuffer-obuf_next)
2531460Sminshall 
2631460Sminshall 
2731460Sminshall static int
2831460Sminshall outflush()
2931460Sminshall {
3031460Sminshall     int length = OBUFAVAILABLE();
3131460Sminshall 
3231460Sminshall     if (length != 0) {
3331460Sminshall 	if (write(sock, OBUFFER(), length) != length) {
34*31474Sminshall 	    fprintf(stderr, "(API %s) ", whoarewe);
35*31474Sminshall 	    perror("write");
3631460Sminshall 	    return -1;
3731460Sminshall 	}
3831460Sminshall 	OBUFRESET();
3931460Sminshall     }
4031460Sminshall     return 0;				/* All OK */
4131460Sminshall }
4231460Sminshall 
4331460Sminshall 
4431460Sminshall static int
4531460Sminshall infill(count)
4631460Sminshall int count;
4731460Sminshall {
4831460Sminshall     int i;
4931460Sminshall 
5031460Sminshall     if (OBUFAVAILABLE()) {
5131460Sminshall 	if (outflush() == -1) {
5231460Sminshall 	    return -1;
5331460Sminshall 	}
5431460Sminshall     }
5531460Sminshall     if (ibuf_next == ibuf_last) {
5631460Sminshall 	IBUFRESET();
5731460Sminshall     }
5831460Sminshall     while (count) {
5931460Sminshall 	if ((i = read(sock, IBUFFER(), count)) < 0) {
60*31474Sminshall 	    fprintf(stderr, "(API %s) ", whoarewe);
61*31474Sminshall 	    perror("read");
6231460Sminshall 	    return -1;
6331460Sminshall 	}
64*31474Sminshall 	if (i == 0) {
65*31474Sminshall 	    /* Reading past end-of-file */
66*31474Sminshall 	    fprintf(stderr, "(API %s) End of file read\r\n", whoarewe);
67*31474Sminshall 	    return -1;
68*31474Sminshall 	}
6931460Sminshall 	count -= i;
7031460Sminshall 	IBUFADDED(i);
7131460Sminshall     }
7231460Sminshall     return 0;
7331460Sminshall }
7431460Sminshall 
7531467Sminshall int
7631467Sminshall api_exch_inbyte()
7731467Sminshall {
7831467Sminshall     if (IBUFAVAILABLE() < 1) {
7931467Sminshall 	if (infill(1) == -1) {
8031467Sminshall 	    return -1;
8131467Sminshall 	}
8231467Sminshall     }
8331467Sminshall     return IBUFGETCHAR();
8431467Sminshall }
8531467Sminshall 
8631467Sminshall 
8731467Sminshall int
8831460Sminshall api_exch_incommand(command)
8931460Sminshall int command;
9031460Sminshall {
9131460Sminshall     int i;
9231460Sminshall 
9331460Sminshall     if (IBUFAVAILABLE() < 1) {
9431460Sminshall 	if (infill(1) == -1) {
9531460Sminshall 	    return -1;
9631460Sminshall 	}
9731460Sminshall     }
9831460Sminshall     i = IBUFGETCHAR();
9931460Sminshall     if (i != command) {
10031460Sminshall 	fprintf(stderr, "Expected API command 0x%x, got API command 0x%x.\n",
10131460Sminshall 				command, i);
10231460Sminshall 	return -1;
10331460Sminshall     }
10431460Sminshall     return 0;
10531460Sminshall }
10631460Sminshall 
10731460Sminshall 
10831467Sminshall int
10931460Sminshall api_exch_outcommand(command)
11031460Sminshall int command;
11131460Sminshall {
11231460Sminshall     if (OBUFROOM() < 1) {
11331460Sminshall 	if (outflush() == -1) {
11431460Sminshall 	    return -1;
11531460Sminshall 	}
11631460Sminshall     }
11731460Sminshall     OBUFADDCHAR(command);
11831460Sminshall     return 0;
11931460Sminshall }
12031460Sminshall 
12131460Sminshall 
12231467Sminshall int
12331460Sminshall api_exch_outtype(type, length, location)
12431460Sminshall int
12531460Sminshall     type,
12631460Sminshall     length;
12731460Sminshall char
12831460Sminshall     *location;
12931460Sminshall {
13031460Sminshall     int netleng = htons(length);
13131460Sminshall 
13231460Sminshall     if (OBUFROOM() < 3) {
13331460Sminshall 	if (outflush() == -1) {
13431460Sminshall 	    return -1;
13531460Sminshall 	}
13631460Sminshall     }
13731460Sminshall     OBUFADDCHAR(type);
13831460Sminshall     OBUFADDSHORT(netleng);
13931460Sminshall     if (OBUFROOM() > length) {
14031460Sminshall 	OBUFADDBYTES(location, length);
14131460Sminshall     } else {
14231460Sminshall 	if (outflush() == -1) {
14331460Sminshall 	    return -1;
14431460Sminshall 	}
14531460Sminshall 	if (write(sock, location, length) != length) {
146*31474Sminshall 	    fprintf(stderr, "(API %s) ", whoarewe);
147*31474Sminshall 	    perror("write");
14831460Sminshall 	    return -1;
14931460Sminshall 	}
15031460Sminshall     }
15131460Sminshall }
15231460Sminshall 
15331460Sminshall 
15431467Sminshall int
15531460Sminshall api_exch_intype(type, length, location)
15631460Sminshall int
15731460Sminshall     type,
15831460Sminshall     length;
15931460Sminshall char
16031460Sminshall     *location;
16131460Sminshall {
16231460Sminshall     int i, netleng = htons(length);
16331460Sminshall 
16431460Sminshall     if (IBUFAVAILABLE() < 3) {
16531460Sminshall 	if (infill(3) == -1) {
16631460Sminshall 	    return -1;
16731460Sminshall 	}
16831460Sminshall     }
16931460Sminshall     if ((i = IBUFGETCHAR()) != type) {
17031460Sminshall 	fprintf(stderr, "Expected type 0x%x, got type 0x%x.\n", type, i);
17131460Sminshall 	return -1;
17231460Sminshall     }
17331460Sminshall     if ((i = IBUFGETSHORT()) != netleng) {
17431460Sminshall 	fprintf(stderr, "Type 0x%x - expected length %d, received length %d.\n",
17531460Sminshall 		type, length, ntohs(i));
17631460Sminshall 	return -1;
17731460Sminshall     }
17831460Sminshall     while (length) {
17931460Sminshall 	if ((i = read(sock, location, length)) < 0) {
180*31474Sminshall 	    fprintf(stderr, "(API %s) ", whoarewe);
181*31474Sminshall 	    perror("read");
18231460Sminshall 	    return -1;
18331460Sminshall 	}
18431460Sminshall 	length -= i;
18531460Sminshall 	location += i;
18631460Sminshall     }
18731460Sminshall     return 0;
18831460Sminshall }
18931467Sminshall 
19031467Sminshall int
191*31474Sminshall api_exch_init(sock_number, ourname)
19231467Sminshall int sock_number;
193*31474Sminshall char *ourname;
19431467Sminshall {
19531467Sminshall     sock = sock_number;
196*31474Sminshall     strcpy(whoarewe, ourname);		/* For error messages */
19731467Sminshall 
19831467Sminshall     IBUFRESET();
19931467Sminshall     OBUFRESET();
20031467Sminshall 
20131467Sminshall     return 0;
20231467Sminshall }
203