| [PATCH] fix in6_pktinfo build issue on Linux |
| |
| From http://roy.marples.name/projects/dhcpcd/vpatch?from=e05490e2d12d03b1&to=c32714545158ca83 |
| |
| Give up on _BSD_SOURCE and use _GNU_SOURCE for Linux. This is requires for |
| newer Linux headers as there is no easy way to get at the in6_pktinfo |
| structure, so we have to fallback to the glibc variant which requires |
| _GNU_SOURCE being set. This does have the advantage of no longer sprinkling |
| _GNU_SOURCE around and no longer having to cast ipi.ipi_ifindex but may |
| break compile on older Linux. |
| |
| Signed-off-by: Peter Korsgaard <peter@korsgaard.com> |
| -- |
| |
| Index: common.c |
| ================================================================== |
| --- a/common.c |
| +++ b/common.c |
| @@ -23,15 +23,10 @@ |
| * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
| * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
| * SUCH DAMAGE. |
| */ |
| |
| -/* Needed define to get at getline for glibc and FreeBSD */ |
| -#ifndef _GNU_SOURCE |
| -# define _GNU_SOURCE |
| -#endif |
| - |
| #ifdef __APPLE__ |
| # include <mach/mach_time.h> |
| # include <mach/kern_return.h> |
| #endif |
| |
| |
| Index: configure |
| ================================================================== |
| --- a/configure |
| +++ b/configure |
| @@ -358,27 +358,25 @@ |
| echo "There is no fork" |
| echo "CPPFLAGS+= -DTHERE_IS_NO_FORK" >>$CONFIG_MK |
| fi |
| |
| case "$OS" in |
| -kfreebsd*) |
| +freebsd*|kfreebsd*) |
| echo "CPPFLAGS+= -D_GNU_SOURCE" >>$CONFIG_MK |
| echo "DHCPCD_SRCS+= if-bsd.c" >>$CONFIG_MK |
| ;; |
| linux*) |
| - echo "CPPFLAGS+= -D_BSD_SOURCE -D_XOPEN_SOURCE=700" >>$CONFIG_MK |
| + echo "CPPFLAGS+= -D_GNU_SOURCE" >>$CONFIG_MK |
| # Large File Support, should be fine for 32-bit systems. |
| # But if this is the case, why is it not set by default? |
| echo "CPPFLAGS+= -D_FILE_OFFSET_BITS=64" >>$CONFIG_MK |
| echo "CPPFLAGS+= -D_LARGEFILE_SOURCE" >>$CONFIG_MK |
| echo "CPPFLAGS+= -D_LARGEFILE64_SOURCE" >>$CONFIG_MK |
| - # glibc-2.20 |
| - echo "CPPFLAGS+= -D_DEFAULT_SOURCE" >>$CONFIG_MK |
| echo "DHCPCD_SRCS+= if-linux.c" >>$CONFIG_MK |
| # for RTM_NEWADDR and friends |
| - echo "#include <asm/types.h> /* fix broken headers */" >>$CONFIG_H |
| - echo "#include <linux/rtnetlink.h>" >>$CONFIG_H |
| + echo "#include <asm/types.h> /* fix broken headers */" >>$CONFIG_H |
| + echo "#include <linux/rtnetlink.h>" >>$CONFIG_H |
| ;; |
| qnx*) |
| echo "CPPFLAGS+= -D__EXT" >>$CONFIG_MK |
| echo "DHCPCD_SRCS+= if-bsd.c" >>$CONFIG_MK |
| ;; |
| @@ -592,11 +590,10 @@ |
| fi |
| |
| if [ -z "$GETLINE" ]; then |
| printf "Testing for getline ... " |
| cat <<EOF >_getline.c |
| -#define _GNU_SOURCE |
| #include <stdio.h> |
| int main(void) { |
| char *buf = NULL; |
| size_t n = 0; |
| getline(&buf, &n, stdin); |
| |
| Index: dhcp6.c |
| ================================================================== |
| --- a/dhcp6.c |
| +++ b/dhcp6.c |
| @@ -1149,11 +1149,11 @@ |
| return -1; |
| cm->cmsg_level = IPPROTO_IPV6; |
| cm->cmsg_type = IPV6_PKTINFO; |
| cm->cmsg_len = CMSG_LEN(sizeof(pi)); |
| memset(&pi, 0, sizeof(pi)); |
| - pi.ipi6_ifindex = CAST_IPI6_IFINDEX(ifp->index); |
| + pi.ipi6_ifindex = ifp->index; |
| memcpy(CMSG_DATA(cm), &pi, sizeof(pi)); |
| |
| if (sendmsg(ctx->dhcp_fd, &ctx->sndhdr, 0) == -1) { |
| logger(ifp->ctx, LOG_ERR, |
| "%s: %s: sendmsg: %m", ifp->name, __func__); |
| |
| Index: eloop.c |
| ================================================================== |
| --- a/eloop.c |
| +++ b/eloop.c |
| @@ -23,13 +23,10 @@ |
| * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
| * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
| * SUCH DAMAGE. |
| */ |
| |
| -/* Needed for ppoll(2) */ |
| -#define _GNU_SOURCE |
| - |
| #include <sys/time.h> |
| |
| #include <errno.h> |
| #include <limits.h> |
| #include <signal.h> |
| |
| Index: ipv6.h |
| ================================================================== |
| --- a/ipv6.h |
| +++ b/ipv6.h |
| @@ -27,18 +27,12 @@ |
| |
| #ifndef IPV6_H |
| #define IPV6_H |
| |
| #include <sys/uio.h> |
| - |
| #include <netinet/in.h> |
| |
| -#if defined(__linux__) && defined(__GLIBC__) |
| -# define _LINUX_IN6_H |
| -# include <linux/ipv6.h> |
| -#endif |
| - |
| #include "config.h" |
| #include "dhcpcd.h" |
| |
| #define ALLROUTERS "ff02::2" |
| |
| Index: ipv6nd.c |
| ================================================================== |
| --- a/ipv6nd.c |
| +++ b/ipv6nd.c |
| @@ -293,11 +293,11 @@ |
| return; |
| cm->cmsg_level = IPPROTO_IPV6; |
| cm->cmsg_type = IPV6_PKTINFO; |
| cm->cmsg_len = CMSG_LEN(sizeof(pi)); |
| memset(&pi, 0, sizeof(pi)); |
| - pi.ipi6_ifindex = CAST_IPI6_IFINDEX(ifp->index); |
| + pi.ipi6_ifindex = ifp->index; |
| memcpy(CMSG_DATA(cm), &pi, sizeof(pi)); |
| |
| logger(ifp->ctx, LOG_DEBUG, |
| "%s: sending Router Solicitation", ifp->name); |
| if (sendmsg(ctx->nd_fd, &ctx->sndhdr, 0) == -1) { |
| |