Annotation of embedaddon/arping/src/findif_getifaddrs.c, revision 1.1
1.1 ! misho 1: /* arping/src/findif_getifaddrs.c
! 2: *
! 3: * Copyright (C) 2000-2011 Thomas Habets <thomas@habets.se>
! 4: *
! 5: * This library is free software; you can redistribute it and/or
! 6: * modify it under the terms of the GNU General Public
! 7: * License as published by the Free Software Foundation; either
! 8: * version 2 of the License, or (at your option) any later version.
! 9: *
! 10: * This library is distributed in the hope that it will be useful,
! 11: * but WITHOUT ANY WARRANTY; without even the implied warranty of
! 12: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
! 13: * General Public License for more details.
! 14: *
! 15: * You should have received a copy of the GNU General Public License along
! 16: * with this program; if not, write to the Free Software Foundation, Inc.,
! 17: * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
! 18: */
! 19: /**
! 20: * Most modern systems should have getifaddrs().
! 21: */
! 22: #if HAVE_CONFIG_H
! 23: #include "config.h"
! 24: #endif
! 25:
! 26: #include <stdio.h>
! 27: #include <string.h>
! 28: #include <errno.h>
! 29: #include <sys/types.h>
! 30: #include <sys/socket.h>
! 31: #include <sys/ioctl.h>
! 32: #include <ifaddrs.h>
! 33: #include <net/if.h>
! 34: #include <netinet/in.h>
! 35:
! 36: #include "arping.h"
! 37:
! 38: const char *
! 39: arping_lookupdev(uint32_t srcip,
! 40: uint32_t dstip,
! 41: char *ebuf)
! 42: {
! 43: struct ifaddrs *ifa = NULL;
! 44: struct ifaddrs *cur;
! 45: const char *ret = NULL;
! 46: int match_count = 0; /* Matching interfaces */
! 47:
! 48: /* best match */
! 49: in_addr_t best_mask = 0;
! 50: in_addr_t best_addr;
! 51:
! 52: /* Results */
! 53: static char ifname[IFNAMSIZ];
! 54:
! 55: if (getifaddrs(&ifa)) {
! 56: if (verbose) {
! 57: printf("getifaddrs(): %s\n", strerror(errno));
! 58: }
! 59: goto out;
! 60: }
! 61: for (cur = ifa; cur; cur = cur->ifa_next) {
! 62: in_addr_t addr, mask;
! 63:
! 64: if (!(cur->ifa_flags & IFF_UP)) {
! 65: continue;
! 66: }
! 67: if (!cur->ifa_addr
! 68: || !cur->ifa_netmask
! 69: || !cur->ifa_name) {
! 70: continue;
! 71: }
! 72: if (cur->ifa_addr->sa_family != AF_INET) {
! 73: continue;
! 74: }
! 75: if (cur->ifa_flags & (IFF_LOOPBACK|IFF_POINTOPOINT)) {
! 76: continue;
! 77: }
! 78: addr =((struct sockaddr_in*)cur->ifa_addr)->sin_addr.s_addr;
! 79: mask =((struct sockaddr_in*)cur->ifa_netmask)->sin_addr.s_addr;
! 80: if ((addr & mask) != (dstip & mask)) {
! 81: continue;
! 82: }
! 83: match_count++;
! 84: if (ntohl(mask) > ntohl(best_mask)) {
! 85: memset(ifname, 0, sizeof(ifname));
! 86: strncpy(ifname, cur->ifa_name, sizeof(ifname)-1);
! 87: best_addr = addr;
! 88: best_mask = mask;
! 89: }
! 90: }
! 91: if (match_count) {
! 92: ret = ifname;
! 93: if (verbose) {
! 94: printf("Autodetected interface %s\n", ret);
! 95: }
! 96: } else {
! 97: if (verbose) {
! 98: printf("Failed to find iface using getifaddrs().\n");
! 99: }
! 100: }
! 101: out:
! 102: if (ifa) {
! 103: freeifaddrs(ifa);
! 104: }
! 105: return ret;
! 106: }
! 107: /* ---- Emacs Variables ----
! 108: * Local Variables:
! 109: * c-basic-offset: 8
! 110: * indent-tabs-mode: nil
! 111: * End:
! 112: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>