@@ -7,7 +7,7 @@ This module provides an interface to Berkeley socket IPC.
77Limitations:
88
99- Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
10- portable manner, though AF_PACKET is supported under Linux.
10+ portable manner, though AF_PACKET and AF_NETLINK are supported under Linux.
1111- No read/write operations (use sendall/recv or makefile instead).
1212- Additional restrictions apply on some non-Unix platforms (compensated
1313 for by socket.py).
@@ -954,6 +954,14 @@ makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto)
954954 }
955955#endif /* AF_UNIX */
956956
957+ #if defined(AF_NETLINK )
958+ case AF_NETLINK :
959+ {
960+ struct sockaddr_nl * a = (struct sockaddr_nl * ) addr ;
961+ return Py_BuildValue ("ii" , a -> nl_pid , a -> nl_groups );
962+ }
963+ #endif /* AF_NETLINK */
964+
957965#ifdef ENABLE_IPV6
958966 case AF_INET6 :
959967 {
@@ -1090,6 +1098,31 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
10901098 }
10911099#endif /* AF_UNIX */
10921100
1101+ #if defined(AF_NETLINK )
1102+ case AF_NETLINK :
1103+ {
1104+ struct sockaddr_nl * addr ;
1105+ int pid , groups ;
1106+ addr = (struct sockaddr_nl * )& (s -> sock_addr ).nl ;
1107+ if (!PyTuple_Check (args )) {
1108+ PyErr_Format (
1109+ PyExc_TypeError ,
1110+ "getsockaddrarg: "
1111+ "AF_NETLINK address must be tuple, not %.500s" ,
1112+ args -> ob_type -> tp_name );
1113+ return 0 ;
1114+ }
1115+ if (!PyArg_ParseTuple (args , "II:getsockaddrarg" , & pid , & groups ))
1116+ return 0 ;
1117+ addr -> nl_family = AF_NETLINK ;
1118+ addr -> nl_pid = pid ;
1119+ addr -> nl_groups = groups ;
1120+ * addr_ret = (struct sockaddr * ) addr ;
1121+ * len_ret = sizeof (* addr );
1122+ return 1 ;
1123+ }
1124+ #endif
1125+
10931126 case AF_INET :
10941127 {
10951128 struct sockaddr_in * addr ;
@@ -1286,6 +1319,13 @@ getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
12861319 return 1 ;
12871320 }
12881321#endif /* AF_UNIX */
1322+ #if defined(AF_NETLINK )
1323+ case AF_NETLINK :
1324+ {
1325+ * len_ret = sizeof (struct sockaddr_nl );
1326+ return 1 ;
1327+ }
1328+ #endif
12891329
12901330 case AF_INET :
12911331 {
@@ -3947,6 +3987,18 @@ init_socket(void)
39473987#ifdef AF_NETLINK
39483988 /* */
39493989 PyModule_AddIntConstant (m , "AF_NETLINK" , AF_NETLINK );
3990+ PyModule_AddIntConstant (m , "NETLINK_ROUTE" , NETLINK_ROUTE );
3991+ PyModule_AddIntConstant (m , "NETLINK_SKIP" , NETLINK_SKIP );
3992+ PyModule_AddIntConstant (m , "NETLINK_USERSOCK" , NETLINK_USERSOCK );
3993+ PyModule_AddIntConstant (m , "NETLINK_FIREWALL" , NETLINK_FIREWALL );
3994+ PyModule_AddIntConstant (m , "NETLINK_TCPDIAG" , NETLINK_TCPDIAG );
3995+ PyModule_AddIntConstant (m , "NETLINK_NFLOG" , NETLINK_NFLOG );
3996+ PyModule_AddIntConstant (m , "NETLINK_XFRM" , NETLINK_XFRM );
3997+ PyModule_AddIntConstant (m , "NETLINK_ARPD" , NETLINK_ARPD );
3998+ PyModule_AddIntConstant (m , "NETLINK_ROUTE6" , NETLINK_ROUTE6 );
3999+ PyModule_AddIntConstant (m , "NETLINK_IP6_FW" , NETLINK_IP6_FW );
4000+ PyModule_AddIntConstant (m , "NETLINK_DNRTMSG" , NETLINK_DNRTMSG );
4001+ PyModule_AddIntConstant (m , "NETLINK_TAPBASE" , NETLINK_TAPBASE );
39504002#endif
39514003#ifdef AF_ROUTE
39524004 /* Alias to emulate 4.4BSD */
0 commit comments