Diff for /embedaddon/mtr/ui/dns.c between versions 1.1.1.1 and 1.1.1.3

version 1.1.1.1, 2019/10/21 14:25:31 version 1.1.1.3, 2023/09/27 11:18:58
Line 3 Line 3
     Copyright (C) 1997,1998  Matt Kimball      Copyright (C) 1997,1998  Matt Kimball
   
     This program is free software; you can redistribute it and/or modify      This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License version 2 as     it under the terms of the GNU General Public License version 2 as
     published by the Free Software Foundation.      published by the Free Software Foundation.
   
     This program is distributed in the hope that it will be useful,      This program is distributed in the hope that it will be useful,
Line 11 Line 11
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     GNU General Public License for more details.      GNU General Public License for more details.
   
    You should have received a copy of the GNU General Public License    You should have received a copy of the GNU General Public License along
    along with this program; if not, write to the Free Software    with this program; if not, write to the Free Software Foundation, Inc.,
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */  */
   
 /*  /*
Line 41 Line 41
 #include "dns.h"  #include "dns.h"
 #include "net.h"  #include "net.h"
 #include "utils.h"  #include "utils.h"
   #include "packet/sockaddr.h"
   
 struct dns_results {  struct dns_results {
     ip_t ip;      ip_t ip;
Line 51  struct dns_results { Line 52  struct dns_results {
 static struct dns_results *results;  static struct dns_results *results;
   
 char *strlongip(  char *strlongip(
    struct mtr_ctl *ctl,    sa_family_t family,
     ip_t * ip)      ip_t * ip)
 {  {
 #ifdef ENABLE_IPV6  #ifdef ENABLE_IPV6
     static char addrstr[INET6_ADDRSTRLEN];      static char addrstr[INET6_ADDRSTRLEN];
   
    return (char *) inet_ntop(ctl->af, ip, addrstr, sizeof addrstr);    return (char *) inet_ntop(family, ip, addrstr, sizeof addrstr);
 #else  #else
     return inet_ntoa(*ip);      return inet_ntoa(*ip);
 #endif  #endif
Line 86  static int longipstr( Line 87  static int longipstr(
 }  }
   
   
 struct hostent *dns_forward(  
     const char *name)  
 {  
     struct hostent *host;  
   
     if ((host = gethostbyname(name)))  
         return host;  
     else  
         return NULL;  
 }  
   
   
 static struct dns_results *findip(  static struct dns_results *findip(
     struct mtr_ctl *ctl,      struct mtr_ctl *ctl,
     ip_t * ip)      ip_t * ip)
Line 105  static struct dns_results *findip( Line 94  static struct dns_results *findip(
     struct dns_results *t;      struct dns_results *t;
   
     for (t = results; t; t = t->next) {      for (t = results; t; t = t->next) {
        if (addrcmp((void *) ip, (void *) &t->ip, ctl->af) == 0)        if (addrcmp(ip, &t->ip, ctl->af) == 0)
             return t;              return t;
     }      }
   
Line 113  static struct dns_results *findip( Line 102  static struct dns_results *findip(
 }  }
   
 static void set_sockaddr_ip(  static void set_sockaddr_ip(
    struct mtr_ctl *ctl,    sa_family_t family,
     struct sockaddr_storage *sa,      struct sockaddr_storage *sa,
     ip_t * ip)      ip_t * ip)
 {  {
     struct sockaddr_in *sa_in;  
     struct sockaddr_in6 *sa_in6;  
   
     memset(sa, 0, sizeof(struct sockaddr_storage));      memset(sa, 0, sizeof(struct sockaddr_storage));
    switch (ctl->af) {    sa->ss_family = family;
    case AF_INET:    memcpy(sockaddr_addr_offset(sa), ip, sockaddr_addr_size(sa));
        sa_in = (struct sockaddr_in *) sa; 
        sa_in->sin_family = ctl->af; 
        addrcpy((void *) &sa_in->sin_addr, (void *) ip, ctl->af); 
        break; 
    case AF_INET6: 
        sa_in6 = (struct sockaddr_in6 *) sa; 
        sa_in6->sin6_family = ctl->af; 
        addrcpy((void *) &sa_in6->sin6_addr, (void *) ip, ctl->af); 
        break; 
    } 
 }  }
   
 void dns_open(  void dns_open(
    struct mtr_ctl *ctl)    void)
 {  {
     int pid;      int pid;
   
Line 162  void dns_open( Line 138  void dns_open(
             error(EXIT_FAILURE, errno, "signal");              error(EXIT_FAILURE, errno, "signal");
         }          }
   
        /* Close all unneccessary FDs.        /* Close all unnecessary FDs.
            for debugging and error reporting, keep std-in/out/err. */             for debugging and error reporting, keep std-in/out/err. */
         for (i = 3; i < fromdns[1]; i++) {          for (i = 3; i < fromdns[1]; i++) {
             if (i == todns[0])              if (i == todns[0])
Line 185  void dns_open( Line 161  void dns_open(
   
                 buf[strlen(buf) - 1] = 0;       /* chomp newline. */                  buf[strlen(buf) - 1] = 0;       /* chomp newline. */
   
                longipstr(buf, &host, ctl->af);                sa_family_t family = (buf[0] == '4') ? AF_INET : AF_INET6;
                set_sockaddr_ip(ctl, &sa, &host);                longipstr(buf +1, &host, family);
                salen = (ctl->af == AF_INET) ? sizeof(struct sockaddr_in) :                set_sockaddr_ip(family, &sa, &host);
                 salen = (family == AF_INET) ? sizeof(struct sockaddr_in) :
                     sizeof(struct sockaddr_in6);                      sizeof(struct sockaddr_in6);
   
                 rv = getnameinfo((struct sockaddr *) &sa, salen,                  rv = getnameinfo((struct sockaddr *) &sa, salen,
                                  hostname, sizeof(hostname), NULL, 0, 0);                                   hostname, sizeof(hostname), NULL, 0, 0);
                 if (rv == 0) {                  if (rv == 0) {
                     snprintf(result, sizeof(result),                      snprintf(result, sizeof(result),
                             "%s %s\n", strlongip(ctl, &host), hostname);                             "%s %s\n", strlongip(family, &host), hostname);
   
                     rv = write(fromdns[1], result, strlen(result));                      rv = write(fromdns[1], result, strlen(result));
                     if (rv < 0)                      if (rv < 0)
Line 268  char *dns_lookup2( Line 245  char *dns_lookup2(
     ip_t * ip)      ip_t * ip)
 {  {
     struct dns_results *r;      struct dns_results *r;
    char buf[INET6_ADDRSTRLEN + 1];    char buf[INET6_ADDRSTRLEN + 2]; // af_byte + addr + null
     int rv;      int rv;
   
     r = findip(ctl, ip);      r = findip(ctl, ip);
Line 276  char *dns_lookup2( Line 253  char *dns_lookup2(
         /* we've got a result. */          /* we've got a result. */
         if (r->name)          if (r->name)
             return r->name;              return r->name;
         else  
             return strlongip(ctl, ip);  
     } else {      } else {
         r = xmalloc(sizeof(struct dns_results));          r = xmalloc(sizeof(struct dns_results));
         memcpy(&r->ip, ip, sizeof(r->ip));          memcpy(&r->ip, ip, sizeof(r->ip));
         r->name = NULL;          r->name = NULL;
         r->next = results;          r->next = results;
         results = r;          results = r;
        snprintf(buf, sizeof(buf), "%s\n", strlongip(ctl, ip));        char ip4or6 = (ctl->af == AF_INET) ? '4' : '6';
         snprintf(buf, sizeof(buf), "%c%s\n", ip4or6, strlongip(ctl->af, ip));
         rv = write(todns[1], buf, strlen(buf));          rv = write(todns[1], buf, strlen(buf));
         if (rv < 0)          if (rv < 0)
             error(0, errno, "couldn't write to resolver process");              error(0, errno, "couldn't write to resolver process");
     }      }
    return strlongip(ctl, ip);    return NULL;
 }  }
   
   
Line 302  char *dns_lookup( Line 278  char *dns_lookup(
     if (!ctl->dns || !ctl->use_dns)      if (!ctl->dns || !ctl->use_dns)
         return NULL;          return NULL;
     t = dns_lookup2(ctl, ip);      t = dns_lookup2(ctl, ip);
    return t;    return t ? t : strlongip(ctl->af, ip);
 }  }
   
 /* XXX check if necessary/exported. */  /* XXX check if necessary/exported. */

Removed from v.1.1.1.1  
changed lines
  Added in v.1.1.1.3


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>