|  | #include <errno.h> | 
|  | #include <stdbool.h> | 
|  | #include <stdio.h> | 
|  | #include <sys/resource.h> | 
|  |  | 
|  |  | 
|  | static struct | 
|  | { | 
|  | const char *name; | 
|  | int resource; | 
|  | bool required; | 
|  | } tests[] = | 
|  | { | 
|  | /* The following 7 limits are part of POSIX and must exist.  */ | 
|  | { "RLIMIT_CORE", RLIMIT_CORE, true }, | 
|  | { "RLIMIT_CPU", RLIMIT_CPU, true }, | 
|  | { "RLIMIT_DATA", RLIMIT_DATA, true }, | 
|  | { "RLIMIT_FSIZE", RLIMIT_FSIZE, true }, | 
|  | { "RLIMIT_NOFILE", RLIMIT_NOFILE, true }, | 
|  | { "RLIMIT_STACK", RLIMIT_STACK, true }, | 
|  | { "RLIMIT_AS", RLIMIT_AS, true }, | 
|  | /* The following are traditional Unix limits which are also | 
|  | expected (by us).  */ | 
|  | { "RLIMIT_RSS", RLIMIT_RSS, true }, | 
|  | { "RLIMIT_NPROC", RLIMIT_NPROC, true }, | 
|  | /* The following are extensions.  */ | 
|  | #ifdef RLIMIT_MEMLOCK | 
|  | { "RLIMIT_MEMLOCK", RLIMIT_MEMLOCK, false }, | 
|  | #endif | 
|  | #ifdef RLIMIT_LOCKS | 
|  | { "RLIMIT_LOCKS", RLIMIT_LOCKS, false }, | 
|  | #endif | 
|  | #ifdef RLIMIT_SIGPENDING | 
|  | { "RLIMIT_SIGPENDING", RLIMIT_SIGPENDING, false }, | 
|  | #endif | 
|  | #ifdef RLIMIT_MSGQUEUE | 
|  | { "RLIMIT_MSGQUEUE", RLIMIT_MSGQUEUE, false }, | 
|  | #endif | 
|  | #ifdef RLIMIT_NICE | 
|  | { "RLIMIT_NICE", RLIMIT_NICE, false }, | 
|  | #endif | 
|  | #ifdef RLIMIT_RTPRIO | 
|  | { "RLIMIT_RTPRIO", RLIMIT_RTPRIO, false }, | 
|  | #endif | 
|  | }; | 
|  | #define ntests (sizeof (tests) / sizeof (tests[0])) | 
|  |  | 
|  |  | 
|  | static int | 
|  | do_test (void) | 
|  | { | 
|  | int status = 0; | 
|  |  | 
|  | for (int i = 0; i < ntests; ++i) | 
|  | { | 
|  | bool this_ok = true; | 
|  |  | 
|  | struct rlimit r; | 
|  | int res = getrlimit (tests[i].resource, &r); | 
|  | if (res == -1) | 
|  | { | 
|  | if (errno == EINVAL) | 
|  | { | 
|  | if (tests[i].required) | 
|  | { | 
|  | printf ("limit %s expectedly not available for getrlimit\n", | 
|  | tests[i].name); | 
|  | status = 1; | 
|  | this_ok = false; | 
|  | } | 
|  | } | 
|  | else | 
|  | { | 
|  | printf ("getrlimit for %s returned unexpected error: %m\n", | 
|  | tests[i].name); | 
|  | status = 1; | 
|  | this_ok = false; | 
|  | } | 
|  | } | 
|  |  | 
|  | struct rlimit64 r64; | 
|  | res = getrlimit64 (tests[i].resource, &r64); | 
|  | if (res == -1) | 
|  | { | 
|  | if (errno == EINVAL) | 
|  | { | 
|  | if (tests[i].required) | 
|  | { | 
|  | printf ("limit %s expectedly not available for getrlimit64" | 
|  | "\n", tests[i].name); | 
|  | status = 1; | 
|  | this_ok = false; | 
|  | } | 
|  | } | 
|  | else | 
|  | { | 
|  | printf ("getrlimit64 for %s returned unexpected error: %m\n", | 
|  | tests[i].name); | 
|  | status = 1; | 
|  | this_ok = false; | 
|  | } | 
|  | } | 
|  |  | 
|  | if (this_ok) | 
|  | printf ("limit %s OK\n", tests[i].name); | 
|  | } | 
|  |  | 
|  | return status; | 
|  | } | 
|  |  | 
|  | #define TEST_FUNCTION do_test () | 
|  | #include "../test-skeleton.c" |