diff options
Diffstat (limited to 'contrib/ntp/arlib/sample.c')
-rw-r--r-- | contrib/ntp/arlib/sample.c | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/contrib/ntp/arlib/sample.c b/contrib/ntp/arlib/sample.c new file mode 100644 index 0000000..83db6a8 --- /dev/null +++ b/contrib/ntp/arlib/sample.c @@ -0,0 +1,143 @@ +#include <stdio.h> +#include <strings.h> +#include <errno.h> +#include <sys/types.h> +#include <sys/time.h> +#include <netinet/in.h> +#include <netdb.h> +#include "arlib.h" + +#ifndef lint +static char sccsid[] = "@(#)sample.c 1.1 12/21/92 (C)1992 Darren Reed. ASYNC DNS"; +#endif + +char line[512]; + +int lookup = 0, seq = 0; +long expire = 0; + +main() +{ + struct in_addr adr; + struct timeval tv2; + fd_set rd; + long now; + char *s; + int afd, nfd, pid = getpid(), del; + + afd = ar_init(ARES_INITLIST|ARES_CALLINIT|ARES_INITSOCK); + + (void)printf("afd = %d pid = %d\n",afd, pid); + + while (1) + { + (void)printf("Host =>"); + (void)fflush(stdout); + *line = '\0'; + FD_ZERO(&rd); + FD_SET(0,&rd); + FD_SET(afd,&rd); + now = time(NULL); + if (expire >= now) + { + tv2.tv_usec = 0; + tv2.tv_sec = expire - now; + nfd = select(FD_SETSIZE, &rd, NULL, NULL, &tv2); + } + else + nfd = select(FD_SETSIZE, &rd, NULL, NULL, NULL); + + if (FD_ISSET(0, &rd)) + { + if (!fgets(line, sizeof(line) - 1, stdin)) + exit(0); + if (s = index(line, '\n')) + *s = '\0'; + } + + if (isalpha(*line)) + { + (void)printf("Asking about [%s] #%d.\n",line, ++seq); + (void)ar_gethostbyname(line, (char *)&seq, + sizeof(seq)); + lookup++; + } + else if (isdigit(*line)) + { + (void)printf("Asking about IP#[%s] #%d.\n", + line, ++seq); + adr.s_addr = inet_addr(line); + (void)ar_gethostbyaddr(&adr, (char *)&seq, + sizeof(seq)); + lookup++; + } + if (lookup) + (void)printf("Waiting for answer:\n"); + if (FD_ISSET(afd, &rd)) + (void)waitonlookup(afd); + del = 0; + expire = ar_timeout(time(NULL), &del, sizeof(del)); + if (del) + { + (void)fprintf(stderr,"#%d failed\n", del); + lookup--; + } + } +} + +printhostent(hp) +struct hostent *hp; +{ + struct in_addr ip; + int i; + + (void)printf("hname = %s\n", hp->h_name); + for (i = 0; hp->h_aliases[i]; i++) + (void)printf("alias %d = %s\n", i+1, hp->h_aliases[i]); + for (i = 0; hp->h_addr_list[i]; i++) + { + bcopy(hp->h_addr_list[i], (char *)&ip, sizeof(ip)); + (void)printf("IP# %d = %s\n", i+1, inet_ntoa(ip)); + } +} + +int waitonlookup(afd) +int afd; +{ + struct timeval delay; + struct hostent *hp; + fd_set rd; + long now; + int nfd, del; + +waitloop: + FD_ZERO(&rd); + now = time(NULL); + if (expire >= now) + delay.tv_sec = expire - now; + else + delay.tv_sec = 1; + delay.tv_usec = 0; + FD_SET(afd, &rd); + FD_SET(0, &rd); + + nfd = select(FD_SETSIZE, &rd, 0, 0, &delay); + if (nfd == 0) + return 0; + else if (FD_ISSET(afd, &rd)) + { + del = 0; + hp = ar_answer(&del, sizeof(del)); + + (void)printf("hp=%x seq=%d\n",hp,del); + if (hp) + { + (void)printhostent(hp); + if (!--lookup) + return 1; + } + } + if (FD_ISSET(0, &rd)) + return 2; + return 0; +} |