svn commit: samba r8672 - in trunk/source/lib: .

tridge at samba.org tridge at samba.org
Thu Jul 21 08:45:22 GMT 2005


Author: tridge
Date: 2005-07-21 08:45:21 +0000 (Thu, 21 Jul 2005)
New Revision: 8672

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=8672

Log:
merged from samba4

Modified:
   trunk/source/lib/socket_wrapper.c


Changeset:
Modified: trunk/source/lib/socket_wrapper.c
===================================================================
--- trunk/source/lib/socket_wrapper.c	2005-07-21 08:42:17 UTC (rev 8671)
+++ trunk/source/lib/socket_wrapper.c	2005-07-21 08:45:21 UTC (rev 8672)
@@ -56,6 +56,13 @@
 #undef malloc
 #undef calloc
 #undef strdup
+/* we need to use a very terse format here as IRIX 6.4 silently
+   truncates names to 16 chars, so if we use a longer name then we
+   can't tell which port a packet came from with recvfrom() 
+   
+   with this format we have 8 chars left for the directory name
+*/
+#define SOCKET_FORMAT "%u_%u"
 
 static struct sockaddr *sockaddr_dup(const void *data, socklen_t len)
 {
@@ -102,7 +109,7 @@
 	p = strrchr(un->sun_path, '/');
 	if (p) p++; else p = un->sun_path;
 
-	if (sscanf(p, "sock_ip_%d_%u", &type, &prt) == 2) {
+	if (sscanf(p, SOCKET_FORMAT, &type, &prt) == 2) {
 		in->sin_port = htons(prt);
 	}
 	in->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
@@ -119,12 +126,12 @@
 		/* handle auto-allocation of ephemeral ports */
 		prt = 5000;
 		do {
-			snprintf(un->sun_path, sizeof(un->sun_path), "%s/sock_ip_%d_%u", 
+			snprintf(un->sun_path, sizeof(un->sun_path), "%s/"SOCKET_FORMAT, 
 				 getenv("SOCKET_WRAPPER_DIR"), type, ++prt);
 		} while (stat(un->sun_path, &st) == 0 && prt < 10000);
 		((struct sockaddr_in *)si->myname)->sin_port = htons(prt);
 	} 
-	snprintf(un->sun_path, sizeof(un->sun_path), "%s/sock_ip_%d_%u", 
+	snprintf(un->sun_path, sizeof(un->sun_path), "%s/"SOCKET_FORMAT, 
 		 getenv("SOCKET_WRAPPER_DIR"), type, prt);
 	return 0;
 }
@@ -230,6 +237,8 @@
 		return real_accept(s, addr, addrlen);
 	}
 
+	memset(&un_addr, 0, sizeof(un_addr));
+
 	ret = real_accept(s, (struct sockaddr *)&un_addr, &un_addrlen);
 	if (ret == -1) return ret;
 
@@ -270,7 +279,7 @@
 	
 	for (i=0;i<1000;i++) {
 		snprintf(un_addr.sun_path, sizeof(un_addr.sun_path), 
-			 "%s/sock_ip_%u_%u", getenv("SOCKET_WRAPPER_DIR"), 
+			 "%s/"SOCKET_FORMAT, getenv("SOCKET_WRAPPER_DIR"), 
 			 SOCK_DGRAM, i + 10000);
 		if (bind(si->fd, (struct sockaddr *)&un_addr, 
 			 sizeof(un_addr)) == 0) {
@@ -458,6 +467,8 @@
 		return real_recvfrom(s, buf, len, flags, from, fromlen);
 	}
 
+	/* irix 6.4 forgets to null terminate the sun_path string :-( */
+	memset(&un_addr, 0, sizeof(un_addr));
 	ret = real_recvfrom(s, buf, len, flags, (struct sockaddr *)&un_addr, &un_addrlen);
 	if (ret == -1) 
 		return ret;



More information about the samba-cvs mailing list