From 0ecb606cb6cf65de1d9fc8a919bceb4be476c602 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 12 Jul 2007 18:26:36 +0000 Subject: 2.5-18.1 --- resource/Makefile | 4 +- resource/getpriority.c | 37 ++++++++++++++++ resource/getrlimit.c | 34 ++++++++++++++ resource/getrlimit64.c | 43 ++++++++++++++++++ resource/getrusage.c | 35 +++++++++++++++ resource/nice.c | 33 ++++++++++++++ resource/setpriority.c | 36 +++++++++++++++ resource/setrlimit.c | 37 ++++++++++++++++ resource/setrlimit64.c | 43 ++++++++++++++++++ resource/tst-getrlimit.c | 112 +++++++++++++++++++++++++++++++++++++++++++++++ resource/ulimit.c | 39 +++++++++++++++++ resource/vlimit.c | 51 +++++++++++++++++++++ resource/vtimes.c | 65 +++++++++++++++++++++++++++ 13 files changed, 568 insertions(+), 1 deletion(-) create mode 100644 resource/getpriority.c create mode 100644 resource/getrlimit.c create mode 100644 resource/getrlimit64.c create mode 100644 resource/getrusage.c create mode 100644 resource/nice.c create mode 100644 resource/setpriority.c create mode 100644 resource/setrlimit.c create mode 100644 resource/setrlimit64.c create mode 100644 resource/tst-getrlimit.c create mode 100644 resource/ulimit.c create mode 100644 resource/vlimit.c create mode 100644 resource/vtimes.c (limited to 'resource') diff --git a/resource/Makefile b/resource/Makefile index cddb6d353c..68f9ff65a3 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 0000000000..501c92a08a --- /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 +#include + +/* Return the highest priority of any process specified by WHICH and WHO + (see ); 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 diff --git a/resource/getrlimit.c b/resource/getrlimit.c new file mode 100644 index 0000000000..d4bcadd762 --- /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 +#include +#include + +/* 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 diff --git a/resource/getrlimit64.c b/resource/getrlimit64.c new file mode 100644 index 0000000000..dcd67cf56f --- /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 +#include +#include + +/* 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 0000000000..c679855ace --- /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 +#include + +/* 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 diff --git a/resource/nice.c b/resource/nice.c new file mode 100644 index 0000000000..8561931af7 --- /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 +#include + +/* 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 diff --git a/resource/setpriority.c b/resource/setpriority.c new file mode 100644 index 0000000000..b2e6f8a059 --- /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 +#include + +/* 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 diff --git a/resource/setrlimit.c b/resource/setrlimit.c new file mode 100644 index 0000000000..c8f6e03ad3 --- /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 +#include +#include + +/* 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 diff --git a/resource/setrlimit64.c b/resource/setrlimit64.c new file mode 100644 index 0000000000..d4b4bfce0a --- /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 +#include +#include + +/* 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 0000000000..67480340f0 --- /dev/null +++ b/resource/tst-getrlimit.c @@ -0,0 +1,112 @@ +#include +#include +#include +#include + + +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 0000000000..cc74054456 --- /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 +#include + +/* 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 diff --git a/resource/vlimit.c b/resource/vlimit.c new file mode 100644 index 0000000000..03d89f4ad5 --- /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 +#include +#include + +/* 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 0000000000..37dc01b2fb --- /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 +#include +#include + +/* 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; +} -- cgit 1.4.1