Hi, this patch adds posix_setrlimit function (in posix extension), which can be useful in standalone apps to lower your resources limits (for example cpu limit).
Example usage is: <?php $a = array('cpu' => array('1', '3')); posix_setrlimit($a); ?> Could you review it and consider to apply if it's ok? -- mg
diff -u -r1.14 php_posix.h --- php_posix.h 8 Jan 2004 17:32:41 -0000 1.14 +++ php_posix.h 19 Aug 2004 15:37:30 -0000 @@ -98,6 +98,7 @@ #ifdef HAVE_GETRLIMIT PHP_FUNCTION(posix_getrlimit); +PHP_FUNCTION(posix_setrlimit); #endif PHP_FUNCTION(posix_get_last_error); 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 19 Aug 2004 15:37:31 -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) @@ -163,7 +164,7 @@ NULL, NULL, PHP_MINFO(posix), - NO_VERSION_YET, + NO_VERSION_YET, STANDARD_MODULE_PROPERTIES }; /* }}} */ @@ -200,8 +201,8 @@ if (kill(pid, sig) < 0) { POSIX_G(last_error) = errno; RETURN_FALSE; - } - + } + RETURN_TRUE; } /* }}} */ @@ -877,6 +878,80 @@ } /* }}} */ +/* {{{ 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_GETRLIMIT */ /* {{{ proto int posix_get_last_error(void)
-- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php