Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/bin/sh Have the ulimit command watch for ulimit -n (alter nu...



details:   https://anonhg.NetBSD.org/src/rev/2de02b1374b6
branches:  trunk
changeset: 1023574:2de02b1374b6
user:      kre <kre%NetBSD.org@localhost>
date:      Wed Sep 15 18:30:57 2021 +0000

description:
Have the ulimit command watch for ulimit -n (alter number of available fds)
and keep the rest of the shell aware of any changes.

While here, modify 'ulimit -aSH' to print both the soft and hard limits
for the resources, rather than just (in this case, as H comes last) the
hard limit.   In any other case when both S and H are present, and we're
examining a limit, use the soft limit (just as if neither were given).

No change for setting limits (both are set, unless exactly one of -H
or -S is given).   However, we now check for overflow when converting
the value to be assigned, rather than just truncating the value however
it happens to work out...

diffstat:

 bin/sh/miscbltin.c |  65 ++++++++++++++++++++++++++++++++++++-----------------
 bin/sh/sh.1        |  13 ++++++++--
 2 files changed, 54 insertions(+), 24 deletions(-)

diffs (164 lines):

diff -r cd8e901097fc -r 2de02b1374b6 bin/sh/miscbltin.c
--- a/bin/sh/miscbltin.c        Wed Sep 15 18:29:45 2021 +0000
+++ b/bin/sh/miscbltin.c        Wed Sep 15 18:30:57 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: miscbltin.c,v 1.44 2017/05/13 15:03:34 gson Exp $      */
+/*     $NetBSD: miscbltin.c,v 1.45 2021/09/15 18:30:57 kre Exp $       */
 
 /*-
  * Copyright (c) 1991, 1993
@@ -37,7 +37,7 @@
 #if 0
 static char sccsid[] = "@(#)miscbltin.c        8.4 (Berkeley) 5/4/95";
 #else
-__RCSID("$NetBSD: miscbltin.c,v 1.44 2017/05/13 15:03:34 gson Exp $");
+__RCSID("$NetBSD: miscbltin.c,v 1.45 2021/09/15 18:30:57 kre Exp $");
 #endif
 #endif /* not lint */
 
@@ -63,6 +63,7 @@
 #include "error.h"
 #include "builtins.h"
 #include "mystring.h"
+#include "redir.h"             /* for user_fd_limit */
 
 #undef rflag
 
@@ -357,7 +358,7 @@
        int     c;
        rlim_t val = 0;
        enum { SOFT = 0x1, HARD = 0x2 }
-                       how = SOFT | HARD;
+                       how = 0, which;
        const struct limits     *l;
        int             set, all = 0;
        int             optc, what;
@@ -367,10 +368,10 @@
        while ((optc = nextopt("HSabtfdscmlrpnv")) != '\0')
                switch (optc) {
                case 'H':
-                       how = HARD;
+                       how |= HARD;
                        break;
                case 'S':
-                       how = SOFT;
+                       how |= SOFT;
                        break;
                case 'a':
                        all = 1;
@@ -390,38 +391,58 @@
 
                if (all || argptr[1])
                        error("too many arguments");
+               if (how == 0)
+                       how = HARD | SOFT;
+
                if (strcmp(p, "unlimited") == 0)
                        val = RLIM_INFINITY;
                else {
                        val = (rlim_t) 0;
 
-                       while ((c = *p++) >= '0' && c <= '9')
-                               val = (val * 10) + (long)(c - '0');
+                       while ((c = *p++) >= '0' && c <= '9') {
+                               if (val >= RLIM_INFINITY/10)
+                                       error("value overflow");
+                               val = (val * 10);
+                               if (val >= RLIM_INFINITY - (long)(c - '0'))
+                                       error("value overflow");
+                               val += (long)(c - '0');
+                       }
                        if (c)
                                error("bad number");
+                       if (val > RLIM_INFINITY / l->factor)
+                               error("value overflow");
                        val *= l->factor;
                }
-       }
+       } else if (how == 0)
+               how = SOFT;
+
        if (all) {
                for (l = limits; l->name; l++) {
                        getrlimit(l->cmd, &limit);
-                       if (how & SOFT)
-                               val = limit.rlim_cur;
-                       else if (how & HARD)
-                               val = limit.rlim_max;
-
-                       out1fmt("%-13s (-%c %-11s) ", l->name, l->option,
+                       out1fmt("%-13s (-%c %-11s)    ", l->name, l->option,
                            l->unit);
-                       if (val == RLIM_INFINITY)
-                               out1fmt("unlimited\n");
-                       else
-                       {
-                               val /= l->factor;
+
+                       which = how;
+                       while (which != 0) {
+                               if (which & SOFT) {
+                                       val = limit.rlim_cur;
+                                       which &= ~SOFT;
+                               } else if (which & HARD) {
+                                       val = limit.rlim_max;
+                                       which &= ~HARD;
+                               }
+
+                               if (val == RLIM_INFINITY)
+                                       out1fmt("unlimited");
+                               else {
+                                       val /= l->factor;
 #ifdef BSD4_4
-                               out1fmt("%lld\n", (long long) val);
+                                       out1fmt("%9lld", (long long) val);
 #else
-                               out1fmt("%ld\n", (long) val);
+                                       out1fmt("%9ld", (long) val);
 #endif
+                               }
+                               out1fmt("%c", which ? '\t' : '\n');
                        }
                }
                return 0;
@@ -436,6 +457,8 @@
                        limit.rlim_cur = val;
                if (setrlimit(l->cmd, &limit) < 0)
                        error("error setting limit (%s)", strerror(errno));
+               if (l->cmd == RLIMIT_NOFILE)
+                       user_fd_limit = sysconf(_SC_OPEN_MAX);
        } else {
                if (how & SOFT)
                        val = limit.rlim_cur;
diff -r cd8e901097fc -r 2de02b1374b6 bin/sh/sh.1
--- a/bin/sh/sh.1       Wed Sep 15 18:29:45 2021 +0000
+++ b/bin/sh/sh.1       Wed Sep 15 18:30:57 2021 +0000
@@ -1,4 +1,4 @@
-.\"    $NetBSD: sh.1,v 1.233 2021/09/12 06:53:08 wiz Exp $
+.\"    $NetBSD: sh.1,v 1.234 2021/09/15 18:30:57 kre Exp $
 .\" Copyright (c) 1991, 1993
 .\"    The Regents of the University of California.  All rights reserved.
 .\"
@@ -3720,13 +3720,20 @@
 nor
 .Fl S
 is specified, the soft limit is displayed or both limits are set.
-If both are specified, the last one wins.
+If both are specified,
+then with
+.Fl a
+both are displayed, the soft followed by the hard limit,
+otherwise for setting, both limits are set,
+and for interrogating the soft limit is displayed.
 .Pp
 The limit to be interrogated or set, then, is chosen by specifying
 any one of these flags:
 .Bl -tag -width Fl
 .It Fl a
-show all the current limits
+show all the current limits (it is an error to
+attempt to set the limits by giving a
+.Ar value )
 .It Fl b
 the socket buffer size of a process (bytes)
 .It Fl c



Home | Main Index | Thread Index | Old Index