diff options
author | Armin Rigo <arigo@tunes.org> | 2006-04-19 11:50:27 (GMT) |
---|---|---|
committer | Armin Rigo <arigo@tunes.org> | 2006-04-19 11:50:27 (GMT) |
commit | a9017c39ce5db85602235dfd03da30f4de8bd823 (patch) | |
tree | 670aacf6665b4558844aebede696e979727f9d96 /Modules | |
parent | ab012af6ed8fb9a57f4d558532f4201de6534672 (diff) | |
download | cpython-a9017c39ce5db85602235dfd03da30f4de8bd823.zip cpython-a9017c39ce5db85602235dfd03da30f4de8bd823.tar.gz cpython-a9017c39ce5db85602235dfd03da30f4de8bd823.tar.bz2 |
SF Patch #1062014: AF_UNIX sockets under Linux have a special
abstract namespace that is now fully supported.
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/socketmodule.c | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 93cb8e0..c9dd4a3 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -968,7 +968,18 @@ makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto) case AF_UNIX: { struct sockaddr_un *a = (struct sockaddr_un *) addr; - return PyString_FromString(a->sun_path); +#ifdef linux + if (a->sun_path[0] == 0) { /* Linux abstract namespace */ + addrlen -= (sizeof(*a) - sizeof(a->sun_path)); + return PyString_FromStringAndSize(a->sun_path, + addrlen); + } + else +#endif /* linux */ + { + /* regular NULL-terminated string */ + return PyString_FromString(a->sun_path); + } } #endif /* AF_UNIX */ @@ -1098,14 +1109,28 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, addr = (struct sockaddr_un*)&(s->sock_addr).un; if (!PyArg_Parse(args, "t#", &path, &len)) return 0; - if (len >= sizeof addr->sun_path) { - PyErr_SetString(socket_error, - "AF_UNIX path too long"); - return 0; +#ifdef linux + if (len > 0 && path[0] == 0) { + /* Linux abstract namespace extension */ + if (len > sizeof addr->sun_path) { + PyErr_SetString(socket_error, + "AF_UNIX path too long"); + return 0; + } + } + else +#endif /* linux */ + { + /* regular NULL-terminated string */ + if (len >= sizeof addr->sun_path) { + PyErr_SetString(socket_error, + "AF_UNIX path too long"); + return 0; + } + addr->sun_path[len] = 0; } addr->sun_family = s->sock_family; memcpy(addr->sun_path, path, len); - addr->sun_path[len] = 0; *addr_ret = (struct sockaddr *) addr; #if defined(PYOS_OS2) *len_ret = sizeof(*addr); |