Back to index

glibc  2.9
getipv4sourcefilter.c File Reference
#include <alloca.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <sys/param.h>
#include <sys/socket.h>

Go to the source code of this file.


int getipv4sourcefilter (int s, struct in_addr interface, struct in_addr group, uint32_t *fmode, uint32_t *numsrc, struct in_addr *slist)

Function Documentation

int getipv4sourcefilter ( int  s,
struct in_addr  interface,
struct in_addr  group,
uint32_t fmode,
uint32_t numsrc,
struct in_addr slist 

Definition at line 31 of file getipv4sourcefilter.c.

  /* We have to create an struct ip_msfilter object which we can pass
     to the kernel.  */
  socklen_t needed = IP_MSFILTER_SIZE (*numsrc);
  int use_alloca = __libc_use_alloca (needed);

  struct ip_msfilter *imsf;
  if (use_alloca)
    imsf = (struct ip_msfilter *) alloca (needed);
      imsf = (struct ip_msfilter *) malloc (needed);
      if (imsf == NULL)
       return -1;

  imsf->imsf_multiaddr = group;
  imsf->imsf_interface = interface;
  imsf->imsf_numsrc = *numsrc;

  int result = __getsockopt (s, SOL_IP, IP_MSFILTER, imsf, &needed);

  /* If successful, copy the results to the places the caller wants
     them in.  */
  if (result == 0)
      *fmode = imsf->imsf_fmode;
      memcpy (slist, imsf->imsf_slist,
             MIN (*numsrc, imsf->imsf_numsrc) * sizeof (struct in_addr));
      *numsrc = imsf->imsf_numsrc;

  if (! use_alloca)
      int save_errno = errno;
      free (imsf);
      __set_errno (save_errno);

  return result;

Here is the call graph for this function: