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 <t...@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;
-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to