|
|
@ -43,6 +43,10 @@ |
|
|
|
# include <limits.h> |
|
|
|
#endif |
|
|
|
|
|
|
|
#ifdef __linux__ |
|
|
|
# include <sys/sysmacros.h> |
|
|
|
#endif |
|
|
|
|
|
|
|
#define php_stream_fopen_from_fd_int(fd, mode, persistent_id) _php_stream_fopen_from_fd_int((fd), (mode), (persistent_id) STREAMS_CC) |
|
|
|
#define php_stream_fopen_from_fd_int_rel(fd, mode, persistent_id) _php_stream_fopen_from_fd_int((fd), (mode), (persistent_id) STREAMS_REL_CC) |
|
|
|
#define php_stream_fopen_from_file_int(file, mode) _php_stream_fopen_from_file_int((file), (mode) STREAMS_CC) |
|
|
@ -255,7 +259,28 @@ PHPAPI php_stream *_php_stream_fopen_tmpfile(int dummy STREAMS_DC) |
|
|
|
static void detect_is_seekable(php_stdio_stream_data *self) { |
|
|
|
#if defined(S_ISFIFO) && defined(S_ISCHR) |
|
|
|
if (self->fd >= 0 && do_fstat(self, 0) == 0) { |
|
|
|
#ifdef __linux__ |
|
|
|
if (S_ISCHR(self->sb.st_mode)) { |
|
|
|
/* Some character devices are exceptions, check their major/minor ID |
|
|
|
* https://www.kernel.org/doc/Documentation/admin-guide/devices.txt */ |
|
|
|
if (major(self->sb.st_rdev) == 1) { |
|
|
|
unsigned m = minor(self->sb.st_rdev); |
|
|
|
self->is_seekable = |
|
|
|
m == 1 || /* /dev/mem */ |
|
|
|
m == 2 || /* /dev/kmem */ |
|
|
|
m == 3 || /* /dev/null */ |
|
|
|
m == 4 || /* /dev/port (seekable, offset = I/O port) */ |
|
|
|
m == 5 || /* /dev/zero */ |
|
|
|
m == 7; /* /dev/full */ |
|
|
|
} else { |
|
|
|
self->is_seekable = false; |
|
|
|
} |
|
|
|
} else { |
|
|
|
self->is_seekable = !S_ISFIFO(self->sb.st_mode); |
|
|
|
} |
|
|
|
#else |
|
|
|
self->is_seekable = !(S_ISFIFO(self->sb.st_mode) || S_ISCHR(self->sb.st_mode)); |
|
|
|
#endif |
|
|
|
self->is_pipe = S_ISFIFO(self->sb.st_mode); |
|
|
|
} |
|
|
|
#elif defined(PHP_WIN32) |
|
|
|