1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright 2014 Garrrett D'Amore <garrett@damore.org>
  23  *
  24  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
  25  * Use is subject to license terms.
  26  */
  27 
  28 /*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T     */
  29 /*        All Rights Reserved   */
  30 
  31 /*
  32  * University Copyright- Copyright (c) 1982, 1986, 1988
  33  * The Regents of the University of California
  34  * All Rights Reserved
  35  *
  36  * University Acknowledgment- Portions of this document are derived from
  37  * software developed by the University of California, Berkeley, and its
  38  * contributors.
  39  */
  40 
  41 #ifndef _SYS_RESOURCE_H
  42 #define _SYS_RESOURCE_H
  43 
  44 #include <sys/feature_tests.h>
  45 
  46 #include <sys/types.h>
  47 #include <sys/time.h>
  48 
  49 #ifdef  __cplusplus
  50 extern "C" {
  51 #endif
  52 
  53 /*
  54  * Process priority specifications
  55  */
  56 #define PRIO_PROCESS    0
  57 #define PRIO_PGRP       1
  58 #define PRIO_USER       2
  59 #define PRIO_GROUP      3
  60 #define PRIO_SESSION    4
  61 #define PRIO_LWP        5
  62 #define PRIO_TASK       6
  63 #define PRIO_PROJECT    7
  64 #define PRIO_ZONE       8
  65 #define PRIO_CONTRACT   9
  66 
  67 /*
  68  * Resource limits
  69  */
  70 #define RLIMIT_CPU      0               /* cpu time in seconds */
  71 #define RLIMIT_FSIZE    1               /* maximum file size */
  72 #define RLIMIT_DATA     2               /* data size */
  73 #define RLIMIT_STACK    3               /* stack size */
  74 #define RLIMIT_CORE     4               /* core file size */
  75 #define RLIMIT_NOFILE   5               /* file descriptors */
  76 #define RLIMIT_VMEM     6               /* maximum mapped memory */
  77 #define RLIMIT_AS       RLIMIT_VMEM
  78 
  79 #define RLIM_NLIMITS    7               /* number of resource limits */
  80 
  81 #if defined(_LP64)
  82 
  83 typedef unsigned long   rlim_t;
  84 
  85 #define RLIM_INFINITY   (-3l)
  86 #define RLIM_SAVED_MAX  (-2l)
  87 #define RLIM_SAVED_CUR  (-1l)
  88 
  89 #else   /* _LP64 */
  90 
  91 /*
  92  * The definitions of the following types and constants differ between the
  93  * regular and large file compilation environments.
  94  */
  95 #if _FILE_OFFSET_BITS == 32
  96 
  97 typedef unsigned long   rlim_t;
  98 
  99 #define RLIM_INFINITY   0x7fffffff
 100 #define RLIM_SAVED_MAX  0x7ffffffe
 101 #define RLIM_SAVED_CUR  0x7ffffffd
 102 
 103 #else   /* _FILE_OFFSET_BITS == 32 */
 104 
 105 typedef u_longlong_t    rlim_t;
 106 
 107 #define RLIM_INFINITY   ((rlim_t)-3)
 108 #define RLIM_SAVED_MAX  ((rlim_t)-2)
 109 #define RLIM_SAVED_CUR  ((rlim_t)-1)
 110 
 111 #endif  /* _FILE_OFFSET_BITS == 32 */
 112 
 113 #endif  /* _LP64 */
 114 
 115 #if defined(_SYSCALL32)
 116 
 117 /* Kernel's view of user ILP32 rlimits */
 118 
 119 typedef uint32_t        rlim32_t;
 120 
 121 #define RLIM32_INFINITY         0x7fffffff
 122 #define RLIM32_SAVED_MAX        0x7ffffffe
 123 #define RLIM32_SAVED_CUR        0x7ffffffd
 124 
 125 struct rlimit32 {
 126         rlim32_t        rlim_cur;       /* current limit */
 127         rlim32_t        rlim_max;       /* maximum value for rlim_cur */
 128 };
 129 
 130 #endif /* _SYSCALL32 */
 131 
 132 struct rlimit {
 133         rlim_t  rlim_cur;               /* current limit */
 134         rlim_t  rlim_max;               /* maximum value for rlim_cur */
 135 };
 136 
 137 /* transitional large file interface versions */
 138 #ifdef  _LARGEFILE64_SOURCE
 139 
 140 typedef u_longlong_t    rlim64_t;
 141 
 142 #define RLIM64_INFINITY         ((rlim64_t)-3)
 143 #define RLIM64_SAVED_MAX        ((rlim64_t)-2)
 144 #define RLIM64_SAVED_CUR        ((rlim64_t)-1)
 145 
 146 struct rlimit64 {
 147         rlim64_t        rlim_cur;       /* current limit */
 148         rlim64_t        rlim_max;       /* maximum value for rlim_cur */
 149 };
 150 
 151 #endif
 152 
 153 /*
 154  * Although the saved rlimits were initially introduced by the large file API,
 155  * they are now available for all resource limits on the 64-bit kernel and for
 156  * cpu time and file size limits on the 32-bit kernel.
 157  */
 158 #if defined(_LP64)
 159 
 160 #define RLIM_SAVED(x)   (1)                     /* save all resource limits */
 161 #define RLIM_NSAVED     RLIM_NLIMITS            /* size of u_saved_rlimits[] */
 162 
 163 #else   /* _LP64 */
 164 
 165 #define RLIM_SAVED(x)   (x <= RLIMIT_FSIZE)  /* cpu time and file size */
 166 #define RLIM_NSAVED     (RLIMIT_FSIZE + 1)      /* size of u_saved_rlimits[] */
 167 
 168 #endif  /* _LP64 */
 169 
 170 
 171 struct  rusage {
 172         struct timeval ru_utime;        /* user time used */
 173         struct timeval ru_stime;        /* system time used */
 174         long    ru_maxrss;              /* <unimp> */
 175         long    ru_ixrss;               /* <unimp> */
 176         long    ru_idrss;               /* <unimp> */
 177         long    ru_isrss;               /* <unimp> */
 178         long    ru_minflt;              /* any page faults not requiring I/O */
 179         long    ru_majflt;              /* any page faults requiring I/O */
 180         long    ru_nswap;               /* swaps */
 181         long    ru_inblock;             /* block input operations */
 182         long    ru_oublock;             /* block output operations */
 183         long    ru_msgsnd;              /* streams messsages sent */
 184         long    ru_msgrcv;              /* streams messages received */
 185         long    ru_nsignals;            /* signals received */
 186         long    ru_nvcsw;               /* voluntary context switches */
 187         long    ru_nivcsw;              /* involuntary " */
 188 };
 189 
 190 #define _RUSAGESYS_GETRUSAGE            0       /* rusage process */
 191 #define _RUSAGESYS_GETRUSAGE_CHLD       1       /* rusage child process */
 192 #define _RUSAGESYS_GETRUSAGE_LWP        2       /* rusage lwp */
 193 #define _RUSAGESYS_GETVMUSAGE           3       /* getvmusage */
 194 
 195 #if defined(_SYSCALL32)
 196 
 197 struct  rusage32 {
 198         struct timeval32 ru_utime;      /* user time used */
 199         struct timeval32 ru_stime;      /* system time used */
 200         int     ru_maxrss;              /* <unimp> */
 201         int     ru_ixrss;               /* <unimp> */
 202         int     ru_idrss;               /* <unimp> */
 203         int     ru_isrss;               /* <unimp> */
 204         int     ru_minflt;              /* any page faults not requiring I/O */
 205         int     ru_majflt;              /* any page faults requiring I/O */
 206         int     ru_nswap;               /* swaps */
 207         int     ru_inblock;             /* block input operations */
 208         int     ru_oublock;             /* block output operations */
 209         int     ru_msgsnd;              /* streams messages sent */
 210         int     ru_msgrcv;              /* streams messages received */
 211         int     ru_nsignals;            /* signals received */
 212         int     ru_nvcsw;               /* voluntary context switches */
 213         int     ru_nivcsw;              /* involuntary " */
 214 };
 215 
 216 #endif  /* _SYSCALL32 */
 217 
 218 
 219 #ifdef _KERNEL
 220 
 221 #include <sys/model.h>
 222 
 223 struct proc;
 224 
 225 #else
 226 
 227 #define RUSAGE_SELF     0
 228 #define RUSAGE_LWP      1
 229 #define RUSAGE_CHILDREN -1
 230 
 231 
 232 #if !defined(_LP64) && _FILE_OFFSET_BITS == 64
 233 /*
 234  * large file compilation environment setup
 235  */
 236 #ifdef __PRAGMA_REDEFINE_EXTNAME
 237 #pragma redefine_extname        setrlimit       setrlimit64
 238 #pragma redefine_extname        getrlimit       getrlimit64
 239 #else
 240 #define setrlimit               setrlimit64
 241 #define getrlimit               getrlimit64
 242 #define rlimit                  rlimit64
 243 #endif
 244 #endif  /* !_LP64 && _FILE_OFFSET_BITS == 64 */
 245 
 246 #if defined(_LP64) && defined(_LARGEFILE64_SOURCE)
 247 /*
 248  * In the LP64 compilation environment, map large file interfaces
 249  * back to native versions where possible.
 250  */
 251 #ifdef __PRAGMA_REDEFINE_EXTNAME
 252 #pragma redefine_extname        setrlimit64     setrlimit
 253 #pragma redefine_extname        getrlimit64     getrlimit
 254 #else
 255 #define setrlimit64             setrlimit
 256 #define getrlimit64             getrlimit
 257 #define rlimit64                rlimit
 258 #endif
 259 #endif  /* _LP64 && _LARGEFILE64_SOURCE */
 260 
 261 extern int setrlimit(int, const struct rlimit *);
 262 extern int getrlimit(int, struct rlimit *);
 263 
 264 /* transitional large file interfaces */
 265 #if     defined(_LARGEFILE64_SOURCE) && !((_FILE_OFFSET_BITS == 64) && \
 266             !defined(__PRAGMA_REDEFINE_EXTNAME))
 267 extern int setrlimit64(int, const struct rlimit64 *);
 268 extern int getrlimit64(int, struct rlimit64 *);
 269 #endif  /* _LARGEFILE64_SOURCE... */
 270 
 271 extern int getpriority(int, id_t);
 272 extern int setpriority(int, id_t, int);
 273 extern int getrusage(int, struct rusage *);
 274 
 275 #endif  /* _KERNEL */
 276 
 277 #ifdef  __cplusplus
 278 }
 279 #endif
 280 
 281 #endif  /* _SYS_RESOURCE_H */