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