Hello,
This patch will add posix_mknod to the posix extension.
Usage: posix_mknod('file', mode | type [, major [,minor]]), like
mknod(2) (except for major and minor).
Any objections against adding it to HEAD ?
Magnus
--
We are now enjoying total mutual interaction in an imaginary hot
tub ...
Index: ext/posix/posix.c
===================================================================
RCS file: /repository/php-src/ext/posix/posix.c,v
retrieving revision 1.64
diff -u -r1.64 posix.c
--- ext/posix/posix.c 28 Jan 2005 01:38:56 -0000 1.64
+++ ext/posix/posix.c 11 Apr 2005 20:40:14 -0000
@@ -107,6 +107,9 @@
#ifdef HAVE_MKFIFO
PHP_FE(posix_mkfifo, NULL)
#endif
+#ifdef HAVE_MKNOD
+ PHP_FE(posix_mknod, NULL)
+#endif
/* POSIX.1, 5.6 */
PHP_FE(posix_access, NULL)
@@ -152,6 +155,22 @@
REGISTER_LONG_CONSTANT("POSIX_X_OK", X_OK, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("POSIX_W_OK", W_OK, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("POSIX_R_OK", R_OK, CONST_CS | CONST_PERSISTENT);
+#ifdef S_IFREG
+ REGISTER_LONG_CONSTANT("POSIX_S_IFREG", S_IFREG, CONST_CS |
CONST_PERSISTENT);
+#endif
+#ifdef S_IFCHR
+ REGISTER_LONG_CONSTANT("POSIX_S_IFCHR", S_IFCHR, CONST_CS |
CONST_PERSISTENT);
+#endif
+#ifdef S_IFBLK
+ REGISTER_LONG_CONSTANT("POSIX_S_IFBLK", S_IFBLK, CONST_CS |
CONST_PERSISTENT);
+#endif
+#ifdef S_IFIFO
+ REGISTER_LONG_CONSTANT("POSIX_S_IFIFO", S_IFIFO, CONST_CS |
CONST_PERSISTENT);
+#endif
+#ifdef S_IFSOCK
+ REGISTER_LONG_CONSTANT("POSIX_S_IFSOCK", S_IFSOCK, CONST_CS |
CONST_PERSISTENT);
+#endif
+
return SUCCESS;
}
/* }}} */
@@ -638,6 +657,51 @@
#endif
/* }}} */
+/* {{{ proto bool posix_mknod(string pathname, int mode, int filetype [, int
major [, int minor]])
+ Make a special or ordinary file (POSIX.1) */
+#ifdef HAVE_MKNOD
+PHP_FUNCTION(posix_mknod)
+{
+ char *path;
+ int path_len;
+ long mode;
+ long major, minor = 0;
+ int result;
+ dev_t php_dev;
+
+ php_dev = 0;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sl|ll", &path,
&path_len,
+ &mode, &major, &minor) == FAILURE) {
+ RETURN_FALSE;
+ }
+
+ if (php_check_open_basedir_ex(path, 0 TSRMLS_CC) ||
+ (PG(safe_mode) && (!php_checkuid(path, NULL,
CHECKUID_ALLOW_ONLY_DIR)))) {
+ RETURN_FALSE;
+ }
+
+ if ((mode & S_IFCHR) || (mode & S_IFBLK)) {
+ if (major == 0) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING,
+ "expects argument 4 to be non-zero for
POSIX_S_IFCHR and POSIX_S_IFBLK");
+ RETURN_FALSE;
+ } else {
+ php_dev = makedev(major, minor);
+ }
+ }
+
+ result = mknod(path, mode, php_dev);
+ if (result < 0) {
+ POSIX_G(last_error) = errno;
+ RETURN_FALSE;
+ }
+
+ RETURN_TRUE;
+}
+#endif
+/* }}} */
+
/* Takes a pointer to posix group and a pointer to an already initialized ZVAL
* array container and fills the array with the posix group member data. */
int php_posix_group_to_array(struct group *g, zval *array_group) {
Index: ext/posix/php_posix.h
===================================================================
RCS file: /repository/php-src/ext/posix/php_posix.h,v
retrieving revision 1.15
diff -u -r1.15 php_posix.h
--- ext/posix/php_posix.h 7 Jan 2005 16:05:06 -0000 1.15
+++ ext/posix/php_posix.h 11 Apr 2005 20:40:15 -0000
@@ -89,6 +89,9 @@
#ifdef HAVE_MKFIFO
PHP_FUNCTION(posix_mkfifo);
#endif
+#ifdef HAVE_MKNOD
+PHP_FUNCTION(posix_mknod);
+#endif
/* POSIX.1, 5.6 */
PHP_FUNCTION(posix_access);
Index: ext/posix/config.m4
===================================================================
RCS file: /repository/php-src/ext/posix/config.m4,v
retrieving revision 1.7
diff -u -r1.7 config.m4
--- ext/posix/config.m4 12 Mar 2002 16:32:13 -0000 1.7
+++ ext/posix/config.m4 11 Apr 2005 20:40:15 -0000
@@ -9,5 +9,5 @@
AC_DEFINE(HAVE_POSIX, 1, [whether to include POSIX-like functions])
PHP_NEW_EXTENSION(posix, posix.c, $ext_shared)
- AC_CHECK_FUNCS(seteuid setegid setsid getsid setpgid getpgid ctermid mkfifo
getrlimit)
+ AC_CHECK_FUNCS(seteuid setegid setsid getsid setpgid getpgid ctermid mkfifo
mknod getrlimit)
fi
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php