summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormillert <millert@openbsd.org>2002-12-17 20:17:49 +0000
committermillert <millert@openbsd.org>2002-12-17 20:17:49 +0000
commit8db96ca1e36a9de11ea971668b7a6a2a2377044c (patch)
tree2db94d69e127c32ab865f49a91e44284ad5c48bd
parentsimple PRIQ example (diff)
downloadwireguard-openbsd-8db96ca1e36a9de11ea971668b7a6a2a2377044c.tar.xz
wireguard-openbsd-8db96ca1e36a9de11ea971668b7a6a2a2377044c.zip
ANSIfu and if given multiple names, don't exit if we get an error
looking up just one. Exit value is now the number of errors found trying to lookup all the names. Some bits from Andrey Matveev.
-rw-r--r--usr.bin/whois/whois.c88
1 files changed, 47 insertions, 41 deletions
diff --git a/usr.bin/whois/whois.c b/usr.bin/whois/whois.c
index 892b481a9c3..cc3473b6d58 100644
--- a/usr.bin/whois/whois.c
+++ b/usr.bin/whois/whois.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: whois.c,v 1.16 2002/09/05 17:22:16 fgsch Exp $ */
+/* $OpenBSD: whois.c,v 1.17 2002/12/17 20:17:49 millert Exp $ */
/*
* Copyright (c) 1980, 1993
@@ -34,24 +34,26 @@
*/
#ifndef lint
-static char copyright[] =
+static const char copyright[] =
"@(#) Copyright (c) 1980, 1993\n\
The Regents of the University of California. All rights reserved.\n";
#endif /* not lint */
#ifndef lint
#if 0
-static char sccsid[] = "@(#)whois.c 8.1 (Berkeley) 6/6/93";
+static const char sccsid[] = "@(#)whois.c 8.1 (Berkeley) 6/6/93";
#else
-static char rcsid[] = "$OpenBSD: whois.c,v 1.16 2002/09/05 17:22:16 fgsch Exp $";
+static const char rcsid[] = "$OpenBSD: whois.c,v 1.17 2002/12/17 20:17:49 millert Exp $";
#endif
#endif /* not lint */
#include <sys/types.h>
#include <sys/socket.h>
+
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
+
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
@@ -76,18 +78,16 @@ static char rcsid[] = "$OpenBSD: whois.c,v 1.16 2002/09/05 17:22:16 fgsch Exp $"
#define WHOIS_INIC_FALLBACK 0x02
#define WHOIS_QUICK 0x04
-static void usage(void);
-static void whois(char *, struct addrinfo *, int);
+static __dead void usage(void);
+static int whois(char *, struct addrinfo *, int);
int
-main(argc, argv)
- int argc;
- char **argv;
+main(int argc, char **argv)
{
- int ch, i, j, error;
+ int ch, i, j, error, rval;
int use_qnichost, flags;
- char *host;
- char *qnichost;
+ size_t len;
+ char *host, *qnichost, *name;
struct addrinfo hints, *res;
#ifdef SOCKS
@@ -98,6 +98,7 @@ main(argc, argv)
qnichost = NULL;
flags = 0;
use_qnichost = 0;
+ rval = 0;
while ((ch = getopt(argc, argv, "adgh:ilmpqQrR")) != -1)
switch((char)ch) {
case 'a':
@@ -156,22 +157,21 @@ main(argc, argv)
if (!(flags & WHOIS_QUICK))
flags |= WHOIS_INIC_FALLBACK | WHOIS_RECURSE;
}
- while (argc--) {
+ for (name = *argv; (name = *argv) != NULL; argv++) {
if (use_qnichost) {
if (qnichost) {
free(qnichost);
qnichost = NULL;
}
- for (i = j = 0; (*argv)[i]; i++)
- if ((*argv)[i] == '.')
+ for (i = j = 0; name[i]; i++)
+ if (name[i] == '.')
j = i;
if (j != 0) {
- int len = i - j + 1 + strlen(QNICHOST_TAIL);
-
- qnichost = (char *) calloc(len, sizeof(char));
+ len = i - j + 1 + strlen(QNICHOST_TAIL);
+ qnichost = (char *)calloc(len, sizeof(char));
if (!qnichost)
- err(1, "malloc");
- strlcpy(qnichost, *argv + j + 1, len);
+ err(1, "calloc");
+ strlcpy(qnichost, name + j + 1, len);
strlcat(qnichost, QNICHOST_TAIL, len);
memset(&hints, 0, sizeof(hints));
hints.ai_flags = 0;
@@ -179,9 +179,12 @@ main(argc, argv)
hints.ai_socktype = SOCK_STREAM;
error = getaddrinfo(qnichost, "whois",
&hints, &res);
- if (error != 0)
- errx(EX_NOHOST, "%s: %s", qnichost,
+ if (error) {
+ warnx("%s: %s", qnichost,
gai_strerror(error));
+ rval++;
+ continue;
+ }
}
}
if (!qnichost) {
@@ -190,30 +193,30 @@ main(argc, argv)
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
error = getaddrinfo(host, "whois", &hints, &res);
- if (error != 0)
- errx(EX_NOHOST, "%s: %s", host,
- gai_strerror(error));
+ if (error) {
+ warnx("%s: %s", host, gai_strerror(error));
+ rval++;
+ continue;
+ }
}
- whois(*argv++, res, flags);
+ whois(name, res, flags);
freeaddrinfo(res);
}
- exit(0);
+ exit(rval);
}
-static void
-whois(name, res, flags)
- char *name;
- struct addrinfo *res;
- int flags;
+static int
+whois(char *name, struct addrinfo *res, int flags)
{
FILE *sfi, *sfo;
char *buf, *p, *nhost, *nbuf = NULL;
size_t len;
- int s, nomatch;
+ int s, nomatch, rval;
const char *reason = NULL;
s = -1;
+ rval = 0;
for (/*nothing*/; res; res = res->ai_next) {
s = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if (s < 0) {
@@ -231,9 +234,10 @@ whois(name, res, flags)
}
if (s < 0) {
if (reason)
- err(EX_OSERR, "%s", reason);
+ warn("%s", reason);
else
- errx(EX_OSERR, "unknown error in connection attempt");
+ warn("unknown error in connection attempt");
+ return (rval + 1);
}
sfi = fdopen(s, "r");
@@ -250,7 +254,8 @@ whois(name, res, flags)
else if (buf[len - 1] == '\n')
buf[len - 1] = '\0';
else {
- nbuf = malloc(len + 1);
+ if ((nbuf = malloc(len + 1)) == NULL)
+ err(1, "malloc");
memcpy(nbuf, buf, len);
nbuf[len] = '\0';
buf = nbuf;
@@ -292,19 +297,20 @@ whois(name, res, flags)
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
error = getaddrinfo(nhost, "whois", &hints, &res2);
- if (error != 0) {
+ if (error) {
warnx("%s: %s", nhost, gai_strerror(error));
- return;
+ return (rval + 1);
}
if (!nomatch)
free(nhost);
- whois(name, res2, 0);
+ rval += whois(name, res2, 0);
freeaddrinfo(res2);
}
+ return (rval);
}
-static void
-usage()
+static __dead void
+usage(void)
{
(void)fprintf(stderr,