Annotation of coherent/a/usr/bob/korn/ulimit.c, revision 1.1.1.1

1.1       root        1: /*
                      2:        ulimit -- handle "ulimit" builtin
                      3: 
                      4:        Eric Gisin, September 1988
                      5:        Adapted to PD KornShell. Removed AT&T code.
                      6: 
                      7:        last edit:      06-Jun-1987     D A Gwyn
                      8: 
                      9:        This started out as the BRL UNIX System V system call emulation
                     10:        for 4.nBSD, and was later extended by Doug Kingston to handle
                     11:        the extended 4.nBSD resource limits.  It now includes the code
                     12:        that was originally under case SYSULIMIT in source file "xec.c".
                     13: */
                     14: 
                     15: static char *RCSid = "$Header: ulimit.c,v 3.1 88/11/03 09:18:11 egisin Exp $";
                     16: 
                     17: #include <stddef.h>
                     18: #include <errno.h>
                     19: #include <signal.h>
                     20: #include <setjmp.h>
                     21: #if defined(_BSD) || defined(_BSD_SYSV)
                     22: #include <sys/time.h>
                     23: #include <sys/resource.h>
                     24: #else
                     25: #define        RLIMIT_FSIZE    2
                     26: #endif
                     27: #include "sh.h"
                     28: 
                     29: extern long ulimit();
                     30: 
                     31: int
                     32: do_ulimit(a1, a2)
                     33:        char    *a1, *a2;
                     34: {
                     35:        register int    c;
                     36:        long            i;
                     37: #if defined(_BSD) || defined(_BSD_SYSV)
                     38:        struct rlimit   limit;          /* data being gotten/set */
                     39:        int             softonly = 0;   /* set => soft limit, clear => hard limit */
                     40:        int             factor = 1024;  /* unit scaling (1K or 1) */
                     41: #endif
                     42:        int     command = RLIMIT_FSIZE;
                     43: 
                     44:        if (a1 && (*a1 == '-'))         /* DAG -- Gould added first test */
                     45:        {       c = *++a1;              /* DAG */
                     46: #if defined(_BSD) || defined(_BSD_SYSV)
                     47:                if (c >= 'A' && c <= 'Z')
                     48:                {
                     49:                        ++softonly;
                     50:                        c += 'a' - 'A'; /* DAG -- map to lower-case */
                     51:                }
                     52: #endif
                     53:                switch(c)
                     54:                {
                     55: #if defined(_BSD) || defined(_BSD_SYSV)
                     56:                        case 'c':
                     57:                                command = RLIMIT_CORE;
                     58:                                break;
                     59:                        case 'd':
                     60:                                command = RLIMIT_DATA;
                     61:                                break;
                     62:                        case 'm':
                     63:                                command = RLIMIT_RSS;
                     64:                                break;
                     65:                        case 's':
                     66:                                command = RLIMIT_STACK;
                     67:                                break;
                     68:                        case 't':
                     69:                                factor = 1;
                     70:                                command = RLIMIT_CPU;
                     71:                                break;
                     72: #endif /* _BSD || _BSD_SYSV */
                     73:                        case 'f':
                     74:                                command = RLIMIT_FSIZE;
                     75: #if _BSD_SYSV
                     76:                                factor = 512;
                     77: #endif
                     78:                                break;
                     79:                        default:
                     80: #if _BSD
                     81:                                errorf("Usage: %s [-cdmstf] [limit]\n", "ulimit");
                     82: #else
                     83:                                errorf("Usage: %s [-f] [limit]\n", "ulimit");
                     84: #endif
                     85:                }
                     86:                a1 = a2;
                     87:        }
                     88:        if (a1)
                     89:        {
                     90:                i = 0;
                     91:                while ((c = *a1++) >= '0' && c <= '9')
                     92:                {
                     93:                        i = (i * 10) + (long)(c - '0');
                     94:                        if (i < 0)
                     95:                                goto Error;
                     96:                }
                     97:                if (c || i < 0)
                     98:                        goto Error;
                     99:        }
                    100: #if !(defined(_BSD) || defined(_BSD_SYSV))
                    101:        else
                    102:        {
                    103:                i = -1;
                    104:                command--;
                    105:        }
                    106: 
                    107: #if !COHERENT
                    108:        if ((i = ulimit(command, i)) < 0L)
                    109:                goto Error;
                    110:        if (command != RLIMIT_FSIZE)
                    111:                shellf("%ld\n", i);
                    112: #endif
                    113: #else                                  /* DPK -- generalized for 4.nBSD: */
                    114:        if (getrlimit(command, &limit))
                    115:                goto Error;     /* errno is already set */
                    116: 
                    117:        if (a1)
                    118:        {
                    119:                limit.rlim_cur = i * factor;
                    120: 
                    121:                if (!softonly)
                    122:                        limit.rlim_max = limit.rlim_cur;
                    123: 
                    124:                if (setrlimit(command, &limit))
                    125:                        goto Error;
                    126:        }
                    127:        else
                    128:        {
                    129:                i = softonly ? limit.rlim_cur : limit.rlim_max;
                    130: #if _BSD                       /* DAG -- System V always prints an integer */
                    131:                if (i == RLIM_INFINITY)
                    132:                        shellf("unlimited\n");
                    133:                else
                    134: #endif
                    135:                        shellf("%ld\n", i/factor);
                    136:        }
                    137: #endif /* _BSD || _BSD_SYSV */
                    138:        return 0;
                    139: 
                    140:   Error:
                    141:        errorf("bad ulimit\n");
                    142: }
                    143: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.