/* query.c */ /* A simple example of how to use resolver services to */ /* make a name server query. */ #include #include #include #include #include #include #include #include #include #include typedef union { HEADER qb1; char qb2[PACKETSZ]; } querybuf; int sock; struct hostent *hp; struct hostent *gethostbyname(); struct sockaddr_in dname; struct sockaddr_in sname; int getinfo( char *name, char *domain, int type) { HEADER *hp; char *eom, *cp; querybuf buf, answer; int n; int ancount, nscount, arcount, qdcount; char host[2*MAXDNAME+2]; int namelen; int status; if (domain == NULL) (void)sprintf(host, "%.*s", MAXDNAME, name); else (void)sprintf(host, "%.*s.%.*s", MAXDNAME, name, MAXDNAME, domain); printf("Querying name: %s\n", host); n = res_mkquery(QUERY, host, C_IN, type, (char *)NULL, 0, NULL, (char *)&buf, sizeof(buf)); if (n < 0) { if (_res.options & RES_DEBUG) printf("res_mkquery failed\n"); h_errno = NO_RECOVERY; return(0); } status = sendto(sock, &buf, n, 0, (struct sockaddr *)&dname, sizeof(dname)); namelen = sizeof(struct sockaddr_in); status = recvfrom(sock, &answer, sizeof(buf), 0, (struct sockaddr *)&sname, &namelen); eom = (char *)&answer + n; hp = (HEADER *)&answer; ancount = ntohs(hp->ancount); qdcount = ntohs(hp->qdcount); nscount = ntohs(hp->nscount); arcount = ntohs(hp->arcount); printf("Ans %d - QDs %d - NSs %d - ARs %d \n", ancount, qdcount, nscount, arcount); return(n); } void main( int argc, char **argv) { int status; int i; unsigned char c; int msglen; sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock < 0) { printf("Socket create failed \n"); exit(1); } hp = gethostbyname("198.41.0.4"); if (hp == 0) { printf("Host %s not found\n", argv[1]); exit(1); } bcopy((char *)hp->h_addr, (char *)&dname.sin_addr, hp->h_length); printf("Length = %d | Addr = ", hp->h_length); for (i = 0; i < hp->h_length; i++) { c = *((char *)&dname.sin_addr + i); printf(" %2x", c); } printf("\n"); dname.sin_family = AF_INET; dname.sin_port = htons(atoi("53")); msglen = atoi(argv[3]); res_init(); _res.retry = 1; _res.retrans = 15; _res.options |= RES_DEBUG; if (argc < 3) status = getinfo(argv[1], "cs.clemson.edu.", T_A); else status = getinfo(argv[1], argv[2], T_A); printf("%d bytes returned \n", status); }