summaryrefslogtreecommitdiffstats
path: root/Modules/socketmodule.c
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1992-06-12 10:39:36 (GMT)
committerGuido van Rossum <guido@python.org>1992-06-12 10:39:36 (GMT)
commit710e1df5852f07271e2e6a9f9c0acbc698acfd56 (patch)
treefa7841ab2ceb4cac00106702df8de2ac53c225e5 /Modules/socketmodule.c
parentdfd6e4677944172e98a3d04d4e9a7d440f0b1414 (diff)
downloadcpython-710e1df5852f07271e2e6a9f9c0acbc698acfd56.zip
cpython-710e1df5852f07271e2e6a9f9c0acbc698acfd56.tar.gz
cpython-710e1df5852f07271e2e6a9f9c0acbc698acfd56.tar.bz2
Some UNIX types want the exact size of the address structure
Diffstat (limited to 'Modules/socketmodule.c')
-rw-r--r--Modules/socketmodule.c36
1 files changed, 35 insertions, 1 deletions
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 @@ getsockaddrarg(s, args, addr_ret, len_ret)
}
+/* 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 @@ sock_accept(s, args)
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();