diff options
author | Guido van Rossum <guido@python.org> | 1992-06-12 10:39:36 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1992-06-12 10:39:36 (GMT) |
commit | 710e1df5852f07271e2e6a9f9c0acbc698acfd56 (patch) | |
tree | fa7841ab2ceb4cac00106702df8de2ac53c225e5 | |
parent | dfd6e4677944172e98a3d04d4e9a7d440f0b1414 (diff) | |
download | cpython-710e1df5852f07271e2e6a9f9c0acbc698acfd56.zip cpython-710e1df5852f07271e2e6a9f9c0acbc698acfd56.tar.gz cpython-710e1df5852f07271e2e6a9f9c0acbc698acfd56.tar.bz2 |
Some UNIX types want the exact size of the address structure
-rw-r--r-- | Modules/socketmodule.c | 36 |
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(); |