Skip to content

Commit 963d906

Browse files
committed
Add posix_setrlimit() FR #54603
1 parent 301ee26 commit 963d906

File tree

4 files changed

+120
-2
lines changed

4 files changed

+120
-2
lines changed

ext/posix/config.m4

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ if test "$PHP_POSIX" = "yes"; then
1111

1212
AC_CHECK_HEADERS(sys/mkdev.h)
1313

14-
AC_CHECK_FUNCS(seteuid setegid setsid getsid setpgid getpgid ctermid mkfifo mknod getrlimit getlogin getgroups makedev initgroups getpwuid_r getgrgid_r)
14+
AC_CHECK_FUNCS(seteuid setegid setsid getsid setpgid getpgid ctermid mkfifo mknod setrlimit getrlimit getlogin getgroups makedev initgroups getpwuid_r getgrgid_r)
1515

1616
AC_MSG_CHECKING([for working ttyname_r() implementation])
1717
AC_TRY_RUN([

ext/posix/php_posix.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,10 @@ PHP_FUNCTION(posix_getpwuid);
113113
PHP_FUNCTION(posix_getrlimit);
114114
#endif
115115

116+
#ifdef HAVE_SETRLIMIT
117+
PHP_FUNCTION(posix_setrlimit);
118+
#endif
119+
116120
#ifdef HAVE_INITGROUPS
117121
PHP_FUNCTION(posix_initgroups);
118122
#endif

ext/posix/posix.c

Lines changed: 97 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,14 @@ ZEND_BEGIN_ARG_INFO(arginfo_posix_getrlimit, 0)
199199
ZEND_END_ARG_INFO()
200200
#endif
201201

202+
#ifdef HAVE_SETRLIMIT
203+
ZEND_BEGIN_ARG_INFO_EX(arginfo_posix_setrlimit, 0, 0, 3)
204+
ZEND_ARG_INFO(0, resource)
205+
ZEND_ARG_INFO(0, softlimit)
206+
ZEND_ARG_INFO(0, hardlimit)
207+
ZEND_END_ARG_INFO()
208+
#endif
209+
202210
ZEND_BEGIN_ARG_INFO(arginfo_posix_get_last_error, 0)
203211
ZEND_END_ARG_INFO()
204212

@@ -293,6 +301,9 @@ const zend_function_entry posix_functions[] = {
293301
#ifdef HAVE_GETRLIMIT
294302
PHP_FE(posix_getrlimit, arginfo_posix_getrlimit)
295303
#endif
304+
#ifdef HAVE_SETRLIMIT
305+
PHP_FE(posix_setrlimit, arginfo_posix_setrlimit)
306+
#endif
296307

297308
PHP_FE(posix_get_last_error, arginfo_posix_get_last_error)
298309
PHP_FALIAS(posix_errno, posix_get_last_error, arginfo_posix_get_last_error)
@@ -344,7 +355,54 @@ static PHP_MINIT_FUNCTION(posix)
344355
#ifdef S_IFSOCK
345356
REGISTER_LONG_CONSTANT("POSIX_S_IFSOCK", S_IFSOCK, CONST_CS | CONST_PERSISTENT);
346357
#endif
347-
358+
#ifdef RLIMIT_AS
359+
REGISTER_LONG_CONSTANT("POSIX_RLIMIT_AS", RLIMIT_AS, CONST_CS | CONST_PERSISTENT);
360+
#endif
361+
#ifdef RLIMIT_CORE
362+
REGISTER_LONG_CONSTANT("POSIX_RLIMIT_CORE", RLIMIT_CORE, CONST_CS | CONST_PERSISTENT);
363+
#endif
364+
#ifdef RLIMIT_CPU
365+
REGISTER_LONG_CONSTANT("POSIX_RLIMIT_CPU", RLIMIT_CPU, CONST_CS | CONST_PERSISTENT);
366+
#endif
367+
#ifdef RLIMIT_DATA
368+
REGISTER_LONG_CONSTANT("POSIX_RLIMIT_DATA", RLIMIT_DATA, CONST_CS | CONST_PERSISTENT);
369+
#endif
370+
#ifdef RLIMIT_FSIZE
371+
REGISTER_LONG_CONSTANT("POSIX_RLIMIT_FSIZE", RLIMIT_FSIZE, CONST_CS | CONST_PERSISTENT);
372+
#endif
373+
#ifdef RLIMIT_LOCKS
374+
REGISTER_LONG_CONSTANT("POSIX_RLIMIT_LOCKS", RLIMIT_LOCKS, CONST_CS | CONST_PERSISTENT);
375+
#endif
376+
#ifdef RLIMIT_MEMLOCK
377+
REGISTER_LONG_CONSTANT("POSIX_RLIMIT_MEMLOCK", RLIMIT_MEMLOCK, CONST_CS | CONST_PERSISTENT);
378+
#endif
379+
#ifdef RLIMIT_MSGQUEUE
380+
REGISTER_LONG_CONSTANT("POSIX_RLIMIT_MSGQUEUE", RLIMIT_MSGQUEUE, CONST_CS | CONST_PERSISTENT);
381+
#endif
382+
#ifdef RLIMIT_NICE
383+
REGISTER_LONG_CONSTANT("POSIX_RLIMIT_NICE", RLIMIT_NICE, CONST_CS | CONST_PERSISTENT);
384+
#endif
385+
#ifdef RLIMIT_NOFILE
386+
REGISTER_LONG_CONSTANT("POSIX_RLIMIT_NOFILE", RLIMIT_NOFILE, CONST_CS | CONST_PERSISTENT);
387+
#endif
388+
#ifdef RLIMIT_NPROC
389+
REGISTER_LONG_CONSTANT("POSIX_RLIMIT_NPROC", RLIMIT_NPROC, CONST_CS | CONST_PERSISTENT);
390+
#endif
391+
#ifdef RLIMIT_RSS
392+
REGISTER_LONG_CONSTANT("POSIX_RLIMIT_RSS", RLIMIT_RSS, CONST_CS | CONST_PERSISTENT);
393+
#endif
394+
#ifdef RLIMIT_RTPRIO
395+
REGISTER_LONG_CONSTANT("POSIX_RLIMIT_RTPRIO", RLIMIT_RTPRIO, CONST_CS | CONST_PERSISTENT);
396+
#endif
397+
#ifdef RLIMIT_RTTIME
398+
REGISTER_LONG_CONSTANT("POSIX_RLIMIT_RTTIME", RLIMIT_RTTIME, CONST_CS | CONST_PERSISTENT);
399+
#endif
400+
#ifdef RLIMIT_SIGPENDING
401+
REGISTER_LONG_CONSTANT("POSIX_RLIMIT_SIGPENDING", RLIMIT_SIGPENDING, CONST_CS | CONST_PERSISTENT);
402+
#endif
403+
#ifdef RLIMIT_STACK
404+
REGISTER_LONG_CONSTANT("POSIX_RLIMIT_STACK", RLIMIT_STACK, CONST_CS | CONST_PERSISTENT);
405+
#endif
348406
return SUCCESS;
349407
}
350408
/* }}} */
@@ -1322,6 +1380,44 @@ PHP_FUNCTION(posix_getrlimit)
13221380

13231381
#endif /* HAVE_GETRLIMIT */
13241382

1383+
#ifdef HAVE_SETRLIMIT
1384+
/* {{{ proto bool posix_setrlimit(int resource, string softlimit, string hardlimit)
1385+
Set system resource consumption limits (POSIX.1-2001) */
1386+
PHP_FUNCTION(posix_setrlimit)
1387+
{
1388+
struct rlimit rl;
1389+
char *cur, *max;
1390+
size_t cur_len, max_len;
1391+
int res;
1392+
1393+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "lss", &res, &cur, &cur_len, &max, &max_len) == FAILURE) {
1394+
RETURN_FALSE;
1395+
}
1396+
1397+
if (!strcasecmp(cur, "unlimited")) {
1398+
rl.rlim_cur = RLIM_INFINITY;
1399+
} else {
1400+
rl.rlim_cur = zend_atol(cur, cur_len);
1401+
}
1402+
1403+
if (!strcasecmp(max, "unlimited")) {
1404+
rl.rlim_max = RLIM_INFINITY;
1405+
} else {
1406+
rl.rlim_max = zend_atol(max, max_len);
1407+
}
1408+
1409+
if (setrlimit(res, &rl) == -1) {
1410+
POSIX_G(last_error) = errno;
1411+
RETURN_FALSE;
1412+
}
1413+
1414+
RETURN_TRUE;
1415+
}
1416+
/* }}} */
1417+
1418+
#endif /* HAVE_SETRLIMIT */
1419+
1420+
13251421
/* {{{ proto int posix_get_last_error(void)
13261422
Retrieve the error number set by the last posix function which failed. */
13271423
PHP_FUNCTION(posix_get_last_error)

ext/posix/tests/posix_setrlimit.phpt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
--TEST--
2+
posix_setrlimit(): Basic tests
3+
--SKIPIF--
4+
<?php
5+
if (!extension_loaded('posix')) die('skip - POSIX extension not loaded');
6+
if (!function_exists('posix_setrlimit')) die('skip posix_setrlimit() not found');
7+
?>
8+
--FILE--
9+
<?php
10+
11+
var_dump(posix_setrlimit(POSIX_RLIMIT_NOFILE, 128, 128));
12+
var_dump(posix_setrlimit(POSIX_RLIMIT_NOFILE, 129, 128));
13+
14+
?>
15+
--EXPECTF--
16+
bool(true)
17+
bool(false)
18+

0 commit comments

Comments
 (0)