Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP

Loading…

Implementing Bug #63472 #357

Closed
wants to merge 3 commits into from

3 participants

@zobo

Added ability to set SO_BINDTODEVICE on socket.

@smalyshev smalyshev commented on the diff
ext/sockets/tests/socket_set_option_bindtodevice.phpt
@@ -0,0 +1,37 @@
+--TEST--
+Test if socket_set_option() works, option:SO_BINDTODEVICE
@smalyshev Owner

This test would only work for root

@zobo
zobo added a note

Yes, you need root for SO_BINDTODEVICE, that's it nature. Should I just skip the test if current context is not root? posix_getuid() != 0

@smalyshev Owner

Yes, probably.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
ext/sockets/tests/socket_set_option_bindtodevice.phpt
((19 lines not shown))
+if (!$socket) {
+ die('Unable to create AF_INET socket [socket]');
+}
+// wrong params
+$retval_1 = socket_set_option( $socket, SOL_SOCKET, SO_BINDTODEVICE, "lo");
+var_dump($retval_1);
+$retval_2 = socket_set_option( $socket, SOL_SOCKET, SO_BINDTODEVICE, "ethIDONOTEXIST");
+var_dump($retval_2);
+
+socket_close($socket);
+?>
+
+--EXPECTF--
+bool(true)
+
+Warning: socket_set_option(): unable to set socket option [19]: No such device in /root/zobo/php-sockets/php-src/ext/sockets/tests/socket_set_option_bindtodevice.php on line 10
@smalyshev Owner

test shouldn't include your private paths, it will fail for everybody else

@zobo
zobo added a note

I should have used %s %d, will fix.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
@zobo

Not sure if it's obvious or not, but I committed the changes discussed.

@php-pulls
Collaborator

Comment on behalf of stas at php.net:

merge

@php-pulls php-pulls closed this
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
This page is out of date. Refresh to see the latest.
View
15 ext/sockets/sockets.c
@@ -679,6 +679,9 @@ static PHP_MINIT_FUNCTION(sockets)
REGISTER_LONG_CONSTANT("SO_FAMILY", SO_FAMILY, CONST_CS | CONST_PERSISTENT);
#endif
REGISTER_LONG_CONSTANT("SO_ERROR", SO_ERROR, CONST_CS | CONST_PERSISTENT);
+#ifdef SO_BINDTODEVICE
+ REGISTER_LONG_CONSTANT("SO_BINDTODEVICE", SO_BINDTODEVICE, CONST_CS | CONST_PERSISTENT);
+#endif
REGISTER_LONG_CONSTANT("SOL_SOCKET", SOL_SOCKET, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SOMAXCONN", SOMAXCONN, CONST_CS | CONST_PERSISTENT);
#ifdef TCP_NODELAY
@@ -2038,6 +2041,18 @@ PHP_FUNCTION(socket_set_option)
#endif
break;
}
+#ifdef SO_BINDTODEVICE
+ case SO_BINDTODEVICE: {
+ if (Z_TYPE_PP(arg4) == IS_STRING) {
+ opt_ptr = Z_STRVAL_PP(arg4);
+ optlen = Z_STRLEN_PP(arg4);
+ } else {
+ opt_ptr = "";
+ optlen = 0;
+ }
+ break;
+ }
+#endif
default:
default_case:
View
40 ext/sockets/tests/socket_set_option_bindtodevice.phpt
@@ -0,0 +1,40 @@
+--TEST--
+Test if socket_set_option() works, option:SO_BINDTODEVICE
@smalyshev Owner

This test would only work for root

@zobo
zobo added a note

Yes, you need root for SO_BINDTODEVICE, that's it nature. Should I just skip the test if current context is not root? posix_getuid() != 0

@smalyshev Owner

Yes, probably.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
+--DESCRIPTION--
+-Bind to loopback 'lo' device (should exist)
+-Bind to unexisting device
+--SKIPIF--
+<?php
+if (!extension_loaded('sockets')) {
+ die('SKIP sockets extension not available.');
+}
+if (!defined("SO_BINDTODEVICE")) {
+ die('SKIP SO_BINDTODEVICE not supported on this platform.');
+}
+if (!function_exists("posix_getuid") || posix_getuid() != 0) {
+ die('SKIP SO_BINDTODEVICE requires root permissions.');
+}
+?>
+--FILE--
+<?php
+$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
+
+if (!$socket) {
+ die('Unable to create AF_INET socket [socket]');
+}
+// wrong params
+$retval_1 = socket_set_option( $socket, SOL_SOCKET, SO_BINDTODEVICE, "lo");
+var_dump($retval_1);
+$retval_2 = socket_set_option( $socket, SOL_SOCKET, SO_BINDTODEVICE, "ethIDONOTEXIST");
+var_dump($retval_2);
+
+socket_close($socket);
+?>
+
+--EXPECTF--
+bool(true)
+
+Warning: socket_set_option(): unable to set socket option [19]: No such device in %s on line %d
+bool(false)
+--CREDITS--
+Damjan Cvetko, foreach.org
Something went wrong with that request. Please try again.