@@ -218,6 +218,11 @@ if_indextoname(index) -- return the corresponding interface name\n\
218218# include <ioctl.h>
219219#endif
220220
221+ #ifdef __APPLE__
222+ # include <sys/ioctl.h>
223+ #endif
224+
225+
221226#if defined(PYOS_OS2 )
222227# define INCL_DOS
223228# define INCL_DOSERRORS
@@ -1239,6 +1244,23 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
12391244 }
12401245#endif
12411246
1247+ #ifdef PF_SYSTEM
1248+ case PF_SYSTEM :
1249+ switch (proto ) {
1250+ #ifdef SYSPROTO_CONTROL
1251+ case SYSPROTO_CONTROL :
1252+ {
1253+ struct sockaddr_ctl * a = (struct sockaddr_ctl * )addr ;
1254+ return Py_BuildValue ("(II)" , a -> sc_id , a -> sc_unit );
1255+ }
1256+ #endif
1257+ default :
1258+ PyErr_SetString (PyExc_ValueError ,
1259+ "Invalid address type" );
1260+ return 0 ;
1261+ }
1262+ #endif
1263+
12421264 /* More cases here... */
12431265
12441266 default :
@@ -1677,6 +1699,64 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
16771699 return 0 ;
16781700 }
16791701#endif
1702+
1703+ #ifdef PF_SYSTEM
1704+ case PF_SYSTEM :
1705+ switch (s -> sock_proto ) {
1706+ #ifdef SYSPROTO_CONTROL
1707+ case SYSPROTO_CONTROL :
1708+ {
1709+ struct sockaddr_ctl * addr ;
1710+
1711+ addr = (struct sockaddr_ctl * )addr_ret ;
1712+ addr -> sc_family = AF_SYSTEM ;
1713+ addr -> ss_sysaddr = AF_SYS_CONTROL ;
1714+
1715+ if (PyUnicode_Check (args )) {
1716+ struct ctl_info info ;
1717+ PyObject * ctl_name ;
1718+
1719+ if (!PyArg_Parse (args , "O&" ,
1720+ PyUnicode_FSConverter , & ctl_name )) {
1721+ return 0 ;
1722+ }
1723+
1724+ if (PyBytes_GET_SIZE (ctl_name ) > sizeof (info .ctl_name )) {
1725+ PyErr_SetString (PyExc_ValueError ,
1726+ "provided string is too long" );
1727+ Py_DECREF (ctl_name );
1728+ return 0 ;
1729+ }
1730+ strncpy (info .ctl_name , PyBytes_AS_STRING (ctl_name ),
1731+ sizeof (info .ctl_name ));
1732+ Py_DECREF (ctl_name );
1733+
1734+ if (ioctl (s -> sock_fd , CTLIOCGINFO , & info )) {
1735+ PyErr_SetString (PyExc_OSError ,
1736+ "cannot find kernel control with provided name" );
1737+ return 0 ;
1738+ }
1739+
1740+ addr -> sc_id = info .ctl_id ;
1741+ addr -> sc_unit = 0 ;
1742+ } else if (!PyArg_ParseTuple (args , "II" ,
1743+ & (addr -> sc_id ), & (addr -> sc_unit ))) {
1744+ PyErr_SetString (PyExc_TypeError , "getsockaddrarg: "
1745+ "expected str or tuple of two ints" );
1746+
1747+ return 0 ;
1748+ }
1749+
1750+ * len_ret = sizeof (* addr );
1751+ return 1 ;
1752+ }
1753+ #endif
1754+ default :
1755+ PyErr_SetString (PyExc_OSError ,
1756+ "getsockaddrarg: unsupported PF_SYSTEM protocol" );
1757+ return 0 ;
1758+ }
1759+ #endif
16801760
16811761 /* More cases here... */
16821762
@@ -1783,6 +1863,21 @@ getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
17831863 return 1 ;
17841864 }
17851865#endif
1866+
1867+ #ifdef PF_SYSTEM
1868+ case PF_SYSTEM :
1869+ switch (s -> sock_proto ) {
1870+ #ifdef SYSPROTO_CONTROL
1871+ case SYSPROTO_CONTROL :
1872+ * len_ret = sizeof (struct sockaddr_ctl );
1873+ return 1 ;
1874+ #endif
1875+ default :
1876+ PyErr_SetString (PyExc_OSError , "getsockaddrlen: "
1877+ "unknown PF_SYSTEM protocol" );
1878+ return 0 ;
1879+ }
1880+ #endif
17861881
17871882 /* More cases here... */
17881883
@@ -5660,6 +5755,14 @@ PyInit__socket(void)
56605755 PyModule_AddIntConstant (m , "PF_RDS" , PF_RDS );
56615756#endif
56625757
5758+ /* Kernel event messages */
5759+ #ifdef PF_SYSTEM
5760+ PyModule_AddIntConstant (m , "PF_SYSTEM" , PF_SYSTEM );
5761+ #endif
5762+ #ifdef AF_SYSTEM
5763+ PyModule_AddIntConstant (m , "AF_SYSTEM" , AF_SYSTEM );
5764+ #endif
5765+
56635766#ifdef AF_PACKET
56645767 PyModule_AddIntMacro (m , AF_PACKET );
56655768#endif
@@ -6096,6 +6199,10 @@ PyInit__socket(void)
60966199 PyModule_AddIntConstant (m , "IPPROTO_MAX" , IPPROTO_MAX );
60976200#endif
60986201
6202+ #ifdef SYSPROTO_CONTROL
6203+ PyModule_AddIntConstant (m , "SYSPROTO_CONTROL" , SYSPROTO_CONTROL );
6204+ #endif
6205+
60996206 /* Some port configuration */
61006207#ifdef IPPORT_RESERVED
61016208 PyModule_AddIntConstant (m , "IPPORT_RESERVED" , IPPORT_RESERVED );
0 commit comments