[PATCH] Bug 9076 - Whois using a non working host for queries by default
Vito Mulè
mule.vito at gmail.com
Tue Jul 5 23:40:37 UTC 2016
On 5 July 2016 at 23:44, Bernhard Reutner-Fischer <rep.dot.nop at gmail.com>
wrote:
>Remove odd code until size whois.o is about 300 bytes in total, i'd say.
>cheers,
I managed to go down to 264 bytes, removed all the unused code and used strrchr
as suggested instead of strtok, thanks.
Got rid also of func pipe_out, put the needed logic into main.
Cheers
Signed-off-by: Vito Mule' <mulevito at gmail.com>
function old new delta
whois_server - 225 +225
whois_main 133 242 +109
WHOIS_HOST - 15 +15
pipe_out 85 - -85
------------------------------------------------------------------------------
(add/remove: 2/1 grow/shrink: 1/0 up/down: 349/-85) Total: 264
bytes
---
networking/whois.c | 49 ++++++++++++++++++++++++++++++++++++++++---------
1 file changed, 40 insertions(+), 9 deletions(-)
(add/remove: 2/1 grow/shrink: 1/0 up/down: 349/-85) Total: 264
bytes
diff --git a/networking/whois.c b/networking/whois.c
index bf33033..c9cd51e 100644
--- a/networking/whois.c
+++ b/networking/whois.c
@@ -3,6 +3,7 @@
* whois - tiny client for the whois directory service
*
* Copyright (c) 2011 Pere Orga <gotrunks at gmail.com>
+ * Copyright (c) 2016 Vito Mule' <mulevito at gmail.com>
* Licensed under GPLv2 or later, see file LICENSE in this source tree.
*/
/* TODO
@@ -28,38 +29,69 @@
#include "libbb.h"
-static void pipe_out(int fd)
+static const char WHOIS_HOST[] = "whois.iana.org";
+#define WHOIS_HOST_LEN 63
+#define WHOIS_PORT 43
+
+/* Gets tld from NAME to find right whois sever. */
+/* Called only from main once. */
+void whois_server(char* host, char *argv_host)
{
FILE *fp;
char buf[1024];
+ char * tld = strrchr(argv_host, '.');
+ /* don't support querying TLD objects for now */
+ if (tld == NULL || ++tld == NULL)
+ exit(1);
+
+ int fd = create_and_connect_stream_or_die(WHOIS_HOST, WHOIS_PORT);
+ fdprintf(fd, "%s\r\n", tld);
+
fp = xfdopen_for_read(fd);
while (fgets(buf, sizeof(buf), fp)) {
char *p = strpbrk(buf, "\r\n");
if (p)
*p = '\0';
- puts(buf);
+ if (strstr(buf,"whois:") != NULL) {
+ char * whois_hostname = strrchr(buf, ' ');
+ if (whois_hostname == NULL || ++whois_hostname == NULL)
+ exit(1);
+ strncpy(host, whois_hostname, WHOIS_HOST_LEN);
+ }
}
-
- fclose(fp); /* closes fd too */
+ fclose(fp);
}
int whois_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int whois_main(int argc UNUSED_PARAM, char **argv)
{
+
+ char *host = malloc(WHOIS_HOST_LEN);
int port = 43;
- const char *host = "whois-servers.net";
opt_complementary = "-1:p+";
getopt32(argv, "h:p:", &host, &port);
-
argv += optind;
+
+ if (strlen(host) < 1)
+ whois_server(host, *argv);
do {
int fd = create_and_connect_stream_or_die(host, port);
fdprintf(fd, "%s\r\n", *argv);
- pipe_out(fd);
+ FILE *fp;
+ char buf[1024];
+
+ fp = xfdopen_for_read(fd);
+ while (fgets(buf, sizeof(buf), fp)) {
+ char *p = strpbrk(buf, "\r\n");
+ if (p)
+ *p = '\0';
+ puts(buf);
+ }
+ fclose(fp); /* closes fd too */
}
while (*++argv);
-
return EXIT_SUCCESS;
}
On 5 July 2016 at 23:44, Bernhard Reutner-Fischer <rep.dot.nop at gmail.com>
wrote:
> On 5 July 2016 at 22:13, Vito Mulè <mule.vito at gmail.com> wrote:
> > On 5 July 2016 at 12:36, Bernhard Reutner-Fischer <rep.dot.nop at gmail.com
> >
> > wrote:
> > On Tue, Jul 05, 2016 at 12:48:36PM +0200, Bernhard Reutner-Fischer wrote:
> >> On July 5, 2016 12:26:07 PM GMT+02:00, "Vito Mulè" <mule.vito at gmail.com
> >
> >> wrote:
> >>
> >>
> >> Care to send an updated patch, including bloat-o-meter output?
> >
> > Hello I managed to get the whois server hostname as you suggested, please
> > let me know what you think.
> > Patch also attached to the bug
> > Thanks
> >
> > vmule at agent4:~/busybox.old$ ./busybox_unstripped whois nic.ikano
> > Domain Name: nic.ikano
> > Domain ID: D0000000007-IKANO
> > WHOIS Server: whois.nic.ikano
> > Referral URL: http://www.nic.ikano/
> >
> > vmule at agent4:~/busybox.old$ ./busybox_unstripped whois amazon.it
> >
> > Domain: amazon.it
> > Status: ok
> > Created: 2000-02-10 00:00:00
> > Last Update: 2016-01-28 00:47:21
> > Expire Date: 2017-01-12
> >
> >
> >
> > Signed-off-by: Vito Mule' <mulevito at gmail.com>
> >
> > function old new delta
> > whois_host - 277 +277
> > whois_main 133 277 +144
> > WHOIS_HOST - 15 +15
> >
> ------------------------------------------------------------------------------
> > (add/remove: 2/0 grow/shrink: 1/0 up/down: 436/0) Total: 436
> > bytes
>
> Sill way too big ;)
> >
> > ---
> > networking/whois.c | 78
> >
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------
> > 1 file changed, 68 insertions(+), 10 deletions(-)
> >
> > diff --git a/networking/whois.c b/networking/whois.c
> > index bf33033..052f079 100644
> > --- a/networking/whois.c
> > +++ b/networking/whois.c
> > @@ -3,6 +3,7 @@
> > * whois - tiny client for the whois directory service
> > *
> > * Copyright (c) 2011 Pere Orga <gotrunks at gmail.com>
> > + * modified by Vito Mule' <mulevito at gmail.com>
> > * Licensed under GPLv2 or later, see file LICENSE in this source tree.
> > */
> > /* TODO
> > @@ -28,6 +29,11 @@
> >
> > #include "libbb.h"
> >
> > +static const char WHOIS_HOST[] = "whois.iana.org";
> > +#define WHOIS_HOST_LEN 128
> > +#define WHOIS_DOMAIN_LEN 32
>
> A domain label can be at most 63 characters long.
> meinedomainistschwerzulesenjedochgenaudreiundsechzigzeichenlang.at
> looooooooooooooooooooooooooooooooooooooooooooooooooooooooooongc.at
>
> > +#define WHOIS_PORT 43
> > +
> > static void pipe_out(int fd)
> > {
> > FILE *fp;
> > @@ -36,30 +42,82 @@ static void pipe_out(int fd)
> > fp = xfdopen_for_read(fd);
> > while (fgets(buf, sizeof(buf), fp)) {
> > char *p = strpbrk(buf, "\r\n");
> > - if (p)
> > + if (p) {
> > *p = '\0';
> > + }
> > puts(buf);
> > }
> > -
> > fclose(fp); /* closes fd too */
> > }
> >
> > +/* Gets tld from NAME to find right whois sever. */
> > +/* Called only from main for each NAME*/
> > +void whois_host(char* host, char *argv_host)
>
> should thus be named whois_server() or, better yet, fold it into
> whois_main?
>
> > +{
> > + FILE *fp;
> > + char buf[1024];
> > + char domain[WHOIS_DOMAIN_LEN];
> > + char *str_token = strdup(argv_host);
> > +
> > + if (strlen(host) >= 1) {
> > + memset(&host[0], 0, WHOIS_HOST_LEN);
> > + }
> > + char *domain_token = strtok(str_token, ".");
> > + while (domain_token != NULL) {
> > + strncpy(domain, domain_token, WHOIS_DOMAIN_LEN);
> > + domain_token = strtok(NULL, ".");
> > + }
>
> char * tld = strrchr(argv_host, '.');
> /* don't support querying TLD objects for now */
> if (tld == NULL || ++tld == NULL)
> exit(1);
>
> > + int fd = create_and_connect_stream_or_die(WHOIS_HOST, WHOIS_PORT);
> > + fdprintf(fd, "%s\r\n", domain);
>
> s/domain/tld/;
>
> > +
> > + fp = xfdopen_for_read(fd);
> > + while (fgets(buf, sizeof(buf), fp)) {
> > + char *p = strpbrk(buf, "\r\n");
> > + if (p) {
> > + *p = '\0';
> > + }
> > + if (strstr(buf,"whois:") != NULL) {
> > + char *whois_token = strtok(buf, " ");
> > + whois_token = strtok(NULL, " ");
> > + strncpy(host, whois_token, WHOIS_HOST_LEN);
> > + }
> > + }
> > + fclose(fp);
> > + free(str_token);
> > +}
> > +
> > int whois_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
> > int whois_main(int argc UNUSED_PARAM, char **argv)
> > {
> > +
> > + char *host = malloc(WHOIS_HOST_LEN);
> > int port = 43;
> > - const char *host = "whois-servers.net";
> >
> > 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);
> > +
> > + if (strlen(host) < 1) {
> > + do {
> > + if (strlen(*argv) >= 67) {
> > + dprintf(1, "Invalid request: %s\n", *argv);
> > + return EXIT_FAILURE;
> > + }
> > + whois_host(host, *argv);
> > + int fd = create_and_connect_stream_or_die(host, port);
> > + fdprintf(fd, "%s\r\n", *argv);
> > + pipe_out(fd);
> > + }
> > + while (*++argv);
> > + free(host);
> > + } else {
> > + do {
> > + int fd = create_and_connect_stream_or_die(host, port);
> > + fdprintf(fd, "%s\r\n", *argv);
> > + pipe_out(fd);
> > + }
>
> It is generally expensive to have the same code twice in there. Just
> setup the server if -h was not given. The
> create_and_connect_stream_or_die etc is a common thing to do
> afterwards.
>
> Remove odd code until size whois.o is about 300 bytes in total, i'd say.
> cheers,
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.busybox.net/pipermail/busybox/attachments/20160706/8b98a4d0/attachment-0001.html>
More information about the busybox
mailing list