Re: [PATCH] Netlink sockets support for Linux
| From: | Kenan Sulayman | Date: | Sun, 08 Mar 2009 11:44:15 +0000 |
| Subject: | Re: [PATCH] Netlink sockets support for Linux | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-43277@lists.php.net to get a copy of this message | ||
Just send you a copy of his patch as of his last mail.
( "Here it is: http://www.progtech.ru/~oleg/linux-netlink.diff"
)
--
(c) Kenan Sulayman
Freelance Designer and Programmer
Life's Live Poetry
2009/3/7 Antony Dovgal <tony@daylessday.org>
> On 07.03.2009 18:47, Oleg A. Arkhangelsky wrote:
> > Hello,
> >
> > This patch adds ability to send or receive data using Netlink [1] sockets
> in Linux OS using Socket Functions in PHP.
> > If you're going to commit this patch, some additions to documentation
> will be needed. Just let me know.
> >
> > I would very appreciate your comments!
>
> The patch didn't come through.
> Make sure the patch is in *.txt, the maillist accepts only text/plain
> attachments.
>
> --
> Wbr,
> Antony Dovgal
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>
diff -Nurb php-5.2.9/ext/sockets/sockets.c php-5.2.9-my/ext/sockets/sockets.c --- php-5.2.9/ext/sockets/sockets.c 2009-02-03 22:22:40.000000000 +0300 +++ php-5.2.9-my/ext/sockets/sockets.c 2009-03-07 18:24:17.000000000 +0300 @@ -49,6 +49,9 @@ # include <fcntl.h> # include <signal.h> # include <sys/uio.h> +#if defined(__linux__) +# include <linux/netlink.h> +#endif # define IS_INVALID_SOCKET(a) (a->bsd_socket < 0) # define set_errno(a) (errno = a) #else /* windows */ @@ -477,6 +480,9 @@ #if HAVE_IPV6 REGISTER_LONG_CONSTANT("AF_INET6", AF_INET6, CONST_CS | CONST_PERSISTENT); #endif +#if defined(__linux__) + REGISTER_LONG_CONSTANT("AF_NETLINK", AF_NETLINK, CONST_CS | CONST_PERSISTENT); +#endif REGISTER_LONG_CONSTANT("SOCK_STREAM", SOCK_STREAM, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SOCK_DGRAM", SOCK_DGRAM, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SOCK_RAW", SOCK_RAW, CONST_CS | CONST_PERSISTENT); @@ -927,6 +933,7 @@ char addr6[INET6_ADDRSTRLEN+1]; #endif struct sockaddr_un *s_un; + char *addr_string; socklen_t salen = sizeof(php_sockaddr_storage); @@ -1085,6 +1092,9 @@ #if HAVE_IPV6 && arg1 != AF_INET6 #endif +#if defined(__linux__) + && arg1 != AF_NETLINK +#endif && arg1 != AF_INET) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "invalid socket domain [%ld] specified for argument 1, assuming AF_INET", arg1); arg1 = AF_INET; @@ -1272,6 +1282,21 @@ break; } #endif +#if defined(__linux__) + case AF_NETLINK: + { + struct sockaddr_nl *sa = (struct sockaddr_nl *) sock_type; + + memset(sa, 0, sizeof(sa_storage)); + + sa->nl_family = AF_NETLINK; + sa->nl_pid = port; + sa->nl_groups = atoi(addr); + + retval = bind(php_sock->bsd_socket, (struct sockaddr *)sa, sizeof(struct sockaddr_nl)); + break; + } +#endif default: php_error_docref(NULL TSRMLS_CC, E_WARNING, "unsupported socket type '%d', must be AF_UNIX, AF_INET, or AF_INET6", php_sock->type); RETURN_FALSE; @@ -1374,6 +1399,11 @@ struct sockaddr_in6 sin6; char addr6[INET6_ADDRSTRLEN]; #endif +#if defined(__linux__) + struct sockaddr_nl snl; + int nl_grp; + char grp_addr[20]; +#endif socklen_t slen; int retval; long arg3, arg4; @@ -1468,6 +1498,30 @@ ZVAL_LONG(arg6, ntohs(sin6.sin6_port)); break; #endif +#if defined(__linux__) + case AF_NETLINK: + slen = sizeof(snl); + memset(&snl, 0, slen); + snl.nl_family = AF_NETLINK; + retval = recvfrom(php_sock->bsd_socket, recv_buf, arg3, arg4, (struct sockaddr *)&snl, (socklen_t *)&slen); + + if (retval < 0) { + efree(recv_buf); + PHP_SOCKET_ERROR(php_sock, "unable to recvfrom", errno); + RETURN_FALSE; + } + + zval_dtor(arg2); + zval_dtor(arg5); + zval_dtor(arg6); + + sprintf(grp_addr, "%u", snl.nl_groups); + + ZVAL_STRINGL(arg2, recv_buf, retval, 0); + ZVAL_STRING(arg5, grp_addr, 1); + ZVAL_LONG(arg6, snl.nl_pid); + break; +#endif default: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unsupported socket type %d", php_sock->type); RETURN_FALSE; @@ -1488,6 +1542,9 @@ #if HAVE_IPV6 struct sockaddr_in6 sin6; #endif +#if defined(__linux__) + struct sockaddr_nl snl; +#endif int retval, buf_len, addr_len; long len, flags, port = 0; char *buf, *addr; @@ -1540,6 +1597,16 @@ retval = sendto(php_sock->bsd_socket, buf, (len > buf_len) ? buf_len : len, flags, (struct sockaddr *) &sin6, sizeof(sin6)); break; #endif +#if defined(__linux__) + case AF_NETLINK: + memset(&snl, 0, sizeof(snl)); + snl.nl_family = AF_NETLINK; + snl.nl_groups = atoi(addr); + snl.nl_pid = port; + + retval = sendto(php_sock->bsd_socket, buf, (len > buf_len) ? buf_len : len, flags, (struct sockaddr *) &snl, sizeof(snl)); + break; +#endif default: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unsupported socket type %d", php_sock->type); RETURN_FALSE;
diff -Nurb php-5.2.9/ext/sockets/sockets.c php-5.2.9-my/ext/sockets/sockets.c --- php-5.2.9/ext/sockets/sockets.c 2009-02-03 22:22:40.000000000 +0300 +++ php-5.2.9-my/ext/sockets/sockets.c 2009-03-07 18:24:17.000000000 +0300 @@ -49,6 +49,9 @@ # include <fcntl.h> # include <signal.h> # include <sys/uio.h> +#if defined(__linux__) +# include <linux/netlink.h> +#endif # define IS_INVALID_SOCKET(a) (a->bsd_socket < 0) # define set_errno(a) (errno = a) #else /* windows */ @@ -477,6 +480,9 @@ #if HAVE_IPV6 REGISTER_LONG_CONSTANT("AF_INET6", AF_INET6, CONST_CS | CONST_PERSISTENT); #endif +#if defined(__linux__) + REGISTER_LONG_CONSTANT("AF_NETLINK", AF_NETLINK, CONST_CS | CONST_PERSISTENT); +#endif REGISTER_LONG_CONSTANT("SOCK_STREAM", SOCK_STREAM, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SOCK_DGRAM", SOCK_DGRAM, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SOCK_RAW", SOCK_RAW, CONST_CS | CONST_PERSISTENT); @@ -927,6 +933,7 @@ char addr6[INET6_ADDRSTRLEN+1]; #endif struct sockaddr_un *s_un; + char *addr_string; socklen_t salen = sizeof(php_sockaddr_storage); @@ -1085,6 +1092,9 @@ #if HAVE_IPV6 && arg1 != AF_INET6 #endif +#if defined(__linux__) + && arg1 != AF_NETLINK +#endif && arg1 != AF_INET) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "invalid socket domain [%ld] specified for argument 1, assuming AF_INET", arg1); arg1 = AF_INET; @@ -1272,6 +1282,21 @@ break; } #endif +#if defined(__linux__) + case AF_NETLINK: + { + struct sockaddr_nl *sa = (struct sockaddr_nl *) sock_type; + + memset(sa, 0, sizeof(sa_storage)); + + sa->nl_family = AF_NETLINK; + sa->nl_pid = port; + sa->nl_groups = atoi(addr); + + retval = bind(php_sock->bsd_socket, (struct sockaddr *)sa, sizeof(struct sockaddr_nl)); + break; + } +#endif default: php_error_docref(NULL TSRMLS_CC, E_WARNING, "unsupported socket type '%d', must be AF_UNIX, AF_INET, or AF_INET6", php_sock->type); RETURN_FALSE; @@ -1374,6 +1399,11 @@ struct sockaddr_in6 sin6; char addr6[INET6_ADDRSTRLEN]; #endif +#if defined(__linux__) + struct sockaddr_nl snl; + int nl_grp; + char grp_addr[20]; +#endif socklen_t slen; int retval; long arg3, arg4; @@ -1468,6 +1498,30 @@ ZVAL_LONG(arg6, ntohs(sin6.sin6_port)); break; #endif +#if defined(__linux__) + case AF_NETLINK: + slen = sizeof(snl); + memset(&snl, 0, slen); + snl.nl_family = AF_NETLINK; + retval = recvfrom(php_sock->bsd_socket, recv_buf, arg3, arg4, (struct sockaddr *)&snl, (socklen_t *)&slen); + + if (retval < 0) { + efree(recv_buf); + PHP_SOCKET_ERROR(php_sock, "unable to recvfrom", errno); + RETURN_FALSE; + } + + zval_dtor(arg2); + zval_dtor(arg5); + zval_dtor(arg6); + + sprintf(grp_addr, "%u", snl.nl_groups); + + ZVAL_STRINGL(arg2, recv_buf, retval, 0); + ZVAL_STRING(arg5, grp_addr, 1); + ZVAL_LONG(arg6, snl.nl_pid); + break; +#endif default: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unsupported socket type %d", php_sock->type); RETURN_FALSE; @@ -1488,6 +1542,9 @@ #if HAVE_IPV6 struct sockaddr_in6 sin6; #endif +#if defined(__linux__) + struct sockaddr_nl snl; +#endif int retval, buf_len, addr_len; long len, flags, port = 0; char *buf, *addr; @@ -1540,6 +1597,16 @@ retval = sendto(php_sock->bsd_socket, buf, (len > buf_len) ? buf_len : len, flags, (struct sockaddr *) &sin6, sizeof(sin6)); break; #endif +#if defined(__linux__) + case AF_NETLINK: + memset(&snl, 0, sizeof(snl)); + snl.nl_family = AF_NETLINK; + snl.nl_groups = atoi(addr); + snl.nl_pid = port; + + retval = sendto(php_sock->bsd_socket, buf, (len > buf_len) ? buf_len : len, flags, (struct sockaddr *) &snl, sizeof(snl)); + break; +#endif default: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unsupported socket type %d", php_sock->type); RETURN_FALSE;