(root)/
glibc-2.38/
sysdeps/
posix/
ulimit.c
       1  /* Copyright (C) 1991-2023 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, see
      16     <https://www.gnu.org/licenses/>.  */
      17  
      18  #include <errno.h>
      19  #include <stdarg.h>
      20  #include <sysdep.h>
      21  #include <ulimit.h>
      22  #include <unistd.h>
      23  #include <limits.h>
      24  #include <sys/resource.h>
      25  
      26  /* Function depends on CMD:
      27     1 = Return the limit on the size of a file, in units of 512 bytes.
      28     2 = Set the limit on the size of a file to NEWLIMIT.  Only the
      29         super-user can increase the limit.
      30     3 = illegal due to shared libraries; normally is
      31         (Return the maximum possible address of the data segment.)
      32     4 = Return the maximum number of files that the calling process
      33         can open.
      34     Returns -1 on errors.  */
      35  long int
      36  __ulimit (int cmd, ...)
      37  {
      38    struct rlimit limit;
      39    va_list va;
      40    long int result = -1;
      41  
      42    va_start (va, cmd);
      43  
      44    switch (cmd)
      45      {
      46      case UL_GETFSIZE:
      47        /* Get limit on file size.  */
      48        if (__getrlimit (RLIMIT_FSIZE, &limit) == 0)
      49  	/* Convert from bytes to 512 byte units.  */
      50  	result =  (limit.rlim_cur == RLIM_INFINITY
      51  		   ? LONG_MAX : limit.rlim_cur / 512);
      52        break;
      53  
      54      case UL_SETFSIZE:
      55        /* Set limit on file size.  */
      56        {
      57  	long int newlimit = va_arg (va, long int);
      58  	long int newlen;
      59  
      60  	if ((rlim_t) newlimit > RLIM_INFINITY / 512)
      61  	  {
      62  	    limit.rlim_cur = RLIM_INFINITY;
      63  	    limit.rlim_max = RLIM_INFINITY;
      64  	    newlen = LONG_MAX;
      65  	  }
      66  	else
      67  	  {
      68  	    limit.rlim_cur = newlimit * 512;
      69  	    limit.rlim_max = newlimit * 512;
      70  	    newlen = newlimit;
      71  	  }
      72  
      73  	result = __setrlimit (RLIMIT_FSIZE, &limit);
      74  	if (result != -1)
      75  	  result = newlen;
      76        }
      77        break;
      78  
      79      case __UL_GETOPENMAX:
      80        result = __sysconf (_SC_OPEN_MAX);
      81        break;
      82  
      83      default:
      84        __set_errno (EINVAL);
      85      }
      86  
      87    va_end (va);
      88  
      89    return result;
      90  }
      91  
      92  weak_alias (__ulimit, ulimit);