Your message dated Fri, 14 Oct 2011 22:02:38 +0000
with message-id <[email protected]>
and subject line Bug#606565: fixed in sysvinit 2.88dsf-13.12
has caused the Debian Bug report #606565,
regarding sysvinit: Shut down network interfaces correctly on BSDs
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact [email protected]
immediately.)


-- 
606565: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=606565
Debian Bug Tracking System
Contact [email protected] with problems
--- Begin Message ---
Package: sysvinit
Version: 2.88dsf-13
Severity: normal
Tags: patch
User: [email protected]
Usertags: kfreebsd

Hi!

On BSDs (and particularly on GNU/kFreeBSD) the halt code to shut down
network interfaces is buggy. The problem stems from the fact that
SIOCGIFCONF has some portability issues.

On Linux the buffer returned is a list of consecutive ifreq structs,
each of the same size. On the BSDs the ifreq structs can have
different sizes, depending on the sockaddr length, but always with at
least a size of ifreq. So the next ifreq struct has to be computed
dynamically. I'm using _SIZEOF_ADDR_IFREQ because at least the BSDs
provide that macro, so it might avoid the need to define it at all.

Because the package does not have any kind of configure support I've
hardcoded a list of systems that have the sa_len member in struct
sockaddr, those same that have variable ifreq structs returned from
SIOCGIFCONF.

The patch also fixes few more things:

* The loopback interface on BSDs can be named as something like lo0,
  so check only the first two characters.
* On the BSDs the ifr_flags is split into two shorts, and to properly
  change its value, it needs to be composed from both ifr_flags and
  ifr_flagshigh, we use a temporary for that now.

This shows up on GNU/kFreeBSD as extremely ugly errors on halt/reboot as
the interface name is garbage, the SIOCGIFFLAGS fails and then prints
that garbage string stating that it's not a known device or file. It's
also confusing the fact that the error messages are prefixed with
"ifdown" which might incorrectly point people to ifupdown. This might
be worth changing too, though.

Patch attached.

thanks,
guillem
---
 src/ifdown.c |   72 +++++++++++++++++++++++++++++++++++++++++------------------
 1 file changed, 51 insertions(+), 21 deletions(-)

--- a/src/ifdown.c
+++ b/src/ifdown.c
@@ -37,6 +37,23 @@ char *v_ifdown = "@(#)ifdown.c  1.11  02
 
 #define MAX_IFS	64
 
+/* XXX: Ideally this would get detected at configure time... */
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || \
+    defined(__NetBSD__) || defined(__OpenBSD__)
+#define HAVE_SOCKADDR_SA_LEN 1
+#endif
+
+#ifndef _SIZEOF_ADDR_IFREQ
+#ifdef HAVE_SOCKADDR_SA_LEN
+#define _SIZEOF_ADDR_IFREQ(ifr) \
+	((ifr).ifr_addr.sa_len > sizeof(struct sockaddr) ? \
+	 (sizeof((ifr).ifr_name) + (ifr).ifr_addr.sa_len) : \
+	  sizeof(struct ifreq))
+#else
+#define _SIZEOF_ADDR_IFREQ(ifr) sizeof(struct ifreq)
+#endif
+#endif
+
 /*
  *	First, we find all shaper devices and down them. Then we
  *	down all real interfaces. This is because the comment in the
@@ -45,10 +62,10 @@ char *v_ifdown = "@(#)ifdown.c  1.11  02
  */
 int ifdown(void)
 {
-	struct ifreq ifr[MAX_IFS];
+	char ifr_buf[sizeof(struct ifreq) * MAX_IFS];
+	char *ifr_end;
 	struct ifconf ifc;
-	int i, fd;
-	int numif;
+	int fd;
 	int shaper;
 
 	if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
@@ -56,8 +73,8 @@ int ifdown(void)
 		perror("socket");
 		return -1;
 	}
-	ifc.ifc_len = sizeof(ifr);
-	ifc.ifc_req = ifr;
+	ifc.ifc_len = sizeof(ifr_buf);
+	ifc.ifc_buf = ifr_buf;
 
 	if (ioctl(fd, SIOCGIFCONF, &ifc) < 0) {
 		fprintf(stderr, "ifdown: ");
@@ -65,42 +82,55 @@ int ifdown(void)
 		close(fd);
 		return -1;
 	}
-	numif = ifc.ifc_len / sizeof(struct ifreq);
+	ifr_end = ifr_buf + ifc.ifc_len;
 
 	for (shaper = 1; shaper >= 0; shaper--) {
-		for (i = 0; i < numif; i++) {
+		char *ifr_next = ifr_buf;
+
+		while (ifr_next < ifr_end) {
+			struct ifreq *ifr;
+			int flags;
 
-			if ((strncmp(ifr[i].ifr_name, "shaper", 6) == 0)
+			ifr = (struct ifreq *)ifr_next;
+			ifr_next += _SIZEOF_ADDR_IFREQ(*ifr);
+
+			if ((strncmp(ifr->ifr_name, "shaper", 6) == 0)
 			    != shaper) continue;
 
-			if (strcmp(ifr[i].ifr_name, "lo") == 0)
+			if (strncmp(ifr->ifr_name, "lo", 2) == 0)
 				continue;
-			if (strchr(ifr[i].ifr_name, ':') != NULL)
+			if (strchr(ifr->ifr_name, ':') != NULL)
 				continue;
 
 			/* Read interface flags */
-			if (ioctl(fd, SIOCGIFFLAGS, &ifr[i]) < 0) {
+			if (ioctl(fd, SIOCGIFFLAGS, ifr) < 0) {
 				fprintf(stderr, "ifdown: shutdown ");
-				perror(ifr[i].ifr_name);
+				perror(ifr->ifr_name);
 				continue;
 			}
 			/*
 			 * Expected in <net/if.h> according to
 			 * "UNIX Network Programming".
 			 */
-#ifdef ifr_flags
-# define IRFFLAGS	ifr_flags
-#else	/* Present on kFreeBSD */
-# define IRFFLAGS	ifr_flagshigh
+#ifdef ifr_flagshigh
+			flags = (ifr->ifr_flags & 0xffff) |
+			        (ifr->ifr_flagshigh << 16);
+#else
+			flags = ifr->ifr_flags;
+#endif
+			if (flags & IFF_UP) {
+				flags &= ~(IFF_UP);
+#ifdef ifr_flagshigh
+				ifr->ifr_flags = flags & 0xffff;
+				ifr->ifr_flagshigh = flags >> 16;
+#else
+				ifr->ifr_flags = flags;
 #endif
-			if (ifr[i].IRFFLAGS & IFF_UP) {
-				ifr[i].IRFFLAGS &= ~(IFF_UP);
-				if (ioctl(fd, SIOCSIFFLAGS, &ifr[i]) < 0) {
+				if (ioctl(fd, SIOCSIFFLAGS, ifr) < 0) {
 					fprintf(stderr, "ifdown: shutdown ");
-					perror(ifr[i].ifr_name);
+					perror(ifr->ifr_name);
 				}
 			}
-#undef IRFFLAGS
 		}
 	}
 	close(fd);

--- End Message ---
--- Begin Message ---
Source: sysvinit
Source-Version: 2.88dsf-13.12

We believe that the bug you reported is fixed in the latest version of
sysvinit, which is due to be installed in the Debian FTP archive:

initscripts_2.88dsf-13.12_kfreebsd-i386.deb
  to main/s/sysvinit/initscripts_2.88dsf-13.12_kfreebsd-i386.deb
sysv-rc_2.88dsf-13.12_all.deb
  to main/s/sysvinit/sysv-rc_2.88dsf-13.12_all.deb
sysvinit-utils_2.88dsf-13.12_kfreebsd-i386.deb
  to main/s/sysvinit/sysvinit-utils_2.88dsf-13.12_kfreebsd-i386.deb
sysvinit_2.88dsf-13.12.diff.gz
  to main/s/sysvinit/sysvinit_2.88dsf-13.12.diff.gz
sysvinit_2.88dsf-13.12.dsc
  to main/s/sysvinit/sysvinit_2.88dsf-13.12.dsc
sysvinit_2.88dsf-13.12_kfreebsd-i386.deb
  to main/s/sysvinit/sysvinit_2.88dsf-13.12_kfreebsd-i386.deb



A summary of the changes between this version and the previous one is
attached.

Thank you for reporting the bug, which will now be closed.  If you
have further comments please address them to [email protected],
and the maintainer will reopen the bug report if appropriate.

Debian distribution maintenance software
pp.
Robert Millan <[email protected]> (supplier of updated sysvinit package)

(This message was generated automatically at their request; if you
believe that there is a problem with it please contact the archive
administrators by mailing [email protected])


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Format: 1.8
Date: Fri, 14 Oct 2011 23:27:34 +0200
Source: sysvinit
Binary: sysvinit sysvinit-utils sysv-rc initscripts
Architecture: source kfreebsd-i386 all
Version: 2.88dsf-13.12
Distribution: unstable
Urgency: low
Maintainer: Debian sysvinit maintainers 
<[email protected]>
Changed-By: Robert Millan <[email protected]>
Description: 
 initscripts - scripts for initializing and shutting down the system
 sysv-rc    - System-V-like runlevel change mechanism
 sysvinit   - System-V-like init utilities
 sysvinit-utils - System-V-like utilities
Closes: 587162 606565 634514
Changes: 
 sysvinit (2.88dsf-13.12) unstable; urgency=low
 .
   * Non-maintainer upload.
   * 92_kfreebsd_ifdown.patch: Shut down network interfaces correctly on 
GNU/kFreeBSD.
     Thanks Guillem.  (Closes: #606565)
   * Replace `ttyd' with `cuau' in inittab for GNU/kFreeBSD.  Thanks Tuco.
     (Closes: #587162)
   * Use linux-any in debian/control to avoid hardcoded lists of non-Linux
     arches.  (Closes: #634514)
Checksums-Sha1: 
 3751344e95a201641d282656489fbfb5a939d735 1613 sysvinit_2.88dsf-13.12.dsc
 61e760819dd5ca9c401175b5e6e83321e718d47c 179752 sysvinit_2.88dsf-13.12.diff.gz
 6dec17d01d13c1624ff6c17863323639c63cf4f8 117552 
sysvinit_2.88dsf-13.12_kfreebsd-i386.deb
 25a6461ffc3ec9a3a75208a666f5b82370ef2c0e 121072 
sysvinit-utils_2.88dsf-13.12_kfreebsd-i386.deb
 f648ab91e78965a84109dc748d280dce602573a0 76350 
initscripts_2.88dsf-13.12_kfreebsd-i386.deb
 97f106b04567ad0a2e51612d7684e15ba59b81a3 78794 sysv-rc_2.88dsf-13.12_all.deb
Checksums-Sha256: 
 51f89bd14c4e1ef72831a56b3780b8edf7fe2f557ba4db9b3da5642bae1071a9 1613 
sysvinit_2.88dsf-13.12.dsc
 de078e4103322bac14a2720e500b9e9f5992da245b4e8a21aa52f03aecd9a1dd 179752 
sysvinit_2.88dsf-13.12.diff.gz
 5ddf4874918a678803db489ece57c5bc3b38d2ccca115b14297ea5df6450553f 117552 
sysvinit_2.88dsf-13.12_kfreebsd-i386.deb
 d006cacba15fc3d22f48fc1abb04038f60b1ce732c9c278af28add597a818489 121072 
sysvinit-utils_2.88dsf-13.12_kfreebsd-i386.deb
 295a979f7c133a0ac3adbce480585091e4808e8c79db469c7c40fcbff7be56d8 76350 
initscripts_2.88dsf-13.12_kfreebsd-i386.deb
 6d8c1dce76f0595771cd97c41e268efa47678f453f41da2b2090b6ad39b5e271 78794 
sysv-rc_2.88dsf-13.12_all.deb
Files: 
 9da323d8a42d5eb625438a3c8609c085 1613 admin required sysvinit_2.88dsf-13.12.dsc
 77b59a1f105dc00d6b896a3e5b0178e0 179752 admin required 
sysvinit_2.88dsf-13.12.diff.gz
 6368510731a644befd55bf18f42cd159 117552 admin required 
sysvinit_2.88dsf-13.12_kfreebsd-i386.deb
 3ce458677f8337599ff9b18eb6992061 121072 admin required 
sysvinit-utils_2.88dsf-13.12_kfreebsd-i386.deb
 cb9af135043cdf8b76a508fc91260398 76350 admin required 
initscripts_2.88dsf-13.12_kfreebsd-i386.deb
 dfaf145808331dbe9a2b7e46438f9fea 78794 admin required 
sysv-rc_2.88dsf-13.12_all.deb

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/kFreeBSD)

iEYEARECAAYFAk6Yra4ACgkQC19io6rUCv/edACfd9Nitok4Ao+bMSBhkvS2jSHm
80AAn0TNIJ059aNn9A6s7b+DqCyKCsfX
=53SM
-----END PGP SIGNATURE-----



--- End Message ---
_______________________________________________
Pkg-sysvinit-devel mailing list
[email protected]
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-sysvinit-devel

Reply via email to