1
0
Fork 0
mirror of git://git.code.sf.net/p/cdesktopenv/code synced 2025-03-09 15:50:02 +00:00

Use dynamic maximum configuration values when necessary (#370)

This commit fixes an issue with how ksh was obtaining the value of
NGROUPS_MAX. On some systems this setting can be changed (e.g., on
illumos adding 'set ngroups_max=32' to /etc/system then rebooting
changes NGROUPS_MAX from 16 to 32). Ksh was using NGROUPS_MAX with
the assumption it's a static value, which could cause issues on
systems where it isn't static. This bugfix is inspired by the one
from <b1362c3a5>, although it
has been expanded a bit to account for OPEN_MAX as well.

src/cmd/ksh93/sh/init.c, src/lib/libcmd/fds.c:
- Rename the getconf() macro to astconf_long() and move it to ast.h
  to prevent redundancy. Other sections of the code have been
  modified to use this macro for astconf() to account for
  dynamic settings.
- An equivalent macro for unsigned long values (astconf_ulong) has
  been added.
- Prefer sysconf(3) where available. It has better performance as it
  returns a numeric value directly instead of via string
  conversion.
- The astconf_long and astconf_ulong macros have been documented in
  the ast(3) man page.
This commit is contained in:
Johnothan King 2021-12-12 22:51:59 -08:00 committed by Martijn Dekker
parent fc752b574a
commit c2ac69b2d5
15 changed files with 81 additions and 27 deletions

View file

@ -283,6 +283,27 @@ extern off_t astcopy(int, int, off_t);
extern int astlicense(char*, int, char*, char*, int, int, int);
extern int astquery(int, const char*, ...);
extern void astwinsize(int, int*, int*);
#if _lib_sysconf
/* prefer sysconf for astconf_long and astconf_ulong to improve performance */
#define CONF_ARG_MAX _SC_ARG_MAX
#define CONF_CHILD_MAX _SC_CHILD_MAX
#define CONF_CLK_TCK _SC_CLK_TCK
#define CONF_NGROUPS_MAX _SC_NGROUPS_MAX
#define CONF_OPEN_MAX _SC_OPEN_MAX
#define CONF_PAGESIZE _SC_PAGESIZE
#define astconf_long(x) sysconf(x)
#define astconf_ulong(x) (unsigned long)sysconf(x)
#else
/* fallback in case sysconf isn't available */
#define CONF_ARG_MAX "ARG_MAX"
#define CONF_CHILD_MAX "CHILD_MAX"
#define CONF_CLK_TCK "CLK_TCK"
#define CONF_NGROUPS_MAX "NGROUPS_MAX"
#define CONF_OPEN_MAX "OPEN_MAX"
#define CONF_PAGESIZE "PAGESIZE"
#define astconf_long(x) strtol(astconf(x,NiL,NiL),NiL,0)
#define astconf_ulong(x) strtoul(astconf(x,NiL,NiL),NiL,0)
#endif
extern ssize_t base64encode(const void*, size_t, void**, void*, size_t, void**);
extern ssize_t base64decode(const void*, size_t, void**, void*, size_t, void**);