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