"Fossies" - the Fresh Open Source Software Archive

Member "iftop-0.17/addrs_ioctl.c" (24 Dec 2005, 3537 Bytes) of package /linux/privat/old/iftop-0.17.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. See also the latest Fossies "Diffs" side-by-side code changes report for "addrs_ioctl.c": 1.0pre4_vs_0.17.

    1 /*
    2  * addrs_ioctl.c:
    3  *
    4  * Provides the get_addrs_ioctl() function for use on systems that
    5  * support a simple socket ioctl for acquiring low-level ethernet
    6  * information about interfaces.
    7  *
    8  */
    9 
   10 #include <stdio.h>
   11 #include <stdlib.h>
   12 #include <unistd.h>
   13 #include <string.h>
   14 
   15 #include <sys/types.h>
   16 #include <sys/ioctl.h>
   17 #include <sys/socket.h>
   18 #include <net/if.h>
   19 #include <netinet/in.h>
   20 
   21 #if defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__
   22 #include <sys/param.h>
   23 #include <sys/sysctl.h>
   24 #include <net/if_dl.h>
   25 #endif
   26 
   27 #include "iftop.h"
   28 
   29 /*
   30  * This function identifies the IP address and ethernet address for the requested
   31  * interface
   32  *
   33  * This function returns -1 on catastrophic failure, or a bitwise OR of the
   34  * following values:
   35  *
   36  * 1 - Was able to get the ethernet address
   37  * 2 - Was able to get the IP address
   38  *
   39  * This function should return 3 if all information was found
   40  */
   41 
   42 int
   43 get_addrs_ioctl(char *interface, char if_hw_addr[], struct in_addr *if_ip_addr)
   44 {
   45   int s;
   46   struct ifreq ifr = {};
   47   int got_hw_addr = 0;
   48   int got_ip_addr = 0;
   49 
   50   /* -- */
   51 
   52   s = socket(PF_INET, SOCK_DGRAM, 0); /* any sort of IP socket will do */
   53 
   54   if (s == -1) {
   55     perror("socket");
   56     return -1;
   57   }
   58 
   59   fprintf(stderr,"interface: %s\n", interface);
   60 
   61   memset(if_hw_addr, 0, 6);
   62   strncpy(ifr.ifr_name, interface, IFNAMSIZ);
   63 
   64 #ifdef SIOCGIFHWADDR
   65   if (ioctl(s, SIOCGIFHWADDR, &ifr) < 0) {
   66     fprintf(stderr, "Error getting hardware address for interface: %s\n", interface); 
   67     perror("ioctl(SIOCGIFHWADDR)");
   68   }
   69   else {
   70     memcpy(if_hw_addr, ifr.ifr_hwaddr.sa_data, 6);
   71     got_hw_addr = 1;
   72   }
   73 #else
   74 #if defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__
   75   {
   76     int sysctlparam[6] = {CTL_NET, PF_ROUTE, 0, 0, NET_RT_IFLIST, 0};
   77     size_t needed = 0;
   78     char *buf = NULL;
   79     struct if_msghdr *msghdr = NULL;
   80     sysctlparam[5] = if_nametoindex(interface);
   81     if (sysctlparam[5] == 0) {
   82       fprintf(stderr, "Error getting hardware address for interface: %s\n", interface);
   83       goto ENDHWADDR;
   84     }
   85     if (sysctl(sysctlparam, 6, NULL, &needed, NULL, 0) < 0) {
   86       fprintf(stderr, "Error getting hardware address for interface: %s\n", interface);
   87       goto ENDHWADDR;
   88     }
   89     if ((buf = malloc(needed)) == NULL) {
   90       fprintf(stderr, "Error getting hardware address for interface: %s\n", interface);
   91       goto ENDHWADDR;
   92     }
   93     if (sysctl(sysctlparam, 6, buf, &needed, NULL, 0) < 0) {
   94       fprintf(stderr, "Error getting hardware address for interface: %s\n", interface);
   95       free(buf);
   96       goto ENDHWADDR;
   97     }
   98     msghdr = (struct if_msghdr *) buf;
   99     memcpy(if_hw_addr, LLADDR((struct sockaddr_dl *)(buf + sizeof(struct if_msghdr) - sizeof(struct if_data) + sizeof(struct if_data))), 6);
  100     free(buf);
  101     got_hw_addr = 1;
  102 
  103   ENDHWADDR:
  104     1; /* compiler whines if there is a label at the end of a block...*/
  105   }
  106 #else
  107   fprintf(stderr, "Cannot obtain hardware address on this platform\n");
  108 #endif
  109 #endif
  110   
  111   /* Get the IP address of the interface */
  112 #ifdef SIOCGIFADDR
  113   (*(struct sockaddr_in *) &ifr.ifr_addr).sin_family = AF_INET;
  114   if (ioctl(s, SIOCGIFADDR, &ifr) < 0) {
  115     fprintf(stderr, "Unable to get IP address for interface: %s\n", interface); 
  116     perror("ioctl(SIOCGIFADDR)");
  117   }
  118   else {
  119     memcpy(if_ip_addr, &((*(struct sockaddr_in *) &ifr.ifr_addr).sin_addr), sizeof(struct in_addr));
  120     got_ip_addr = 2;
  121   }
  122 #else
  123   fprintf(stderr, "Cannot obtain IP address on this platform\n");
  124 #endif
  125   
  126   close(s);
  127 
  128   return got_hw_addr + got_ip_addr;
  129 }