zeroconf: fix setsockopt() call on Solaris to send payload of correct length
authorDanek Duvall <danek.duvall@oracle.com>
Wed, 24 Feb 2016 22:22:18 -0800
changeset 28249 c16949fcb566
parent 28248 851c41a21869
child 28250 6d0d11731e1c
zeroconf: fix setsockopt() call on Solaris to send payload of correct length The zeroconf extension has been broken on Solaris since the beginning, but no one noticed until the testsuite started poking it after changeset 72f2a19c5f88, when it started running "hg paths" with the extension enabled. Solaris requires that, for IP_MULTICAST_{TTL,LOOP}, the argument passed in be of length 1. With the original code here, it gets passed in as an int -- length 4 -- and so the system call fails with EINVAL. Thankfully, Python's socket.setsockopt() allows you to pass in a string instead of an integer, and it passes that string to libc's setsockopt() with the correct value and length.
hgext/zeroconf/Zeroconf.py
--- a/hgext/zeroconf/Zeroconf.py	Wed Feb 03 04:54:40 2016 +0000
+++ b/hgext/zeroconf/Zeroconf.py	Wed Feb 24 22:22:18 2016 -0800
@@ -1266,8 +1266,8 @@
 			# work as expected.
 			#
 			pass
-		self.socket.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_TTL, 255)
-		self.socket.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_LOOP, 1)
+		self.socket.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_TTL, "\xff")
+		self.socket.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_LOOP, "\x01")
 		try:
 			self.socket.bind(self.group)
 		except Exception: