From 3917487cb46d4d21f4f23c64da8f04f54136b596 Mon Sep 17 00:00:00 2001 From: Thomas Bernard Date: Sat, 7 Jan 2012 11:40:50 +0100 Subject: [PATCH] The multicast interface can now be specified by name with IPv4 --- miniupnpc/Changelog.txt | 8 +++++++- miniupnpc/Makefile | 6 +++--- miniupnpc/miniupnpc.c | 30 ++++++++++++++++++++++++++---- miniupnpc/upnpc.c | 4 ++-- 4 files changed, 38 insertions(+), 10 deletions(-) diff --git a/miniupnpc/Changelog.txt b/miniupnpc/Changelog.txt index 121eb1a..9d00083 100644 --- a/miniupnpc/Changelog.txt +++ b/miniupnpc/Changelog.txt @@ -1,6 +1,12 @@ -$Id: Changelog.txt,v 1.153 2011/09/12 09:52:01 nanard Exp $ +$Id: Changelog.txt,v 1.157 2012/01/07 10:13:24 nanard Exp $ miniUPnP client Changelog. +2012/01/07: + The multicast interface can now be specified by name with IPv4. + +2012/01/02: + Install man page + 2011/11/25: added header to Port Mappings list in upnpc.c diff --git a/miniupnpc/Makefile b/miniupnpc/Makefile index a53ff89..b7da023 100644 --- a/miniupnpc/Makefile +++ b/miniupnpc/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.81 2011/06/21 15:24:14 nanard Exp $ +# $Id: Makefile,v 1.84 2012/01/07 10:13:25 nanard Exp $ # MiniUPnP Project # http://miniupnp.free.fr/ # (c) 2005-2011 Thomas Bernard @@ -12,7 +12,7 @@ OS = $(shell uname -s) CC ?= gcc #AR = gar #CFLAGS = -O -Wall -g -DDEBUG -CFLAGS ?= -O -Wall -DNDEBUG -DMINIUPNPC_SET_SOCKET_TIMEOUT -Wstrict-prototypes +CFLAGS ?= -O -Wall -DNDEBUG -DMINIUPNPC_SET_SOCKET_TIMEOUT -Wstrict-prototypes -D_BSD_SOURCE # -DNO_GETADDRINFO INSTALL = install SH = /bin/sh @@ -94,7 +94,7 @@ endif .PHONY: install clean depend all check everything \ - installpythonmodule + installpythonmodule updateversion # validateminixml validateminiwget all: $(LIBRARY) $(EXECUTABLES) diff --git a/miniupnpc/miniupnpc.c b/miniupnpc/miniupnpc.c index 809c529..fc18abf 100644 --- a/miniupnpc/miniupnpc.c +++ b/miniupnpc/miniupnpc.c @@ -1,4 +1,4 @@ -/* $Id: miniupnpc.c,v 1.96 2011/09/12 09:52:01 nanard Exp $ */ +/* $Id: miniupnpc.c,v 1.98 2012/01/07 10:21:25 nanard Exp $ */ /* Project : miniupnp * Author : Thomas BERNARD * copyright (c) 2005-2011 Thomas Bernard @@ -16,6 +16,10 @@ #endif #endif +#if !defined(__OpenBSD__) +#define HAS_IP_MREQN +#endif + #include #include #include @@ -497,10 +501,28 @@ upnpDiscover(int delay, const char * multicastif, } else { struct in_addr mc_if; mc_if.s_addr = inet_addr(multicastif); /* ex: 192.168.x.x */ - ((struct sockaddr_in *)&sockudp_r)->sin_addr.s_addr = mc_if.s_addr; - if(setsockopt(sudp, IPPROTO_IP, IP_MULTICAST_IF, (const char *)&mc_if, sizeof(mc_if)) < 0) + if(mc_if.s_addr != INADDR_NONE) { - PRINT_SOCKET_ERROR("setsockopt"); + ((struct sockaddr_in *)&sockudp_r)->sin_addr.s_addr = mc_if.s_addr; + if(setsockopt(sudp, IPPROTO_IP, IP_MULTICAST_IF, (const char *)&mc_if, sizeof(mc_if)) < 0) + { + PRINT_SOCKET_ERROR("setsockopt"); + } + } else { +#ifdef HAS_IP_MREQN + /* was not an ip address, try with an interface name */ + struct ip_mreqn reqn; /* only defined with -D_BSD_SOURCE or -D_GNU_SOURCE */ + memset(&reqn, 0, sizeof(struct ip_mreqn)); + reqn.imr_ifindex = if_nametoindex(multicastif); + if(setsockopt(sudp, IPPROTO_IP, IP_MULTICAST_IF, (const char *)&reqn, sizeof(reqn)) < 0) + { + PRINT_SOCKET_ERROR("setsockopt"); + } +#else +#ifdef DEBUG + printf("Setting of multicast interface not supported with interface name.\n"); +#endif +#endif } } } diff --git a/miniupnpc/upnpc.c b/miniupnpc/upnpc.c index 7d0f81a..56c6411 100644 --- a/miniupnpc/upnpc.c +++ b/miniupnpc/upnpc.c @@ -1,4 +1,4 @@ -/* $Id: upnpc.c,v 1.88 2011/06/17 23:31:01 nanard Exp $ */ +/* $Id: upnpc.c,v 1.90 2012/01/07 10:13:26 nanard Exp $ */ /* Project : miniupnp * Author : Thomas Bernard * Copyright (c) 2005-2011 Thomas Bernard @@ -531,7 +531,7 @@ int main(int argc, char ** argv) fprintf(stderr, "Options:\n"); fprintf(stderr, " -6 : use ip v6 instead of ip v4.\n"); fprintf(stderr, " -u url : bypass discovery process by providing the XML root description url.\n"); - fprintf(stderr, " -m address/interface : provide ip address (ip v4) or interface name (ip v6) to use for sending SSDP multicast packets.\n"); + fprintf(stderr, " -m address/interface : provide ip address (ip v4) or interface name (ip v4 or v6) to use for sending SSDP multicast packets.\n"); fprintf(stderr, " -p path : use this path for MiniSSDPd socket.\n"); return 1; }