> I browser through it and it seems you put it in the HAVE_GETRLIMIT
> define, you might want to add a new config/m4 check for it and use
> HAVE_SETRLIMIT around it. Conceptually I see no reason why we should not
> add it.

Here is updated patch.

-- 
mg
Index: config.m4
===================================================================
RCS file: /repository/php-src/ext/posix/config.m4,v
retrieving revision 1.7
diff -u -r1.7 config.m4
--- config.m4	12 Mar 2002 16:32:13 -0000	1.7
+++ config.m4	24 Aug 2004 20:45: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 getrlimit setrlimit)
 fi
Index: php_posix.h
===================================================================
RCS file: /repository/php-src/ext/posix/php_posix.h,v
retrieving revision 1.14
diff -u -r1.14 php_posix.h
--- php_posix.h	8 Jan 2004 17:32:41 -0000	1.14
+++ php_posix.h	24 Aug 2004 20:45:15 -0000
@@ -1,4 +1,4 @@
-/* 
+/*
    +----------------------------------------------------------------------+
    | PHP Version 5                                                        |
    +----------------------------------------------------------------------+
@@ -100,6 +100,10 @@
 PHP_FUNCTION(posix_getrlimit);
 #endif
 
+#ifdef HAVE_SETRLIMIT
+PHP_FUNCTION(posix_setrlimit);
+#endif
+
 PHP_FUNCTION(posix_get_last_error);
 PHP_FUNCTION(posix_strerror);
 
Index: posix.c
===================================================================
RCS file: /repository/php-src/ext/posix/posix.c,v
retrieving revision 1.60
diff -u -r1.60 posix.c
--- posix.c	18 Apr 2004 21:49:10 -0000	1.60
+++ posix.c	24 Aug 2004 20:45:16 -0000
@@ -50,7 +50,7 @@
 /* {{{ posix_functions[]
  */
 function_entry posix_functions[] = {
-    /* POSIX.1, 3.3 */
+	/* POSIX.1, 3.3 */
 	PHP_FE(posix_kill,		NULL)
 
 	/* POSIX.1, 4.1 */
@@ -100,7 +100,7 @@
 	PHP_FE(posix_ttyname,	NULL)
 	PHP_FE(posix_isatty,	NULL)
 
-    /* POSIX.1, 5.2 */
+	/* POSIX.1, 5.2 */
 	PHP_FE(posix_getcwd,	NULL)
 
 	/* POSIX.1, 5.4 */
@@ -116,6 +116,7 @@
 
 #ifdef HAVE_GETRLIMIT
 	PHP_FE(posix_getrlimit,	NULL)
+	PHP_FE(posix_setrlimit,	NULL)
 #endif
 
 	PHP_FE(posix_get_last_error,					NULL)
@@ -156,14 +157,14 @@
  */
 zend_module_entry posix_module_entry = {
 	STANDARD_MODULE_HEADER,
-	"posix", 
-	posix_functions, 
+	"posix",
+	posix_functions,
 	PHP_MINIT(posix),
 	NULL,
 	NULL,
-	NULL, 
+	NULL,
 	PHP_MINFO(posix),
-    NO_VERSION_YET,
+	NO_VERSION_YET,
 	STANDARD_MODULE_PROPERTIES
 };
 /* }}} */
@@ -196,12 +197,12 @@
 
 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &pid, &sig) == FAILURE)
 		return;
-  
+
 	if (kill(pid, sig) < 0) {
 		POSIX_G(last_error) = errno;
 		RETURN_FALSE;
-  	}
-  	
+	}
+
 	RETURN_TRUE;
 }
 /* }}} */
@@ -299,7 +300,7 @@
 	int    i;
 
 	PHP_POSIX_NO_ARGS;
-	
+
 	if ((result = getgroups(NGROUPS_MAX, gidlist)) < 0) {
 		POSIX_G(last_error) = errno;
 		RETURN_FALSE;
@@ -313,19 +314,19 @@
 }
 /* }}} */
 
-/* {{{ proto string posix_getlogin(void) 
+/* {{{ proto string posix_getlogin(void)
    Get user name (POSIX.1, 4.2.4) */
 PHP_FUNCTION(posix_getlogin)
 {
 	char *p;
-	
+
 	PHP_POSIX_NO_ARGS;
-	
+
 	if (NULL == (p = getlogin())) {
 		POSIX_G(last_error) = errno;
 		RETURN_FALSE;
 	}
-	
+
 	RETURN_STRING(p, 1);
 }
 /* }}} */
@@ -356,12 +357,12 @@
 
 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &pid, &pgid) == FAILURE)
 		return;
-	
+
 	if (setpgid(pid, pgid) < 0) {
 		POSIX_G(last_error) = errno;
 		RETURN_FALSE;
 	}
-	
+
 	RETURN_TRUE;
 }
 /* }}} */
@@ -450,7 +451,7 @@
 PHP_FUNCTION(posix_ctermid)
 {
 	char  buffer[L_ctermid];
-	
+
 	PHP_POSIX_NO_ARGS;
 
 	if (NULL == ctermid(buffer)) {
@@ -460,7 +461,7 @@
 		POSIX_G(last_error) = errno;
 		RETURN_FALSE;
 	}
-	
+
 	RETURN_STRING(buffer, 1);
 }
 #endif
@@ -480,7 +481,7 @@
 	if (php_stream_can_cast(stream, PHP_STREAM_AS_FD) == SUCCESS) {
 		php_stream_cast(stream, PHP_STREAM_AS_FD, (void*)fd, 0);
 	} else {
-		php_error_docref(NULL TSRMLS_CC, E_WARNING, "could not use stream of type '%s'", 
+		php_error_docref(NULL TSRMLS_CC, E_WARNING, "could not use stream of type '%s'",
 				stream->ops->label);
 		return 0;
 	}
@@ -513,7 +514,7 @@
 		POSIX_G(last_error) = errno;
 		RETURN_FALSE;
 	}
-	
+
 	RETURN_STRING(p, 1);
 }
 /* }}} */
@@ -524,7 +525,7 @@
 {
 	zval *z_fd;
 	int fd;
-	
+
 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &z_fd) == FAILURE)
 		return;
 
@@ -590,7 +591,7 @@
 	int path_len;
 	long mode;
 	int     result;
-	
+
 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sl", &path, &path_len, &mode) == FAILURE)
 		return;
 
@@ -623,7 +624,7 @@
 
 	MAKE_STD_ZVAL(array_members);
 	array_init(array_members);
-	
+
 	add_assoc_string(array_group, "name", g->gr_name, 1);
 	add_assoc_string(array_group, "passwd", g->gr_passwd, 1);
 	for (count=0; g->gr_mem[count] != NULL; count++) {
@@ -645,7 +646,7 @@
 	POSIX.1, 6.x most I/O functions already supported by PHP.
 	POSIX.1, 7.x tty functions, TODO
 	POSIX.1, 8.x interactions with other C language functions
-	POSIX.1, 9.x system database access	
+	POSIX.1, 9.x system database access
  */
 
 /* {{{ proto array posix_getgrnam(string groupname)
@@ -655,7 +656,7 @@
 	char *name;
 	struct group *g;
 	int name_len;
-	
+
 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE)
 		return;
 
@@ -663,7 +664,7 @@
 		POSIX_G(last_error) = errno;
 		RETURN_FALSE;
 	}
-	
+
 	array_init(return_value);
 
 	if (!php_posix_group_to_array(g, return_value)) {
@@ -673,13 +674,13 @@
 }
 /* }}} */
 
-/* {{{ proto array posix_getgrgid(long gid) 
+/* {{{ proto array posix_getgrgid(long gid)
    Group database access (POSIX.1, 9.2.1) */
 PHP_FUNCTION(posix_getgrgid)
 {
 	long gid;
 	struct group *g;
-	
+
 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &gid) == FAILURE)
 		return;
 
@@ -713,14 +714,14 @@
 	return 1;
 }
 
-/* {{{ proto array posix_getpwnam(string groupname) 
+/* {{{ proto array posix_getpwnam(string groupname)
    User database access (POSIX.1, 9.2.2) */
 PHP_FUNCTION(posix_getpwnam)
 {
 	struct passwd *pw;
 	char *name;
 	int name_len;
-	
+
 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE)
 		return;
 
@@ -728,7 +729,7 @@
 		POSIX_G(last_error) = errno;
 		RETURN_FALSE;
 	}
-	
+
 	array_init(return_value);
 
 	if (!php_posix_passwd_to_array(pw, return_value)) {
@@ -739,13 +740,13 @@
 }
 /* }}} */
 
-/* {{{ proto array posix_getpwuid(long uid) 
+/* {{{ proto array posix_getpwuid(long uid)
    User database access (POSIX.1, 9.2.2) */
 PHP_FUNCTION(posix_getpwuid)
 {
 	long uid;
 	struct passwd *pw;
-	
+
 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &uid) == FAILURE)
 		return;
 
@@ -763,46 +764,12 @@
 }
 /* }}} */
 
-
-#ifdef HAVE_GETRLIMIT
-
-#define UNLIMITED_STRING "unlimited"
-
-/* {{{ posix_addlimit
+#if HAVE_GETRLIMIT || HAVE_SETRLIMIT
+/* {{{ limits[]
  */
-static int posix_addlimit(int limit, char *name, zval *return_value TSRMLS_DC) {
-	int result;
-	struct rlimit rl;
-	char hard[80];
-	char soft[80];
 
-	snprintf(hard, 80, "hard %s", name);
-	snprintf(soft, 80, "soft %s", name);
-
-	result = getrlimit(limit, &rl);
-	if (result < 0) {
-		POSIX_G(last_error) = errno;
-		return FAILURE;
-	}
-
-	if (rl.rlim_cur == RLIM_INFINITY) {
-		add_assoc_stringl(return_value, soft, UNLIMITED_STRING, sizeof(UNLIMITED_STRING)-1, 1);
-	} else {
-		add_assoc_long(return_value, soft, rl.rlim_cur);
-	}
-
-	if (rl.rlim_max == RLIM_INFINITY) {
-		add_assoc_stringl(return_value, hard, UNLIMITED_STRING, sizeof(UNLIMITED_STRING)-1, 1);
-	} else {
-		add_assoc_long(return_value, hard, rl.rlim_max);
-	}
-
-	return SUCCESS;
-}
-/* }}} */
+#define UNLIMITED_STRING "unlimited"
 
-/* {{{ limits[]
- */
 struct limitlist {
 	int limit;
 	char *name;
@@ -858,7 +825,42 @@
 	{ 0, NULL }
 };
 /* }}} */
+#endif
+
+#ifdef HAVE_GETRLIMIT
+
+/* {{{ posix_addlimit
+ */
+static int posix_addlimit(int limit, char *name, zval *return_value TSRMLS_DC) {
+	int result;
+	struct rlimit rl;
+	char hard[80];
+	char soft[80];
+
+	snprintf(hard, 80, "hard %s", name);
+	snprintf(soft, 80, "soft %s", name);
+
+	result = getrlimit(limit, &rl);
+	if (result < 0) {
+		POSIX_G(last_error) = errno;
+		return FAILURE;
+	}
 
+	if (rl.rlim_cur == RLIM_INFINITY) {
+		add_assoc_stringl(return_value, soft, UNLIMITED_STRING, sizeof(UNLIMITED_STRING)-1, 1);
+	} else {
+		add_assoc_long(return_value, soft, rl.rlim_cur);
+	}
+
+	if (rl.rlim_max == RLIM_INFINITY) {
+		add_assoc_stringl(return_value, hard, UNLIMITED_STRING, sizeof(UNLIMITED_STRING)-1, 1);
+	} else {
+		add_assoc_long(return_value, hard, rl.rlim_max);
+	}
+
+	return SUCCESS;
+}
+/* }}} */
 
 /* {{{ proto array posix_getrlimit(void)
    Get system resource consumption limits (This is not a POSIX function, but a BSDism and a SVR4ism. We compile conditionally) */
@@ -879,11 +881,87 @@
 
 #endif /* HAVE_GETRLIMIT */
 
+#ifdef HAVE_SETRLIMIT
+/* {{{ posix_setlimit
+ */
+static int posix_setlimit(int limit, zval **value TSRMLS_DC)
+{
+	zval **soft, **hard;
+	struct rlimit rl;
+	int result;
+
+	result = getrlimit(limit, &rl);
+	if (result < 0) {
+		POSIX_G(last_error) = errno;
+		return FAILURE;
+	}
+
+	if (zend_hash_index_find(Z_ARRVAL_PP(value), 0, (void **) &soft) == FAILURE ||
+		zend_hash_index_find(Z_ARRVAL_PP(value), 1, (void **) &hard) == FAILURE)
+	{
+		php_error_docref(NULL TSRMLS_CC, E_WARNING, "unexpected error");
+		return FAILURE;
+	}
+
+	if (Z_TYPE_PP(soft) == IS_STRING && !strcmp(Z_STRVAL_PP(value), UNLIMITED_STRING)) {
+		rl.rlim_cur = RLIM_INFINITY;
+	} else if (Z_TYPE_PP(soft) != IS_NULL){
+		convert_to_long_ex(soft);
+		rl.rlim_cur = Z_LVAL_PP(soft);
+	}
+
+	if (Z_TYPE_PP(hard) == IS_STRING && !strcmp(Z_STRVAL_PP(hard), UNLIMITED_STRING)) {
+		rl.rlim_max = RLIM_INFINITY;
+	} else if (Z_TYPE_PP(hard) != IS_NULL){
+		convert_to_long_ex(hard);
+		rl.rlim_max = Z_LVAL_PP(hard);
+	}
+
+	result = setrlimit(limit, &rl);
+	if (result < 0) {
+		POSIX_G(last_error) = errno;
+		return FAILURE;
+	}
+
+	return SUCCESS;
+}
+/* }}} */
+
+/* {{{ proto bool posix_setrlimit(array)
+   Set system resource consumption limits (This is not a POSIX function, but a BSDism and a SVR4ism. We compile conditionally) */
+PHP_FUNCTION(posix_setrlimit)
+{
+	zval *array, **value;
+	struct limitlist *l = NULL;
+
+	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a", &array) == FAILURE) {
+		return;
+	}
+
+	for (l = limits; l->name; l++) {
+		if (zend_hash_find(Z_ARRVAL_P(array), l->name, strlen(l->name) + 1, (void **) &value) != FAILURE) {
+			if (Z_TYPE_PP(value) != IS_ARRAY) {
+				php_error_docref(NULL TSRMLS_CC, E_WARNING, "Expected array");
+				continue;
+			} else if (zend_hash_num_elements(Z_ARRVAL_PP(value)) != 2) {
+				php_error_docref(NULL TSRMLS_CC, E_WARNING, "Array with values should have exacly 2 fields");
+				continue;
+			}
+
+			if (posix_setlimit(l->limit, value TSRMLS_CC) != SUCCESS)
+				RETURN_FALSE;
+		}
+	}
+
+	RETURN_TRUE;
+}
+#endif /* HAVE_SETRLIMIT */
+
 /* {{{ proto int posix_get_last_error(void)
    Retrieve the error number set by the last posix function which failed. */
 PHP_FUNCTION(posix_get_last_error)
 {
-	PHP_POSIX_NO_ARGS;	
+	PHP_POSIX_NO_ARGS;
 
 	RETURN_LONG(POSIX_G(last_error));
 }

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to