Some UNIX types want the exact size of the address structure
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index 200310e..21ddf62 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -317,6 +317,39 @@
}
+/* Get the address length according to the socket object's address family.
+ Return 1 if the family is known, 0 otherwise. The length is returned
+ through len_ret. */
+
+static int
+getsockaddrlen(s, len_ret)
+ sockobject *s;
+ int *len_ret;
+{
+ switch (s->sock_family) {
+
+ case AF_UNIX:
+ {
+ *len_ret = sizeof (struct sockaddr_un);
+ return 1;
+ }
+
+ case AF_INET:
+ {
+ *len_ret = sizeof (struct sockaddr_in);
+ return 1;
+ }
+
+ /* More cases here... */
+
+ default:
+ err_setstr(SocketError, "getsockaddrarg: bad family");
+ return 0;
+
+ }
+}
+
+
/* s.accept() method */
static object *
@@ -329,7 +362,8 @@
object *res;
if (!getnoarg(args))
return NULL;
- addrlen = sizeof addrbuf;
+ if (!getsockaddrlen(s, &addrlen))
+ return NULL;
newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
if (newfd < 0)
return socket_error();