aboutsummaryrefslogtreecommitdiffstats
path: root/main/busybox/0016-whois-make-it-actually-work.patch
diff options
context:
space:
mode:
Diffstat (limited to 'main/busybox/0016-whois-make-it-actually-work.patch')
-rw-r--r--main/busybox/0016-whois-make-it-actually-work.patch185
1 files changed, 185 insertions, 0 deletions
diff --git a/main/busybox/0016-whois-make-it-actually-work.patch b/main/busybox/0016-whois-make-it-actually-work.patch
new file mode 100644
index 0000000000..fe7cfe17ce
--- /dev/null
+++ b/main/busybox/0016-whois-make-it-actually-work.patch
@@ -0,0 +1,185 @@
+From f8e33d70806d0dee740e5451aedfe5089a4d156a Mon Sep 17 00:00:00 2001
+From: Denys Vlasenko <vda.linux@googlemail.com>
+Date: Wed, 6 Jul 2016 15:45:41 +0200
+Subject: [PATCH 16/16] whois: make it actually work
+
+It was doing way too simplistic work of just querying the server,
+no redirects, no query massaging. This required user to know a lot about whois,
+and enter at least three queries for each host to get meaningful information.
+
+function old new delta
+whois_main 209 646 +437
+
+Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
+---
+ networking/whois.c | 137 ++++++++++++++++++++++++++++++++++++++++++++++++-----
+ 1 file changed, 124 insertions(+), 13 deletions(-)
+
+diff --git a/networking/whois.c b/networking/whois.c
+index bf33033..5ef8367 100644
+--- a/networking/whois.c
++++ b/networking/whois.c
+@@ -28,36 +28,147 @@
+
+ #include "libbb.h"
+
+-static void pipe_out(int fd)
++static char *query(const char *host, int port, const char *domain)
+ {
++ int fd;
+ FILE *fp;
+- char buf[1024];
++ bool success;
++ char *redir = NULL;
++ const char *pfx = "";
++ char linebuf[1024];
++ char *buf = NULL;
++ unsigned bufpos = 0;
+
++ again:
++ printf("[Querying %s:%d '%s%s']\n", host, port, pfx, domain);
++ fd = create_and_connect_stream_or_die(host, port);
++ success = 0;
++ fdprintf(fd, "%s%s\r\n", pfx, domain);
+ fp = xfdopen_for_read(fd);
+- while (fgets(buf, sizeof(buf), fp)) {
+- char *p = strpbrk(buf, "\r\n");
+- if (p)
+- *p = '\0';
+- puts(buf);
+- }
+
++ while (fgets(linebuf, sizeof(linebuf), fp)) {
++ unsigned len = strcspn(linebuf, "\r\n");
++ linebuf[len++] = '\n';
++
++ buf = xrealloc(buf, bufpos + len + 1);
++ memcpy(buf + bufpos, linebuf, len);
++ bufpos += len;
++
++ if (!redir || !success) {
++ trim(linebuf);
++ str_tolower(linebuf);
++ if (!success) {
++ success = is_prefixed_with(linebuf, "domain:")
++ || is_prefixed_with(linebuf, "domain name:");
++ }
++ else if (!redir) {
++ char *p = is_prefixed_with(linebuf, "whois server:");
++ if (!p)
++ p = is_prefixed_with(linebuf, "whois:");
++ if (p)
++ redir = xstrdup(skip_whitespace(p));
++ }
++ }
++ }
+ fclose(fp); /* closes fd too */
++ if (!success && !pfx[0]) {
++ /*
++ * Looking at jwhois.conf, some whois servers use
++ * "domain = DOMAIN", "DOMAIN ID <DOMAIN>"
++ * and "domain=DOMAIN_WITHOUT_LAST_COMPONENT"
++ * formats, but those are rare.
++ * (There are a few even more contrived ones.)
++ * We are trying only "domain DOMAIN", the typical one.
++ */
++ pfx = "domain ";
++ bufpos = 0;
++ goto again;
++ }
++
++ /* Success */
++ if (redir && strcmp(redir, host) == 0) {
++ /* Redirect to self does not count */
++ free(redir);
++ redir = NULL;
++ }
++ if (!redir) {
++ /* Output saved text */
++ printf("[%s]\n", host);
++ buf[bufpos] = '\0';
++ fputs(buf, stdout);
++ }
++ free(buf);
++ return redir;
+ }
+
++static void recursive_query(const char *host, int port, const char *domain)
++{
++ char *free_me = NULL;
++ char *redir;
++ again:
++ redir = query(host, port, domain);
++ free(free_me);
++ if (redir) {
++ printf("[Redirected to %s]\n", redir);
++ host = free_me = redir;
++ port = 43;
++ goto again;
++ }
++}
++
++/* One of "big" whois implementations has these options:
++ *
++ * $ whois --help
++ * jwhois version 4.0, Copyright (C) 1999-2007 Free Software Foundation, Inc.
++ * -v, --verbose verbose debug output
++ * -c FILE, --config=FILE use FILE as configuration file
++ * -h HOST, --host=HOST explicitly query HOST
++ * -n, --no-redirect disable content redirection
++ * -s, --no-whoisservers disable whois-servers.net service support
++ * -a, --raw disable reformatting of the query
++ * -i, --display-redirections display all redirects instead of hiding them
++ * -p PORT, --port=PORT use port number PORT (in conjunction with HOST)
++ * -r, --rwhois force an rwhois query to be made
++ * --rwhois-display=DISPLAY sets the display option in rwhois queries
++ * --rwhois-limit=LIMIT sets the maximum number of matches to return
++ *
++ * Example of its output:
++ * $ whois cnn.com
++ * [Querying whois.verisign-grs.com]
++ * [Redirected to whois.corporatedomains.com]
++ * [Querying whois.corporatedomains.com]
++ * [whois.corporatedomains.com]
++ * ...text of the reply...
++ *
++ * With -i, reply from each server is printed, after all redirects are done:
++ * [Querying whois.verisign-grs.com]
++ * [Redirected to whois.corporatedomains.com]
++ * [Querying whois.corporatedomains.com]
++ * [whois.verisign-grs.com]
++ * ...text of the reply...
++ * [whois.corporatedomains.com]
++ * ...text of the reply...
++ *
++ * With -a, no "DOMAIN" -> "domain DOMAIN" transformation is attempted.
++
++ * With -n, the first reply is shown, redirects are not followed:
++ * [Querying whois.verisign-grs.com]
++ * [whois.verisign-grs.com]
++ * ...text of the reply...
++ */
++
+ int whois_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+ int whois_main(int argc UNUSED_PARAM, char **argv)
+ {
+ int port = 43;
+- const char *host = "whois-servers.net";
++ const char *host = "whois.iana.org";
+
+ opt_complementary = "-1:p+";
+ getopt32(argv, "h:p:", &host, &port);
+-
+ argv += optind;
++
+ do {
+- int fd = create_and_connect_stream_or_die(host, port);
+- fdprintf(fd, "%s\r\n", *argv);
+- pipe_out(fd);
++ recursive_query(host, port, *argv);
+ }
+ while (*++argv);
+
+--
+2.9.1
+