ID: 26158 User updated by: mattias at sudac dot org Reported By: mattias at sudac dot org -Status: Feedback +Status: Open Bug Type: Feature/Change Request Operating System: Linux PHP Version: 4.3.3 New Comment:
It seams to work if the file descriptor is a pipe, but it fails on network sockets. Example: testfd.php: #!/usr/local/bin/php -q <?php echo `ls -l /dev/fd/`; $stdin = fopen('/dev/fd/0', 'r'); $stdout = fopen('/dev/fd/1', 'w'); ?> Server: tcpserver 127.0.0.1 8000 ./testfd.php Client: [EMAIL PROTECTED]:~$ nc localhost 8000 total 0 lrwx------ 1 mattias mattias 64 2003-11-07 13:35 0 -> socket:[2611215] l-wx------ 1 mattias mattias 64 2003-11-07 13:35 1 -> pipe:[2611234] lrwx------ 1 mattias mattias 64 2003-11-07 13:35 2 -> /dev/pts/3 lr-x------ 1 mattias mattias 64 2003-11-07 13:35 3 -> /proc/12706/fd lrwx------ 1 mattias mattias 64 2003-11-07 13:35 4 -> socket:[2611215] lrwx------ 1 mattias mattias 64 2003-11-07 13:35 5 -> socket:[2611215] lrwx------ 1 mattias mattias 64 2003-11-07 13:35 6 -> /dev/pts/3 Warning: fopen(/dev/fd/0): failed to open stream: No such device or address in /home/mattias/projects/jssocket/tests/testfd on line 6 Warning: fopen(/dev/fd/1): failed to open stream: No such device or address in /home/mattias/projects/jssocket/tests/testfd on line 7 If we run the script without tcpserver we get this: [EMAIL PROTECTED]:~$ ./testfd total 0 lrwx------ 1 mattias mattias 64 2003-11-07 13:37 0 -> /dev/pts/3 l-wx------ 1 mattias mattias 64 2003-11-07 13:37 1 -> pipe:[2611379] lrwx------ 1 mattias mattias 64 2003-11-07 13:37 2 -> /dev/pts/3 lr-x------ 1 mattias mattias 64 2003-11-07 13:37 3 -> /proc/12709/fd lrwx------ 1 mattias mattias 64 2003-11-07 13:37 4 -> /dev/pts/3 lrwx------ 1 mattias mattias 64 2003-11-07 13:37 5 -> /dev/pts/3 lrwx------ 1 mattias mattias 64 2003-11-07 13:37 6 -> /dev/pts/3 Notice the difference, also notice that /dev/fd is a symlink to /proc/self/fd: [EMAIL PROTECTED]:~$ ls -l /dev/fd lrwxrwxrwx 1 root root 13 2001-12-21 18:29 /dev/fd -> /proc/self/fd This is on Debian unstable, Linux 2.4.21. I noticed this when i moved a script from FreeBSD 4.8 to Linux. Previous Comments: ------------------------------------------------------------------------ [2003-11-07 06:44:39] [EMAIL PROTECTED] Why does fopen("/dev/fd/x", "r") fail ? ------------------------------------------------------------------------ [2003-11-06 20:26:32] mattias at sudac dot org Description: ------------ On some operating systems (BSD?) it is possible to open a arbitrary file descriptor with fopen like this: fopen("/dev/fd/<fd>", "r"); But on at least Linux this fails. So here is patch that makes it possible to open fd:s by useing fopen("php://<fd>", "r"). in ext/standard/php_fopen_wrapper.c:php_stream_url_wrap_php add two lines: } else if (!strcasecmp(path, "stderr")) { fd = STDERR_FILENO; +} else + fd = atoi(path); Maybe some checks are needed. ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=26158&edit=1