Back to index

glibc  2.9
Functions
ifreq.h File Reference
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <net/if.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

static struct ifreq__if_nextreq (struct ifreq *ifr)
void __ifreq (struct ifreq **ifreqs, int *num_ifs, int sockfd)
static void __if_freereq (struct ifreq *ifreqs, int num_ifs)

Function Documentation

static void __if_freereq ( struct ifreq ifreqs,
int  num_ifs 
) [inline, static]

Definition at line 41 of file ifreq.h.

{
  free (ifreqs);
}

Here is the caller graph for this function:

static struct ifreq* __if_nextreq ( struct ifreq ifr) [static, read]

Definition at line 28 of file ifreq.h.

{
#ifdef _HAVE_SA_LEN
  if (ifr->ifr_addr.sa_len > sizeof ifr->ifr_addr)
    return (struct ifreq *) ((char *) &ifr->ifr_addr + ifr->ifr_addr.sa_len);
#endif
  return ifr + 1;
}

Here is the caller graph for this function:

void __ifreq ( struct ifreq **  ifreqs,
int num_ifs,
int  sockfd 
)

Definition at line 24 of file ifreq.c.

{
  int fd = sockfd;
  struct ifconf ifc;
  int rq_len;
  int nifs;
# define RQ_IFS      4

  if (fd < 0)
    fd = __opensock ();
  if (fd < 0)
    {
      *num_ifs = 0;
      *ifreqs = NULL;
      return;
    }

  ifc.ifc_buf = NULL;
  rq_len = RQ_IFS * sizeof (struct ifreq) / 2; /* Doubled in the loop.  */
  do
    {
      ifc.ifc_len = rq_len *= 2;
      void *newp = realloc (ifc.ifc_buf, ifc.ifc_len);
      if (newp == NULL || __ioctl (fd, SIOCGIFCONF, &ifc) < 0)
       {
         free (ifc.ifc_buf);

         if (fd != sockfd)
           __close (fd);
         *num_ifs = 0;
         *ifreqs = NULL;
         return;
       }
      ifc.ifc_buf = newp;
    }
  while (rq_len < sizeof (struct ifreq) + ifc.ifc_len);

  if (fd != sockfd)
    __close (fd);

#ifdef _HAVE_SA_LEN
  struct ifreq *ifr = *ifreqs;
  nifs = 0;
  while ((char *) ifr < ifc.ifc_buf + ifc.ifc_len)
    {
      ++nifs;
      ifr = __if_nextreq (ifr);
      if (ifr == NULL)
       break;
    }
#else
  nifs = ifc.ifc_len / sizeof (struct ifreq);
#endif

  *num_ifs = nifs;
  *ifreqs = realloc (ifc.ifc_buf, nifs * sizeof (struct ifreq));
}

Here is the call graph for this function:

Here is the caller graph for this function: