diff options
author | Jakub Jelinek <jakub@redhat.com> | 2007-07-12 18:26:36 +0000 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2007-07-12 18:26:36 +0000 |
commit | 0ecb606cb6cf65de1d9fc8a919bceb4be476c602 (patch) | |
tree | 2ea1f8305970753e4a657acb2ccc15ca3eec8e2c /resource | |
parent | 7d58530341304d403a6626d7f7a1913165fe2f32 (diff) | |
download | glibc-0ecb606cb6cf65de1d9fc8a919bceb4be476c602.zip glibc-0ecb606cb6cf65de1d9fc8a919bceb4be476c602.tar.gz glibc-0ecb606cb6cf65de1d9fc8a919bceb4be476c602.tar.bz2 |
2.5-18.1
Diffstat (limited to 'resource')
-rw-r--r-- | resource/Makefile | 4 | ||||
-rw-r--r-- | resource/getpriority.c | 37 | ||||
-rw-r--r-- | resource/getrlimit.c | 34 | ||||
-rw-r--r-- | resource/getrlimit64.c | 43 | ||||
-rw-r--r-- | resource/getrusage.c | 35 | ||||
-rw-r--r-- | resource/nice.c | 33 | ||||
-rw-r--r-- | resource/setpriority.c | 36 | ||||
-rw-r--r-- | resource/setrlimit.c | 37 | ||||
-rw-r--r-- | resource/setrlimit64.c | 43 | ||||
-rw-r--r-- | resource/tst-getrlimit.c | 112 | ||||
-rw-r--r-- | resource/ulimit.c | 39 | ||||
-rw-r--r-- | resource/vlimit.c | 51 | ||||
-rw-r--r-- | resource/vtimes.c | 65 |
13 files changed, 568 insertions, 1 deletions
diff --git a/resource/Makefile b/resource/Makefile index cddb6d3..68f9ff6 100644 --- a/resource/Makefile +++ b/resource/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 1991, 1992, 1994, 1995, 1997 Free Software Foundation, Inc. +# Copyright (C) 1991,1992,1994,1995,1997,2005 Free Software Foundation, Inc. # This file is part of the GNU C Library. # The GNU C Library is free software; you can redistribute it and/or @@ -24,4 +24,6 @@ headers := sys/resource.h bits/resource.h sys/vlimit.h sys/vtimes.h \ routines := getrlimit setrlimit getrlimit64 setrlimit64 getrusage ulimit \ vlimit vtimes getpriority setpriority nice +tests = tst-getrlimit + include ../Rules diff --git a/resource/getpriority.c b/resource/getpriority.c new file mode 100644 index 0000000..501c92a --- /dev/null +++ b/resource/getpriority.c @@ -0,0 +1,37 @@ +/* Copyright (C) 1991,95,96,97,2000,02 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <errno.h> +#include <sys/resource.h> + +/* Return the highest priority of any process specified by WHICH and WHO + (see <sys/resource.h>); if WHO is zero, the current process, process group, + or user (as specified by WHO) is used. A lower priority number means higher + priority. Priorities range from PRIO_MIN to PRIO_MAX. */ +int +getpriority (which, who) + enum __priority_which which; + id_t who; +{ + __set_errno (ENOSYS); + return -1; +} +libc_hidden_def (getpriority) + +stub_warning (getpriority) +#include <stub-tag.h> diff --git a/resource/getrlimit.c b/resource/getrlimit.c new file mode 100644 index 0000000..d4bcadd --- /dev/null +++ b/resource/getrlimit.c @@ -0,0 +1,34 @@ +/* Copyright (C) 1991, 1995, 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <errno.h> +#include <sys/resource.h> +#include <sys/types.h> + +/* Put the soft and hard limits for RESOURCE in *RLIMITS. + Returns 0 if successful, -1 if not (and sets errno). */ +int +__getrlimit (enum __rlimit_resource resource, struct rlimit *rlimits) +{ + __set_errno (ENOSYS); + return -1; +} +weak_alias (__getrlimit, getrlimit) + +stub_warning (getrlimit) +#include <stub-tag.h> diff --git a/resource/getrlimit64.c b/resource/getrlimit64.c new file mode 100644 index 0000000..dcd67cf --- /dev/null +++ b/resource/getrlimit64.c @@ -0,0 +1,43 @@ +/* Copyright (C) 1991, 1995, 1996, 1997, 1998 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <errno.h> +#include <sys/resource.h> +#include <sys/types.h> + +/* Put the soft and hard limits for RESOURCE in *RLIMITS. + Returns 0 if successful, -1 if not (and sets errno). */ +int +getrlimit64 (enum __rlimit_resource resource, struct rlimit64 *rlimits) +{ + struct rlimit rlimits32; + + if (__getrlimit (resource, &rlimits32) < 0) + return -1; + + if (rlimits32.rlim_cur == RLIM_INFINITY) + rlimits->rlim_cur = RLIM64_INFINITY; + else + rlimits->rlim_cur = rlimits32.rlim_cur; + if (rlimits32.rlim_max == RLIM_INFINITY) + rlimits->rlim_max = RLIM64_INFINITY; + else + rlimits->rlim_max = rlimits32.rlim_max; + + return 0; +} diff --git a/resource/getrusage.c b/resource/getrusage.c new file mode 100644 index 0000000..c679855 --- /dev/null +++ b/resource/getrusage.c @@ -0,0 +1,35 @@ +/* Copyright (C) 1991, 1995, 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sys/resource.h> +#include <errno.h> + +/* Return resource usage information on process indicated by WHO + and put it in *USAGE. Returns 0 for success, -1 for failure. */ +int +__getrusage (who, usage) + enum __rusage_who who; + struct rusage *usage; +{ + __set_errno (ENOSYS); + return -1; +} +stub_warning (getrusage) + +weak_alias (__getrusage, getrusage) +#include <stub-tag.h> diff --git a/resource/nice.c b/resource/nice.c new file mode 100644 index 0000000..8561931 --- /dev/null +++ b/resource/nice.c @@ -0,0 +1,33 @@ +/* Copyright (C) 1992, 1995, 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <errno.h> +#include <unistd.h> + +/* Increment the scheduling priority of the calling process by INCR. + The superuser may use a negative INCR to decrement the priority. */ +int +nice (incr) + int incr; +{ + __set_errno (ENOSYS); + return -1; +} + +stub_warning (nice) +#include <stub-tag.h> diff --git a/resource/setpriority.c b/resource/setpriority.c new file mode 100644 index 0000000..b2e6f8a --- /dev/null +++ b/resource/setpriority.c @@ -0,0 +1,36 @@ +/* Copyright (C) 1991,95,96,97,2000,02 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <errno.h> +#include <sys/resource.h> + +/* Set the priority of all processes specified by WHICH and WHO + to PRIO. Returns 0 on success, -1 on errors. */ +int +setpriority (which, who, prio) + enum __priority_which which; + id_t who; + int prio; +{ + __set_errno (ENOSYS); + return -1; +} +libc_hidden_def (setpriority) + +stub_warning (setpriority) +#include <stub-tag.h> diff --git a/resource/setrlimit.c b/resource/setrlimit.c new file mode 100644 index 0000000..c8f6e03 --- /dev/null +++ b/resource/setrlimit.c @@ -0,0 +1,37 @@ +/* Copyright (C) 1991, 1995, 1996, 1997, 1998 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <errno.h> +#include <sys/resource.h> +#include <sys/types.h> + +/* Set the soft and hard limits for RESOURCE to *RLIMITS. + Only the super-user can increase hard limits. + Return 0 if successful, -1 if not (and sets errno). */ +int +setrlimit (resource, rlimits) + enum __rlimit_resource resource; + const struct rlimit *rlimits; +{ + __set_errno (ENOSYS); + return -1; +} + + +stub_warning (setrlimit) +#include <stub-tag.h> diff --git a/resource/setrlimit64.c b/resource/setrlimit64.c new file mode 100644 index 0000000..d4b4bfc --- /dev/null +++ b/resource/setrlimit64.c @@ -0,0 +1,43 @@ +/* Copyright (C) 1991,1995,1996,1997,1998,2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <errno.h> +#include <sys/resource.h> +#include <sys/types.h> + +/* Set the soft and hard limits for RESOURCE to *RLIMITS. + Only the super-user can increase hard limits. + Return 0 if successful, -1 if not (and sets errno). */ +int +setrlimit64 (resource, rlimits) + enum __rlimit_resource resource; + const struct rlimit64 *rlimits; +{ + struct rlimit rlimits32; + + if (rlimits->rlim_cur >= RLIM_INFINITY) + rlimits32.rlim_cur = RLIM_INFINITY; + else + rlimits32.rlim_cur = rlimits->rlim_cur; + if (rlimits->rlim_max >= RLIM_INFINITY) + rlimits32.rlim_max = RLIM_INFINITY; + else + rlimits32.rlim_max = rlimits->rlim_max; + + return __setrlimit (resource, &rlimits32); +} diff --git a/resource/tst-getrlimit.c b/resource/tst-getrlimit.c new file mode 100644 index 0000000..6748034 --- /dev/null +++ b/resource/tst-getrlimit.c @@ -0,0 +1,112 @@ +#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" diff --git a/resource/ulimit.c b/resource/ulimit.c new file mode 100644 index 0000000..cc74054 --- /dev/null +++ b/resource/ulimit.c @@ -0,0 +1,39 @@ +/* Copyright (C) 1991, 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <errno.h> +#include <sys/resource.h> + +/* Function depends on CMD: + 1 = Return the limit on the size of a file, in units of 512 bytes. + 2 = Set the limit on the size of a file to NEWLIMIT. Only the + super-user can increase the limit. + 3 = Return the maximum possible address of the data segment. + 4 = Return the maximum number of files that the calling process + can open. + Returns -1 on errors. */ +long int +__ulimit (int cmd, ...) +{ + __set_errno (ENOSYS); + return -1; +} +weak_alias (__ulimit, ulimit) + +stub_warning (ulimit) +#include <stub-tag.h> diff --git a/resource/vlimit.c b/resource/vlimit.c new file mode 100644 index 0000000..03d89f4 --- /dev/null +++ b/resource/vlimit.c @@ -0,0 +1,51 @@ +/* Copyright (C) 1991, 1996, 1997, 1998, 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +/* This is generic in the sense that it will work with the BSD, SYSV, + or stub versions of getrlimit. Separate versions could be written + for efficiency, but it's probably not worth it. */ + +#include <sys/vlimit.h> +#include <sys/resource.h> +#include <errno.h> + +/* Set the soft limit for RESOURCE to be VALUE. + Returns 0 for success, -1 for failure. */ +int +vlimit (resource, value) + enum __vlimit_resource resource; + int value; +{ + if (resource >= LIM_CPU && resource <= LIM_MAXRSS) + { + /* The rlimit codes happen to each be one less + than the corresponding vlimit codes. */ + enum __rlimit_resource rlimit_res = + (enum __rlimit_resource) ((int) resource - 1); + struct rlimit lims; + + if (__getrlimit (rlimit_res, &lims) < 0) + return -1; + + lims.rlim_cur = value; + return __setrlimit (rlimit_res, &lims); + } + + __set_errno (EINVAL); + return -1; +} diff --git a/resource/vtimes.c b/resource/vtimes.c new file mode 100644 index 0000000..37dc01b --- /dev/null +++ b/resource/vtimes.c @@ -0,0 +1,65 @@ +/* Copyright (C) 1991, 1997, 1998 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <stddef.h> +#include <sys/vtimes.h> +#include <sys/resource.h> + +/* Return the number of 1/VTIMES_UNITS_PER_SECOND-second + units in the `struct timeval' TV. */ +#define TIMEVAL_TO_VTIMES(tv) \ + ((tv.tv_sec * VTIMES_UNITS_PER_SECOND) + \ + (tv.tv_usec * VTIMES_UNITS_PER_SECOND / 1000000)) + +/* If VT is not NULL, write statistics for WHO into *VT. + Return 0 for success, -1 for failure. */ +static int +vtimes_one (struct vtimes *vt, enum __rusage_who who) +{ + if (vt != NULL) + { + struct rusage usage; + + if (__getrusage (who, &usage) < 0) + return -1; + + vt->vm_utime = TIMEVAL_TO_VTIMES (usage.ru_utime); + vt->vm_stime = TIMEVAL_TO_VTIMES (usage.ru_stime); + vt->vm_idsrss = usage.ru_idrss + usage.ru_isrss; + vt->vm_majflt = usage.ru_majflt; + vt->vm_minflt = usage.ru_minflt; + vt->vm_nswap = usage.ru_nswap; + vt->vm_inblk = usage.ru_inblock; + vt->vm_oublk = usage.ru_oublock; + } + return 0; +} + +/* If CURRENT is not NULL, write statistics for the current process into + *CURRENT. If CHILD is not NULL, write statistics for all terminated child + processes into *CHILD. Returns 0 for success, -1 for failure. */ +int +vtimes (current, child) + struct vtimes *current; + struct vtimes *child; +{ + if (vtimes_one (current, RUSAGE_SELF) < 0 + || vtimes_one (child, RUSAGE_CHILDREN) < 0) + return -1; + return 0; +} |