The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/compat/svr4/svr4_resource.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*      Derived from:
    2  *      $NetBSD: svr4_resource.c,v 1.3 1998/12/13 18:00:52 christos Exp $
    3  */
    4 
    5 /*-
    6  * Original copyright:
    7  *
    8  * Copyright (c) 1998 The NetBSD Foundation, Inc.
    9  * All rights reserved.
   10  *
   11  * This code is derived from software contributed to The NetBSD Foundation
   12  * by Christos Zoulas.
   13  *
   14  * Redistribution and use in source and binary forms, with or without
   15  * modification, are permitted provided that the following conditions
   16  * are met:
   17  * 1. Redistributions of source code must retain the above copyright
   18  *    notice, this list of conditions and the following disclaimer.
   19  * 2. Redistributions in binary form must reproduce the above copyright
   20  *    notice, this list of conditions and the following disclaimer in the
   21  *    documentation and/or other materials provided with the distribution.
   22  * 3. All advertising materials mentioning features or use of this software
   23  *    must display the following acknowledgement:
   24  *        This product includes software developed by the NetBSD
   25  *        Foundation, Inc. and its contributors.
   26  * 4. Neither the name of The NetBSD Foundation nor the names of its
   27  *    contributors may be used to endorse or promote products derived
   28  *    from this software without specific prior written permission.
   29  *
   30  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
   31  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
   32  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   33  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
   34  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   35  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   36  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   37  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   38  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   39  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   40  * POSSIBILITY OF SUCH DAMAGE.
   41  * 
   42  * $FreeBSD: releng/5.0/sys/compat/svr4/svr4_resource.c 108086 2002-12-19 09:40:13Z alfred $
   43  */
   44 
   45 /*
   46  * Portions of this software have been derived from software contributed
   47  * to the FreeBSD Project by Mark Newton.
   48  *
   49  * Copyright (c) 1999 Mark Newton
   50  * All rights reserved.
   51  * 
   52  * Redistribution and use in source and binary forms, with or without
   53  * modification, are permitted provided that the following conditions
   54  * are met:
   55  * 1. Redistributions of source code must retain the above copyright
   56  *    notice, this list of conditions and the following disclaimer.
   57  * 2. Redistributions in binary form must reproduce the above copyright
   58  *    notice, this list of conditions and the following disclaimer in the
   59  *    documentation and/or other materials provided with the distribution.
   60  * 3. The name of the author may not be used to endorse or promote products
   61  *    derived from this software without specific prior written permission
   62  *
   63  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   64  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   65  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
   66  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
   67  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   68  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   69  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   70  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   71  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
   72  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   73  */
   74 
   75 #include <sys/param.h>
   76 #include <sys/systm.h>
   77 #include <sys/file.h>
   78 #include <sys/lock.h>
   79 #include <sys/mutex.h>
   80 #include <sys/proc.h>
   81 #include <sys/resource.h>
   82 #include <sys/resourcevar.h>
   83 
   84 #include <compat/svr4/svr4.h>
   85 #include <compat/svr4/svr4_types.h>
   86 #include <compat/svr4/svr4_resource.h>
   87 #include <compat/svr4/svr4_signal.h>
   88 #include <compat/svr4/svr4_proto.h>
   89 #include <compat/svr4/svr4_util.h>
   90 
   91 static __inline int svr4_to_native_rl(int);
   92 
   93 static __inline int
   94 svr4_to_native_rl(rl)
   95         int rl;
   96 {
   97         switch (rl) {
   98         case SVR4_RLIMIT_CPU:
   99                 return RLIMIT_CPU;
  100         case SVR4_RLIMIT_FSIZE:
  101                 return RLIMIT_FSIZE;
  102         case SVR4_RLIMIT_DATA:
  103                 return RLIMIT_DATA;
  104         case SVR4_RLIMIT_STACK:
  105                 return RLIMIT_STACK;
  106         case SVR4_RLIMIT_CORE:
  107                 return RLIMIT_CORE;
  108         case SVR4_RLIMIT_NOFILE:
  109                 return RLIMIT_NOFILE;
  110         case SVR4_RLIMIT_VMEM:
  111                 return RLIMIT_VMEM;
  112         default:
  113                 return -1;
  114         }
  115 }
  116 
  117 /*
  118  * Check if the resource limit fits within the BSD range and it is not
  119  * one of the magic SVR4 limit values
  120  */
  121 #define OKLIMIT(l) (((int32_t)(l)) >= 0 && ((int32_t)(l)) < 0x7fffffff && \
  122         ((svr4_rlim_t)(l)) != SVR4_RLIM_INFINITY && \
  123         ((svr4_rlim_t)(l)) != SVR4_RLIM_SAVED_CUR && \
  124         ((svr4_rlim_t)(l)) != SVR4_RLIM_SAVED_MAX)
  125 
  126 #define OKLIMIT64(l) (((rlim_t)(l)) >= 0 && ((rlim_t)(l)) < RLIM_INFINITY && \
  127         ((svr4_rlim64_t)(l)) != SVR4_RLIM64_INFINITY && \
  128         ((svr4_rlim64_t)(l)) != SVR4_RLIM64_SAVED_CUR && \
  129         ((svr4_rlim64_t)(l)) != SVR4_RLIM64_SAVED_MAX)
  130 
  131 int
  132 svr4_sys_getrlimit(td, uap)
  133         register struct thread *td;
  134         struct svr4_sys_getrlimit_args *uap;
  135 {
  136         int rl = svr4_to_native_rl(uap->which);
  137         struct rlimit blim;
  138         struct svr4_rlimit slim;
  139 
  140         if (rl == -1)
  141                 return EINVAL;
  142 
  143         /* For p_rlimit. */
  144         mtx_assert(&Giant, MA_OWNED);
  145         blim = td->td_proc->p_rlimit[rl];
  146 
  147         /*
  148          * Our infinity, is their maxfiles.
  149          */
  150         if (rl == RLIMIT_NOFILE && blim.rlim_max == RLIM_INFINITY)
  151                 blim.rlim_max = maxfiles;
  152 
  153         /*
  154          * If the limit can be be represented, it is returned.
  155          * Otherwise, if rlim_cur == rlim_max, return RLIM_SAVED_MAX
  156          * else return RLIM_SAVED_CUR
  157          */
  158         if (blim.rlim_max == RLIM_INFINITY)
  159                 slim.rlim_max = SVR4_RLIM_INFINITY;
  160         else if (OKLIMIT(blim.rlim_max))
  161                 slim.rlim_max = (svr4_rlim_t) blim.rlim_max;
  162         else
  163                 slim.rlim_max = SVR4_RLIM_SAVED_MAX;
  164 
  165         if (blim.rlim_cur == RLIM_INFINITY)
  166                 slim.rlim_cur = SVR4_RLIM_INFINITY;
  167         else if (OKLIMIT(blim.rlim_cur))
  168                 slim.rlim_cur = (svr4_rlim_t) blim.rlim_cur;
  169         else if (blim.rlim_max == blim.rlim_cur)
  170                 slim.rlim_cur = SVR4_RLIM_SAVED_MAX;
  171         else
  172                 slim.rlim_cur = SVR4_RLIM_SAVED_CUR;
  173 
  174         return copyout(&slim, uap->rlp, sizeof(*uap->rlp));
  175 }
  176 
  177 
  178 int
  179 svr4_sys_setrlimit(td, uap)
  180         register struct thread *td;
  181         struct svr4_sys_setrlimit_args *uap;
  182 {
  183         int rl = svr4_to_native_rl(uap->which);
  184         struct rlimit blim, *limp;
  185         struct svr4_rlimit slim;
  186         int error;
  187 
  188         if (rl == -1)
  189                 return EINVAL;
  190 
  191         /* For p_rlimit. */
  192         mtx_assert(&Giant, MA_OWNED);
  193         limp = &td->td_proc->p_rlimit[rl];
  194 
  195         if ((error = copyin(uap->rlp, &slim, sizeof(slim))) != 0)
  196                 return error;
  197 
  198         /*
  199          * if the limit is SVR4_RLIM_INFINITY, then we set it to our
  200          * unlimited.
  201          * We should also: If it is SVR4_RLIM_SAVED_MAX, we should set the
  202          * new limit to the corresponding saved hard limit, and if
  203          * it is equal to SVR4_RLIM_SAVED_CUR, we should set it to the
  204          * corresponding saved soft limit.
  205          *
  206          */
  207         if (slim.rlim_max == SVR4_RLIM_INFINITY)
  208                 blim.rlim_max = RLIM_INFINITY;
  209         else if (OKLIMIT(slim.rlim_max))
  210                 blim.rlim_max = (rlim_t) slim.rlim_max;
  211         else if (slim.rlim_max == SVR4_RLIM_SAVED_MAX)
  212                 blim.rlim_max = limp->rlim_max;
  213         else if (slim.rlim_max == SVR4_RLIM_SAVED_CUR)
  214                 blim.rlim_max = limp->rlim_cur;
  215 
  216         if (slim.rlim_cur == SVR4_RLIM_INFINITY)
  217                 blim.rlim_cur = RLIM_INFINITY;
  218         else if (OKLIMIT(slim.rlim_cur))
  219                 blim.rlim_cur = (rlim_t) slim.rlim_cur;
  220         else if (slim.rlim_cur == SVR4_RLIM_SAVED_MAX)
  221                 blim.rlim_cur = limp->rlim_max;
  222         else if (slim.rlim_cur == SVR4_RLIM_SAVED_CUR)
  223                 blim.rlim_cur = limp->rlim_cur;
  224 
  225         return dosetrlimit(td, rl, &blim);
  226 }
  227 
  228 
  229 int
  230 svr4_sys_getrlimit64(td, uap)
  231         register struct thread *td;
  232         struct svr4_sys_getrlimit64_args *uap;
  233 {
  234         int rl = svr4_to_native_rl(uap->which);
  235         struct rlimit blim;
  236         struct svr4_rlimit64 slim;
  237 
  238         if (rl == -1)
  239                 return EINVAL;
  240 
  241         /* For p_rlimit. */
  242         mtx_assert(&Giant, MA_OWNED);
  243         blim = td->td_proc->p_rlimit[rl];
  244 
  245         /*
  246          * Our infinity, is their maxfiles.
  247          */
  248         if (rl == RLIMIT_NOFILE && blim.rlim_max == RLIM_INFINITY)
  249                 blim.rlim_max = maxfiles;
  250 
  251         /*
  252          * If the limit can be be represented, it is returned.
  253          * Otherwise, if rlim_cur == rlim_max, return SVR4_RLIM_SAVED_MAX
  254          * else return SVR4_RLIM_SAVED_CUR
  255          */
  256         if (blim.rlim_max == RLIM_INFINITY)
  257                 slim.rlim_max = SVR4_RLIM64_INFINITY;
  258         else if (OKLIMIT64(blim.rlim_max))
  259                 slim.rlim_max = (svr4_rlim64_t) blim.rlim_max;
  260         else
  261                 slim.rlim_max = SVR4_RLIM64_SAVED_MAX;
  262 
  263         if (blim.rlim_cur == RLIM_INFINITY)
  264                 slim.rlim_cur = SVR4_RLIM64_INFINITY;
  265         else if (OKLIMIT64(blim.rlim_cur))
  266                 slim.rlim_cur = (svr4_rlim64_t) blim.rlim_cur;
  267         else if (blim.rlim_max == blim.rlim_cur)
  268                 slim.rlim_cur = SVR4_RLIM64_SAVED_MAX;
  269         else
  270                 slim.rlim_cur = SVR4_RLIM64_SAVED_CUR;
  271 
  272         return copyout(&slim, uap->rlp, sizeof(*uap->rlp));
  273 }
  274 
  275 
  276 int
  277 svr4_sys_setrlimit64(td, uap)
  278         register struct thread *td;
  279         struct svr4_sys_setrlimit64_args *uap;
  280 {
  281         int rl = svr4_to_native_rl(uap->which);
  282         struct rlimit blim, *limp;
  283         struct svr4_rlimit64 slim;
  284         int error;
  285 
  286         if (rl == -1)
  287                 return EINVAL;
  288 
  289         /* For p_rlimit. */
  290         mtx_assert(&Giant, MA_OWNED);
  291         limp = &td->td_proc->p_rlimit[rl];
  292 
  293         if ((error = copyin(uap->rlp, &slim, sizeof(slim))) != 0)
  294                 return error;
  295 
  296         /*
  297          * if the limit is SVR4_RLIM64_INFINITY, then we set it to our
  298          * unlimited.
  299          * We should also: If it is SVR4_RLIM64_SAVED_MAX, we should set the
  300          * new limit to the corresponding saved hard limit, and if
  301          * it is equal to SVR4_RLIM64_SAVED_CUR, we should set it to the
  302          * corresponding saved soft limit.
  303          *
  304          */
  305         if (slim.rlim_max == SVR4_RLIM64_INFINITY)
  306                 blim.rlim_max = RLIM_INFINITY;
  307         else if (OKLIMIT64(slim.rlim_max))
  308                 blim.rlim_max = (rlim_t) slim.rlim_max;
  309         else if (slim.rlim_max == SVR4_RLIM64_SAVED_MAX)
  310                 blim.rlim_max = limp->rlim_max;
  311         else if (slim.rlim_max == SVR4_RLIM64_SAVED_CUR)
  312                 blim.rlim_max = limp->rlim_cur;
  313 
  314         if (slim.rlim_cur == SVR4_RLIM64_INFINITY)
  315                 blim.rlim_cur = RLIM_INFINITY;
  316         else if (OKLIMIT64(slim.rlim_cur))
  317                 blim.rlim_cur = (rlim_t) slim.rlim_cur;
  318         else if (slim.rlim_cur == SVR4_RLIM64_SAVED_MAX)
  319                 blim.rlim_cur = limp->rlim_max;
  320         else if (slim.rlim_cur == SVR4_RLIM64_SAVED_CUR)
  321                 blim.rlim_cur = limp->rlim_cur;
  322 
  323         return dosetrlimit(td, rl, &blim);
  324 }

Cache object: 5d759eca23d5e2d7b0db5ae3127b9045


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.