[systemd-devel] [PATCH 2/2] Support IPv6-less systems with runtime check.

2010-09-20 Thread Fabiano Fidencio
This patch introduces socket_ipv6_is_supported() call that checks for
IPv6 availability. Code then check for it before using specific calls.

In order to be less intrusive, this patch avoids IPv6 entries being
parsed at all, this way we don't get such entries in the system and
all other code paths are automatically ignored. However an extra check
is done at socket_address_listen() to make sure of that.

As the number of Netlink messages is not know upfront anymore,
loopback-setup.c was refactored to dynamically calculate the sequence
number and count.

Lennart's suggestions were fixed and squashed with the original patch,
that was sent by Gustavo Sverzut Barbieri (barbi...@profusion.mobi).
---
 src/loopback-setup.c |   46 +-
 src/socket-util.c|   42 --
 src/socket-util.h|2 ++
 src/socket.c |6 --
 4 files changed, 63 insertions(+), 33 deletions(-)

diff --git a/src/loopback-setup.c b/src/loopback-setup.c
index c852ed7..a579060 100644
--- a/src/loopback-setup.c
+++ b/src/loopback-setup.c
@@ -33,14 +33,7 @@
 #include util.h
 #include macro.h
 #include loopback-setup.h
-
-enum {
-REQUEST_NONE = 0,
-REQUEST_ADDRESS_IPV4 = 1,
-REQUEST_ADDRESS_IPV6 = 2,
-REQUEST_FLAGS = 4,
-REQUEST_ALL = 7
-};
+#include socket-util.h
 
 #define NLMSG_TAIL(nmsg)\
 ((struct rtattr *) (((uint8_t*) (nmsg)) + 
NLMSG_ALIGN((nmsg)-nlmsg_len)))
@@ -89,7 +82,7 @@ static ssize_t recvfrom_loop(int fd, void *buf, size_t 
buf_len, int flags, struc
 }
 }
 
-static int add_adresses(int fd, int if_loopback) {
+static int add_adresses(int fd, int if_loopback, unsigned *requests) {
 union {
 struct sockaddr sa;
 struct sockaddr_nl nl;
@@ -110,7 +103,7 @@ static int add_adresses(int fd, int if_loopback) {
 request.header.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifaddrmsg));
 request.header.nlmsg_type = RTM_NEWADDR;
 request.header.nlmsg_flags = NLM_F_REQUEST|NLM_F_CREATE|NLM_F_ACK;
-request.header.nlmsg_seq = REQUEST_ADDRESS_IPV4;
+request.header.nlmsg_seq = *requests + 1;
 
 ifaddrmsg = NLMSG_DATA(request.header);
 ifaddrmsg-ifa_family = AF_INET;
@@ -127,9 +120,13 @@ static int add_adresses(int fd, int if_loopback) {
 
 if (sendto_loop(fd, request, request.header.nlmsg_len, 0, sa.sa, 
sizeof(sa))  0)
 return -errno;
+(*requests)++;
+
+if (!socket_ipv6_is_supported())
+return 0;
 
 request.header.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifaddrmsg));
-request.header.nlmsg_seq = REQUEST_ADDRESS_IPV6;
+request.header.nlmsg_seq = *requests + 1;
 
 ifaddrmsg-ifa_family = AF_INET6;
 ifaddrmsg-ifa_prefixlen = 128;
@@ -139,11 +136,12 @@ static int add_adresses(int fd, int if_loopback) {
 
 if (sendto_loop(fd, request, request.header.nlmsg_len, 0, sa.sa, 
sizeof(sa))  0)
 return -errno;
+(*requests)++;
 
 return 0;
 }
 
-static int start_interface(int fd, int if_loopback) {
+static int start_interface(int fd, int if_loopback, unsigned *requests) {
 union {
 struct sockaddr sa;
 struct sockaddr_nl nl;
@@ -161,7 +159,7 @@ static int start_interface(int fd, int if_loopback) {
 request.header.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));
 request.header.nlmsg_type = RTM_NEWLINK;
 request.header.nlmsg_flags = NLM_F_REQUEST|NLM_F_ACK;
-request.header.nlmsg_seq = REQUEST_FLAGS;
+request.header.nlmsg_seq = *requests + 1;
 
 ifinfomsg = NLMSG_DATA(request.header);
 ifinfomsg-ifi_family = AF_UNSPEC;
@@ -175,10 +173,12 @@ static int start_interface(int fd, int if_loopback) {
 if (sendto_loop(fd, request, request.header.nlmsg_len, 0, sa.sa, 
sizeof(sa))  0)
 return -errno;
 
+(*requests)++;
+
 return 0;
 }
 
-static int read_response(int fd) {
+static int read_response(int fd, unsigned requests_max) {
 union {
 struct sockaddr sa;
 struct sockaddr_nl nl;
@@ -208,7 +208,7 @@ static int read_response(int fd) {
 
 if (response.header.nlmsg_type != NLMSG_ERROR ||
 (pid_t) response.header.nlmsg_pid != getpid() ||
-response.header.nlmsg_seq = REQUEST_ALL)
+response.header.nlmsg_seq = requests_max)
 return 0;
 
 if ((size_t) l  NLMSG_LENGTH(sizeof(struct nlmsgerr)) ||
@@ -232,8 +232,7 @@ int loopback_setup(void) {
 struct sockaddr_nl nl;
 struct sockaddr_storage storage;
 } sa;
-int requests = REQUEST_NONE;
-
+unsigned requests = 0, i;
 int fd;
 
 errno = 0;
@@ -251,19 +250,16 @@ int loopback_setup(void) {
 

Re: [systemd-devel] [PATCH 2/2] Support IPv6-less systems with runtime check.

2010-09-20 Thread Lennart Poettering
On Mon, 20.09.10 16:33, Fabiano Fidencio (fiden...@profusion.mobi) wrote:

 This patch introduces socket_ipv6_is_supported() call that checks for
 IPv6 availability. Code then check for it before using specific calls.

Made some minimal changes (downgraded the error messages and made them
more elaborate; fixed error handling in some areas) and then commited
it. Thanks!

Lennart

-- 
Lennart Poettering - Red Hat, Inc.
___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel