On 5 July 2016 at 22:13, Vito Mulè <[email protected]> wrote: > On 5 July 2016 at 12:36, Bernhard Reutner-Fischer <[email protected]> > 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è" <[email protected]> >> 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@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@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' <[email protected]> > > 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 <[email protected]> > + * modified by Vito Mule' <[email protected]> > * 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, _______________________________________________ busybox mailing list [email protected] http://lists.busybox.net/mailman/listinfo/busybox
