Mercurial > cpython-lru_cache-weakref
diff Modules/socketmodule.c @ 37853:29257ef6abeb legacy-trunk
SF Patch #1062014: AF_UNIX sockets under Linux have a special
abstract namespace that is now fully supported.
| author | Armin Rigo <arigo@tunes.org> |
|---|---|
| date | Wed, 19 Apr 2006 11:50:27 +0000 |
| parents | bfc48ad81e80 |
| children | ea67628ddae5 |
line wrap: on
line diff
--- a/Modules/socketmodule.c Tue Apr 18 23:58:52 2006 +0000 +++ b/Modules/socketmodule.c Wed Apr 19 11:50:27 2006 +0000 @@ -968,7 +968,18 @@ 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 @@ 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);
