1 /* Set source filter. Linux version.
2 Copyright (C) 2004 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4 Contributed by Ulrich Drepper <drepper@redhat.com>, 2004.
6 The GNU C Library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
11 The GNU C Library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with the GNU C Library; if not, write to the Free
18 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
25 #include <netinet/in.h>
26 #include <sys/socket.h>
29 /* Defined in getsourcefilter.c. */
30 extern int __get_sol (int af
, socklen_t len
);
34 setsourcefilter (int s
, uint32_t interface
, const struct sockaddr
*group
,
35 socklen_t grouplen
, uint32_t fmode
, uint32_t numsrc
,
36 const struct sockaddr_storage
*slist
)
38 /* We have to create an struct ip_msfilter object which we can pass
40 size_t needed
= GROUP_FILTER_SIZE (numsrc
);
41 int use_alloca
= __libc_use_alloca (needed
);
43 struct group_filter
*gf
;
45 gf
= (struct group_filter
*) alloca (needed
);
48 gf
= (struct group_filter
*) malloc (needed
);
53 gf
->gf_interface
= interface
;
54 memcpy (&gf
->gf_group
, group
, grouplen
);
56 gf
->gf_numsrc
= numsrc
;
57 memcpy (gf
->gf_slist
, slist
, numsrc
* sizeof (struct sockaddr_storage
));
59 /* We need to provide the appropriate socket level value. */
60 int sol
= __get_sol (group
->sa_family
, grouplen
);
67 int result
= __setsockopt (s
, sol
, MCAST_MSFILTER
, gf
, needed
);
71 int save_errno
= errno
;
73 __set_errno (save_errno
);