From 710e1df5852f07271e2e6a9f9c0acbc698acfd56 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Fri, 12 Jun 1992 10:39:36 +0000 Subject: [PATCH] Some UNIX types want the exact size of the address structure --- Modules/socketmodule.c | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 200310e61fc..21ddf62bbd8 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();