Diff for /embedaddon/arping/src/unix.c between versions 1.1.1.1 and 1.1.1.3

version 1.1.1.1, 2014/06/15 16:26:43 version 1.1.1.3, 2021/03/16 23:40:57
Line 2 Line 2
  *   *
  *  Copyright (C) 2000-2011 Thomas Habets <thomas@habets.se>   *  Copyright (C) 2000-2011 Thomas Habets <thomas@habets.se>
  *   *
 *  This library is free software; you can redistribute it and/or *  This program is free software; you can redistribute it and/or modify
 *  modify it under the terms of the GNU General Public *  it under the terms of the GNU General Public License as published by
 *  License as published by the Free Software Foundation; either *  the Free Software Foundation; either version 2 of the License, or
 *  version 2 of the License, or (at your option) any later version. *  (at your option) any later version.
  *   *
 *  This library is distributed in the hope that it will be useful, *  This program is distributed in the hope that it will be useful,
  *  but WITHOUT ANY WARRANTY; without even the implied warranty of   *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  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 along   *  You should have received a copy of the GNU General Public License along
  *  with this program; if not, write to the Free Software Foundation, Inc.,   *  with this program; if not, write to the Free Software Foundation, Inc.,
Line 20 Line 20
 #include "config.h"  #include "config.h"
 #endif  #endif
   
   #include <errno.h>
 #include <signal.h>  #include <signal.h>
   #include <string.h>
   
   #if HAVE_SYS_SOCKET_H
   #include <sys/socket.h>
   #endif
   
   #if HAVE_NETINET_IN_H
   #include <netinet/in.h>
   #endif
   
 #include <pcap.h>  #include <pcap.h>
   
 #include "arping.h"  #include "arping.h"
   
   #define UNUSED(x) (void)(x)
   
 /**  /**
  * Fall back on getting device name from pcap.   * Fall back on getting device name from pcap.
  */   */
 const char *  const char *
 arping_lookupdev_default(uint32_t srcip, uint32_t dstip, char *ebuf)  arping_lookupdev_default(uint32_t srcip, uint32_t dstip, char *ebuf)
 {  {
   #ifdef HAVE_PCAP_FINDALLDEVS
           UNUSED(srcip);
           pcap_if_t *ifs = NULL;
           int rc = pcap_findalldevs(&ifs, ebuf);
           if (rc) {
                   return NULL;
           }
   
           pcap_if_t *t;
           char* ifname = NULL;
           for (t = ifs; !ifname && t; t = t->next) {
   #ifdef PCAP_IF_LOOPBACK
                   if (t->flags & PCAP_IF_LOOPBACK) {
                           continue;
                   }
   #endif
   #ifdef PCAP_IF_UP
                   if (!(t->flags & PCAP_IF_UP)) {
                           continue;
                   }
   #endif
   
                   // This code is only called when using -F, which is "don't try
                   // to be smart". If we wanted to be smart we would have used
                   // findif_*.c.
                   if (1) {
                           ifname = strdup(t->name); // Memory leak.
                           break;
                   }
   
                   // UNREACHABLE
                   pcap_addr_t *a;
                   for (a = t->addresses; !ifname && a; a = a->next) {
                           if (a->addr->sa_family != AF_INET) {
                                   continue;
                           }
                           const struct sockaddr_in* sa = (struct sockaddr_in*)a->addr;
                           const struct sockaddr_in* smask = (struct sockaddr_in*)a->netmask;
                           const uint32_t addr = sa->sin_addr.s_addr;
                           const uint32_t mask = smask->sin_addr.s_addr;
                           if ((addr & mask) != (dstip & mask)) {
                                   // Not optimal: memory leak.
                                   ifname = strdup(t->name);
                           }
                   }
           }
           pcap_freealldevs(ifs);
           return ifname;
   #else
           UNUSED(srcip);
           UNUSED(dstip);
         return pcap_lookupdev(ebuf);          return pcap_lookupdev(ebuf);
   #endif
 }  }
   
 /**  /**
Line 41  arping_lookupdev_default(uint32_t srcip, uint32_t dsti Line 105  arping_lookupdev_default(uint32_t srcip, uint32_t dsti
 void  void
 do_signal_init()  do_signal_init()
 {  {
        signal(SIGINT, sigint);        if (SIG_ERR == signal(SIGINT, sigint)) {
                 fprintf(stderr, "arping: failed to set SIGINT handler: %s\n",
                         strerror(errno));
         }
 }  }
 /* ---- Emacs Variables ----  /* ---- Emacs Variables ----
  * Local Variables:   * Local Variables:

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


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