chiark / gitweb /
eglibc (2.11.3-4+deb6u3) squeeze-lts; urgency=medium
[eglibc.git] / sysdeps / unix / bsd / ulimit.c
1 /* Copyright (C) 1991,1992,1994-1998,2001,2005 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, write to the Free
16    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17    02111-1307 USA.  */
18
19 #include <errno.h>
20 #include <stdarg.h>
21 #include <sysdep.h>
22 #include <ulimit.h>
23 #include <unistd.h>
24 #include <sys/resource.h>
25
26
27 extern int _etext;
28
29 /* Function depends on CMD:
30    1 = Return the limit on the size of a file, in units of 512 bytes.
31    2 = Set the limit on the size of a file to NEWLIMIT.  Only the
32        super-user can increase the limit.
33    3 = Return the maximum possible address of the data segment.
34    4 = Return the maximum number of files that the calling process
35        can open.
36    Returns -1 on errors.  */
37 long int
38 ulimit (int cmd, ...)
39 {
40   struct rlimit limit;
41   va_list va;
42   long int result = -1;
43
44   va_start (va, cmd);
45
46   switch (cmd)
47     {
48     case UL_GETFSIZE:
49       /* Get limit on file size.  */
50       if (getrlimit (RLIMIT_FSIZE, &limit) == 0)
51         /* Convert from bytes to 512 byte units.  */
52         result = limit.rlim_cur / 512;
53       break;
54
55     case UL_SETFSIZE:
56       /* Set limit on file size.  */
57       {
58         long int newlimit = va_arg (va, long int);
59
60         if ((rlim_t) newlimit > RLIM_INFINITY / 512)
61           {
62             limit.rlim_cur = RLIM_INFINITY;
63             limit.rlim_max = RLIM_INFINITY;
64           }
65         else
66           {
67             limit.rlim_cur = newlimit * 512;
68             limit.rlim_max = newlimit * 512;
69           }
70
71         result = setrlimit (RLIMIT_FSIZE, &limit);
72       }
73       break;
74
75     case __UL_GETMAXBRK:
76       /* Get maximum address for `brk'.  */
77       if (getrlimit (RLIMIT_DATA, &limit) == 0)
78         result = ((long int) &_etext) + limit.rlim_cur;
79       break;
80
81     case __UL_GETOPENMAX:
82       result = sysconf (_SC_OPEN_MAX);
83       break;
84
85     default:
86       __set_errno (EINVAL);
87     }
88
89   va_end (va);
90
91   return result;
92 }