1 | #include <sys/types.h> 2 | #include <sys/socket.h> 3 | #include <netinet/in.h> 4 | #include <netdb.h> 5 | #include <stdio.h> 6 | 7 | #include <erroutines.h> 8 | 9 | 10 | int 11 | WH_sock(int sock, char *hostname, int port, 12 | char *query, int maxlines, int timeout) 13 | { 14 | char log_str[256]; 15 | FILE *sfi; 16 | FILE *sfo; 17 | struct sockaddr_in sin; 18 | struct hostent *hp; 19 | int ch; 20 | int s; 21 | 22 | sprintf(log_str, "would perform query >%s< to %s:%d \n" 23 | "limits: line %d tmout %d and print on socket %d\n", 24 | query,hostname,port, maxlines,timeout,sock ); 25 | log_inst_print(log_str); 26 | 27 | if ( (hp = gethostbyname(hostname)) == NULL) { 28 | return WH_BADHOST; 29 | } 30 | 31 | s = socket(AF_INET, SOCK_STREAM, 0); 32 | if (s < 0) { 33 | return WH_SOCKET; 34 | } 35 | 36 | bzero((caddr_t)&sin, sizeof (sin)); 37 | sin.sin_family = hp->h_addrtype; 38 | if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) { 39 | close(s); 40 | return WH_BIND; 41 | } 42 | bcopy(hp->h_addr, (char *)&sin.sin_addr, hp->h_length); 43 | sin.sin_port=port; 44 | 45 | if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) { 46 | close(s); 47 | return WH_CONNECT; 48 | } 49 | 50 | #if 1 51 | sfi = fdopen(s, "r"); 52 | sfo = fdopen(s, "w"); 53 | if (sfi == NULL || sfo == NULL) { 54 | (void)close(s); 55 | return WH_OPEN; 56 | } 57 | 58 | fprintf(sfo, "%s\r\n", query); 59 | fflush(sfo); 60 | 61 | while ((ch = getc(sfi)) != EOF) { 62 | int ret = SK_putc(sock,ch); 63 | } 64 | 65 | fclose(sfo); 66 | fclose(sfi); 67 | #else 68 | SK_puts(s, query); 69 | SK_puts(s, "\r\n"); 70 | 71 | while( (ch = SK_getc(s)) != EOF ) { 72 | SK_putc(sock,ch); 73 | } 74 | #endif 75 | close(s); 76 | } 77 |