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 | #if 0 23 | sprintf(log_str, "would perform query >%s< to %s:%d \n" 24 | "limits: line %d tmout %d and print on socket %d\n", 25 | query,hostname,port, maxlines,timeout,sock ); 26 | log_inst_print(log_str); 27 | #endif 28 | 29 | if ( (hp = gethostbyname(hostname)) == NULL) { 30 | return WH_BADHOST; 31 | } 32 | 33 | s = socket(AF_INET, SOCK_STREAM, 0); 34 | if (s < 0) { 35 | return WH_SOCKET; 36 | } 37 | 38 | bzero((caddr_t)&sin, sizeof (sin)); 39 | sin.sin_family = hp->h_addrtype; 40 | if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) { 41 | close(s); 42 | return WH_BIND; 43 | } 44 | bcopy(hp->h_addr, (char *)&sin.sin_addr, hp->h_length); 45 | sin.sin_port=port; 46 | 47 | SK_puts(sock, "% connecting to a remote referral site...\n"); 48 | 49 | if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) { 50 | close(s); 51 | return WH_CONNECT; 52 | } 53 | 54 | SK_puts(sock, "% Connection established...\n"); 55 | 56 | #if 1 57 | sfi = fdopen(s, "r"); 58 | sfo = fdopen(s, "w"); 59 | if (sfi == NULL || sfo == NULL) { 60 | (void)close(s); 61 | return WH_OPEN; 62 | } 63 | 64 | fprintf(sfo, "%s\r\n", query); 65 | fflush(sfo); 66 | 67 | while ((ch = getc(sfi)) != EOF) { 68 | int ret = SK_putc(sock,ch); 69 | } 70 | 71 | fclose(sfo); 72 | fclose(sfi); 73 | #else 74 | SK_puts(s, query); 75 | SK_puts(s, "\r\n"); 76 | 77 | while( (ch = SK_getc(s)) != EOF ) { 78 | SK_putc(sock,ch); 79 | } 80 | #endif 81 | close(s); 82 | } 83 |