1
0
Files
irix-657m-src/eoe/cmd/getconf/getconf.c
2022-09-29 17:59:04 +03:00

635 lines
19 KiB
C

/*
* getconf.c
*
* get configuration values.
*
* Copyright 1995, Silicon Graphics, Inc.
* ALL RIGHTS RESERVED
*
* UNPUBLISHED -- Rights reserved under the copyright laws of the United
* States. Use of a copyright notice is precautionary only and does not
* imply publication or disclosure.
*
* U.S. GOVERNMENT RESTRICTED RIGHTS LEGEND:
* Use, duplication or disclosure by the Government is subject to restrictions
* as set forth in FAR 52.227.19(c)(2) or subparagraph (c)(1)(ii) of the Rights
* in Technical Data and Computer Software clause at DFARS 252.227-7013 and/or
* in similar or successor clauses in the FAR, or the DOD or NASA FAR
* Supplement. Contractor/manufacturer is Silicon Graphics, Inc.,
* 2011 N. Shoreline Blvd. Mountain View, CA 94039-7311.
*
* THE CONTENT OF THIS WORK CONTAINS CONFIDENTIAL AND PROPRIETARY
* INFORMATION OF SILICON GRAPHICS, INC. ANY DUPLICATION, MODIFICATION,
* DISTRIBUTION, OR DISCLOSURE IN ANY FORM, IN WHOLE, OR IN PART, IS STRICTLY
* PROHIBITED WITHOUT THE PRIOR EXPRESS WRITTEN PERMISSION OF SILICON
* GRAPHICS, INC.
*/
#ident "$Revision: 1.15 $"
#include <unistd.h>
#include <limits.h>
#include <stdio.h>
#include <string.h>
#include <getopt.h>
#include <errno.h>
#include <sys/systeminfo.h>
#include <locale.h>
#include <fmtmsg.h>
#include <sgi_nl.h>
#include <msgs/uxsgicore.h>
struct vals {
char *name;
long val;
};
struct cvals {
char *name;
long val;
char *fmt;
};
struct llcvals {
char *name;
long long val;
char *fmt;
};
struct vals confstr_tab[] = { /* command names for XPG4 confstr (sysinfo) */
"PATH", _CS_PATH,
"CS_PATH", _CS_PATH,
"_CS_PATH", _CS_PATH,
"SYSNAME", _CS_SYSNAME,
"HOSTNAME", _CS_HOSTNAME,
"RELEASE", _CS_RELEASE,
"VERSION", _CS_VERSION,
"MACHINE", _CS_MACHINE,
"ARCHITECTURE", _CS_ARCHITECTURE,
"HW_SERIAL", _CS_HW_SERIAL,
"HW_PROVIDER", _CS_HW_PROVIDER,
"SRPC_DOMAIN", _CS_SRPC_DOMAIN,
"INITTAB_NAME", _CS_INITTAB_NAME,
"LFS_CFLAGS", _CS_LFS_CFLAGS,
"LFS_LDFLAGS", _CS_LFS_LDFLAGS,
"LFS_LIBS", _CS_LFS_LIBS,
"LFS_LINTFLAGS", _CS_LFS_LINTFLAGS,
"LFS64_CFLAGS", _CS_LFS64_CFLAGS,
"LFS64_LDFLAGS", _CS_LFS64_LDFLAGS,
"LFS64_LIBS", _CS_LFS64_LIBS,
"LFS64_LINTFLAGS", _CS_LFS64_LINTFLAGS,
"XBS5_ILP32_OFF32_CFLAGS", _CS_XBS5_ILP32_OFF32_CFLAGS,
"XBS5_ILP32_OFF32_LDFLAGS", _CS_XBS5_ILP32_OFF32_LDFLAGS,
"XBS5_ILP32_OFF32_LIBS", _CS_XBS5_ILP32_OFF32_LIBS,
"XBS5_ILP32_OFF32_LINTFLAGS", _CS_XBS5_ILP32_OFF32_LINTFLAGS,
"XBS5_ILP32_OFFBIG_CFLAGS", _CS_XBS5_ILP32_OFFBIG_CFLAGS,
"XBS5_ILP32_OFFBIG_LDFLAGS", _CS_XBS5_ILP32_OFFBIG_LDFLAGS,
"XBS5_ILP32_OFFBIG_LIBS", _CS_XBS5_ILP32_OFFBIG_LIBS,
"XBS5_ILP32_OFFBIG_LINTFLAGS", _CS_XBS5_ILP32_OFFBIG_LINTFLAGS,
"XBS5_LP64_OFF64_CFLAGS", _CS_XBS5_LP64_OFF64_CFLAGS,
"XBS5_LP64_OFF64_LDFLAGS", _CS_XBS5_LP64_OFF64_LDFLAGS,
"XBS5_LP64_OFF64_LIBS", _CS_XBS5_LP64_OFF64_LIBS,
"XBS5_LP64_OFF64_LINTFLAGS", _CS_XBS5_LP64_OFF64_LINTFLAGS,
"XBS5_LPBIG_OFFBIG_CFLAGS", _CS_XBS5_LPBIG_OFFBIG_CFLAGS,
"XBS5_LPBIG_OFFBIG_LDFLAGS", _CS_XBS5_LPBIG_OFFBIG_LDFLAGS,
"XBS5_LPBIG_OFFBIG_LIBS", _CS_XBS5_LPBIG_OFFBIG_LIBS,
"XBS5_LPBIG_OFFBIG_LINTFLAGS", _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS,
};
struct vals sysinfo_tab[] = { /* command names for XPG4 (sysinfo) */
"VENDOR", _MIPS_SI_VENDOR,
"OS_PROVIDER", _MIPS_SI_OS_PROVIDER,
"OS_NAME", _MIPS_SI_OS_NAME,
"HW_NAME", _MIPS_SI_HW_NAME,
"NUM_PROCESSORS", _MIPS_SI_NUM_PROCESSORS,
"HOSTID", _MIPS_SI_HOSTID,
"OSREL_MAJ", _MIPS_SI_OSREL_MAJ,
"OSREL_MIN", _MIPS_SI_OSREL_MIN,
"OSREL_PATCH", _MIPS_SI_OSREL_PATCH,
"PROCESSORS", _MIPS_SI_PROCESSORS,
"AVAIL_PROCESSORS", _MIPS_SI_AVAIL_PROCESSORS,
};
/*
* Note that the constants (_POSIX_xx_MAX) are in a separate table
*/
struct vals sysconf_tab[] = { /* command names for sysconf */
"ARG_MAX", _SC_ARG_MAX,
"ATEXIT_MAX", _SC_ATEXIT_MAX,
"BC_BASE_MAX", _SC_BC_BASE_MAX,
"BC_DIM_MAX", _SC_BC_DIM_MAX,
"BC_SCALE_MAX", _SC_BC_SCALE_MAX,
"BC_STRING_MAX", _SC_BC_STRING_MAX,
"CHILD_MAX", _SC_CHILD_MAX,
"CLK_TCK", _SC_CLK_TCK,
"COLL_WEIGHTS_MAX", _SC_COLL_WEIGHTS_MAX,
"EXPR_NEST_MAX", _SC_EXPR_NEST_MAX,
"IOV_MAX", _SC_IOV_MAX,
"LINE_MAX", _SC_LINE_MAX,
"LOGNAME_MAX", _SC_LOGNAME_MAX,
"NGROUPS_MAX", _SC_NGROUPS_MAX,
"OPEN_MAX", _SC_OPEN_MAX,
"PAGESIZE", _SC_PAGESIZE,
"PAGE_SIZE", _SC_PAGE_SIZE,
"PASS_MAX", _SC_PASS_MAX,
"POSIX2_VERSION", _SC_2_VERSION,
"RE_DUP_MAX", _SC_RE_DUP_MAX,
"STREAM_MAX", _SC_STREAM_MAX,
"TIMER_MAX", _SC_TIMER_MAX,
"TZNAME_MAX", _SC_TZNAME_MAX,
"POSIX2_CHAR_TERM", _SC_2_CHAR_TERM,
"POSIX2_C_BIND", _SC_2_C_BIND,
"POSIX2_C_DEV", _SC_2_C_DEV,
"POSIX2_C_VERSION", _SC_2_C_VERSION,
"POSIX2_FORT_DEV", _SC_2_FORT_DEV,
"POSIX2_FORT_RUN", _SC_2_FORT_RUN,
"POSIX2_LOCALEDEF", _SC_2_LOCALEDEF,
"POSIX2_SW_DEV", _SC_2_SW_DEV,
"POSIX2_UPE", _SC_2_UPE,
"_POSIX2_CHAR_TERM", _SC_2_CHAR_TERM,
"_POSIX2_C_BIND", _SC_2_C_BIND,
"_POSIX2_C_DEV", _SC_2_C_DEV,
"_POSIX2_C_VERSION", _SC_2_C_VERSION,
"_POSIX2_FORT_DEV", _SC_2_FORT_DEV,
"_POSIX2_FORT_RUN", _SC_2_FORT_RUN,
"_POSIX2_LOCALEDEF", _SC_2_LOCALEDEF,
"_POSIX2_SW_DEV", _SC_2_SW_DEV,
"_POSIX2_UPE", _SC_2_UPE,
"_POSIX2_VERSION", _SC_2_VERSION,
"_POSIX_JOB_CONTROL", _SC_JOB_CONTROL,
"_POSIX_SAVED_IDS", _SC_SAVED_IDS,
"_POSIX_VERSION", _SC_VERSION,
"_XOPEN_CRYPT", _SC_XOPEN_CRYPT,
"_XOPEN_ENH_I18N", _SC_XOPEN_ENH_I18N,
"_XOPEN_SHM", _SC_XOPEN_SHM,
"_XOPEN_UNIX", _SC_XOPEN_UNIX,
"_XOPEN_VERSION", _SC_XOPEN_VERSION,
"_XOPEN_XCU_VERSION", _SC_XOPEN_XCU_VERSION,
/* SGI additions */
"ABI_ASYNCHRONOUS_IO", _SC_ABI_ASYNCHRONOUS_IO,
"ACL", _SC_ACL,
"AUDIT", _SC_AUDIT,
"CAP", _SC_CAP,
"INF", _SC_INF,
"IP_SECOPTS", _SC_IP_SECOPTS,
"KERN_POINTERS", _SC_KERN_POINTERS,
"KERN_SIM", _SC_KERN_SIM,
"MAC", _SC_MAC,
"NACLS_MAX", _SC_NACLS_MAX,
"NPROC_CONF", _SC_NPROC_CONF,
"NPROC_ONLN", _SC_NPROC_ONLN,
"SOFTPOWER", _SC_SOFTPOWER,
/* additions from 1003.1b - realtime */
"AIO_LISTIO_MAX", _SC_AIO_LISTIO_MAX,
"AIO_MAX", _SC_AIO_MAX,
"AIO_PRIO_DELTA_MAX", _SC_AIO_PRIO_DELTA_MAX,
"DELAYTIMER_MAX", _SC_DELAYTIMER_MAX,
"MQ_OPEN_MAX", _SC_MQ_OPEN_MAX,
"MQ_PRIO_MAX", _SC_MQ_PRIO_MAX,
"RTSIG_MAX", _SC_RTSIG_MAX,
"SEM_NSEMS_MAX", _SC_SEM_NSEMS_MAX,
"SEM_VALUE_MAX", _SC_SEM_VALUE_MAX,
"SIGQUEUE_MAX", _SC_SIGQUEUE_MAX,
"_POSIX_ASYNCHRONOUS_IO", _SC_ASYNCHRONOUS_IO,
"_POSIX_FSYNC", _SC_FSYNC,
"_POSIX_MAPPED_FILES", _SC_MAPPED_FILES,
"_POSIX_MEMLOCK", _SC_MEMLOCK,
"_POSIX_MEMLOCK_RANGE", _SC_MEMLOCK_RANGE,
"_POSIX_MEMORY_PROTECTION", _SC_MEMORY_PROTECTION,
"_POSIX_MESSAGE_PASSING", _SC_MESSAGE_PASSING,
"_POSIX_PRIORITIZED_IO", _SC_PRIORITIZED_IO,
"_POSIX_PRIORITY_SCHEDULING", _SC_PRIORITY_SCHEDULING,
"_POSIX_REALTIME_SIGNALS", _SC_REALTIME_SIGNALS,
"_POSIX_SEMAPHORES", _SC_SEMAPHORES,
"_POSIX_SHARED_MEMORY_OBJECTS", _SC_SHARED_MEMORY_OBJECTS,
"_POSIX_SYNCHRONIZED_IO", _SC_SYNCHRONIZED_IO,
"_POSIX_TIMERS", _SC_TIMERS,
/* end 1003.1b */
/* additions from 1003.1c - pthreads */
"GETPW_R_SIZE_MAX", _SC_GETGR_R_SIZE_MAX,
"GETPW_R_SIZE_MAX", _SC_GETPW_R_SIZE_MAX,
"LOGIN_NAME_MAX", _SC_LOGIN_NAME_MAX,
"THREAD_DESTRUCTOR_ITERATIONS", _SC_THREAD_DESTRUCTOR_ITERATIONS,
"THREAD_KEYS_MAX", _SC_THREAD_KEYS_MAX,
"THREAD_STACK_MIN", _SC_THREAD_STACK_MIN,
"THREAD_THREADS_MAX", _SC_THREAD_THREADS_MAX,
"TTY_NAME_MAX", _SC_TTY_NAME_MAX,
"_POSIX_THREADS", _SC_THREADS,
"_POSIX_THREAD_ATTR_STACKADDR", _SC_THREAD_ATTR_STACKADDR,
"_POSIX_THREAD_ATTR_STACKSIZE", _SC_THREAD_ATTR_STACKSIZE,
"_POSIX_THREAD_PRIORITY_SCHEDULING", _SC_THREAD_PRIORITY_SCHEDULING,
"_POSIX_THREAD_PRIO_INHERIT", _SC_THREAD_PRIO_INHERIT,
"_POSIX_THREAD_PRIO_PROTECT", _SC_THREAD_PRIO_PROTECT,
"_POSIX_THREAD_PROCESS_SHARED", _SC_THREAD_PROCESS_SHARED,
"_POSIX_THREAD_SAFE_FUNCTIONS", _SC_THREAD_SAFE_FUNCTIONS,
/* end POSIX 1003.1c */
"MMAP_FIXED_ALIGNMENT", _SC_MMAP_FIXED_ALIGNMENT,
"_XBS5_ILP32_OFF32", _SC_XBS5_ILP32_OFF32,
"_XBS5_ILP32_OFFBIG", _SC_XBS5_ILP32_OFFBIG,
"_XBS5_LP64_OFF64", _SC_XBS5_LP64_OFF64,
"_XBS5_LPBIG_OFFBIG", _SC_XBS5_LPBIG_OFFBIG,
"_XOPEN_LEGACY", _SC_XOPEN_LEGACY,
"_XOPEN_REALTIME", _SC_XOPEN_REALTIME,
};
struct cvals const_tab[] = { /* constants */
/* XPG4/POSIX 1003.1a values */
"CHAR_BIT", 8, "%d",
"CHAR_MAX", CHAR_MAX, "%u",
"CHAR_MIN", CHAR_MIN, "%u",
"CHARCLASS_NAME_MAX", CHARCLASS_NAME_MAX, "%d",
"INT_MAX", INT_MAX, "%d",
"INT_MIN", INT_MIN, "%d",
"LONG_BIT", 8*sizeof(long), "%d",
"LONG_MAX", LONG_MAX, "%ld",
"LONG_MIN", LONG_MIN, "%ld",
"MB_LEN_MAX", MB_LEN_MAX, "%d",
"NL_ARGMAX", NL_ARGMAX, "%d",
"NL_LANGMAX", NL_LANGMAX, "%d",
"NL_NMAX", NL_NMAX, "%d",
"NL_MSGMAX", NL_MSGMAX, "%d",
"NL_SETMAX", NL_SETMAX, "%d",
"NL_TEXTMAX", NL_TEXTMAX, "%d",
"NZERO", NZERO, "%d",
"POSIX2_BC_BASE_MAX", _POSIX2_BC_BASE_MAX, "%d",
"POSIX2_BC_DIM_MAX", _POSIX2_BC_DIM_MAX, "%d",
"POSIX2_BC_SCALE_MAX", _POSIX2_BC_SCALE_MAX, "%d",
"POSIX2_BC_STRING_MAX", _POSIX2_BC_STRING_MAX, "%d",
"POSIX2_COLL_WEIGHTS_MAX",_POSIX2_COLL_WEIGHTS_MAX, "%d",
"POSIX2_EXPR_NEST_MAX", _POSIX2_EXPR_NEST_MAX, "%d",
"POSIX2_LINE_MAX", _POSIX2_LINE_MAX, "%d",
"POSIX2_RE_DUP_MAX", _POSIX2_RE_DUP_MAX, "%d",
"_POSIX_ARG_MAX", _POSIX_ARG_MAX, "%d",
"_POSIX_CHILD_MAX", _POSIX_CHILD_MAX,"%d",
"_POSIX_LINK_MAX", _POSIX_LINK_MAX,"%d",
"_POSIX_MAX_CANON", _POSIX_MAX_CANON,"%d",
"_POSIX_MAX_INPUT", _POSIX_MAX_INPUT,"%d",
"_POSIX_NAME_MAX", _POSIX_NAME_MAX,"%d",
"_POSIX_NGROUPS_MAX", _POSIX_NGROUPS_MAX,"%d",
"_POSIX_OPEN_MAX", _POSIX_OPEN_MAX,"%d",
"_POSIX_PATH_MAX", _POSIX_PATH_MAX,"%d",
"_POSIX_PIPE_BUF", _POSIX_PIPE_BUF,"%d",
"_POSIX_SSIZE_MAX", _POSIX_SSIZE_MAX,"%d",
"_POSIX_STREAM_MAX", _POSIX_STREAM_MAX,"%d",
"_POSIX_TZNAME_MAX", _POSIX_TZNAME_MAX,"%d",
"SCHAR_MAX", SCHAR_MAX, "%d",
"SCHAR_MIN", SCHAR_MIN, "%d",
"SHRT_MAX", SHRT_MAX, "%d",
"SHRT_MIN", SHRT_MIN, "%d",
"SSIZE_MAX", SSIZE_MAX, "%ld",
"TMP_MAX", TMP_MAX, "%d",
"UCHAR_MAX", UCHAR_MAX, "%u",
"UINT_MAX", UINT_MAX, "%u",
"ULONG_MAX", ULONG_MAX, "%lu",
"USHRT_MAX", USHRT_MAX, "%u",
"WORD_BIT", 4*sizeof(long), "%d",
"_XOPEN_IOV_MAX", _XOPEN_IOV_MAX, "%d",
/* SGI additions */
"_ABI_AIO_XFER_MAX", _ABI_AIO_XFER_MAX, "%d",
/* 1003.1b - realtime extensions */
"_POSIX_AIO_LISTIO_MAX", _POSIX_AIO_LISTIO_MAX, "%d",
"_POSIX_AIO_MAX", _POSIX_AIO_MAX, "%d",
"_POSIX_DELAYTIMER_MAX", _POSIX_DELAYTIMER_MAX, "%d",
"_POSIX_MQ_OPEN_MAX", _POSIX_MQ_OPEN_MAX, "%d",
"_POSIX_MQ_PRIO_MAX", _POSIX_MQ_PRIO_MAX, "%d",
"_POSIX_RTSIG_MAX", _POSIX_RTSIG_MAX, "%d",
"_POSIX_SEM_NSEMS_MAX", _POSIX_SEM_NSEMS_MAX, "%d",
"_POSIX_SEM_VALUE_MAX", _POSIX_SEM_VALUE_MAX, "%d",
"_POSIX_SIGQUEUE_MAX", _POSIX_SIGQUEUE_MAX, "%d",
"_POSIX_TIMER_MAX", _POSIX_TIMER_MAX, "%d",
"_POSIX_CLOCKRES_MIN", _POSIX_CLOCKRES_MIN, "%d",
/* 1003.1c - pthreads extenstions */
"_POSIX_LOGIN_NAME_MAX", _POSIX_LOGIN_NAME_MAX, "%d",
"_POSIX_THREAD_DESTRUCTOR_ITERATIONS", _POSIX_THREAD_DESTRUCTOR_ITERATIONS, "%d",
"_POSIX_THREAD_KEYS_MAX", _POSIX_THREAD_KEYS_MAX, "%d",
"_POSIX_THREAD_THREADS_MAX", _POSIX_THREAD_THREADS_MAX, "%d",
"_POSIX_TTY_NAME_MAX", _POSIX_TTY_NAME_MAX, "%d",
};
struct llcvals llconst_tab[] = { /* constants */
"LONGLONG_MAX", LONGLONG_MAX, "%lld",
"LONGLONG_MIN", LONGLONG_MIN, "%lld",
"ULONGLONG_MAX", ULONGLONG_MAX, "%llu",
};
struct vals pathconf_tab[] = { /* command names for pathconf */
"LINK_MAX", _PC_LINK_MAX,
"MAX_CANON", _PC_MAX_CANON,
"MAX_INPUT", _PC_MAX_INPUT,
"NAME_MAX", _PC_NAME_MAX,
"PATH_MAX", _PC_PATH_MAX,
"PIPE_BUF", _PC_PIPE_BUF,
"_POSIX_CHOWN_RESTRICTED", _PC_CHOWN_RESTRICTED,
"_POSIX_NO_TRUNC", _PC_NO_TRUNC,
"_POSIX_VDISABLE", _PC_VDISABLE,
"_POSIX_SYNC_IO", _PC_SYNC_IO,
"_POSIX_PRIO_IO", _PC_PRIO_IO,
"_POSIX_ASYNC_IO", _PC_ASYNC_IO,
"ABI_ASYNC_IO", _PC_ABI_ASYNC_IO,
"ABI_AIO_XFER_MAX", _PC_ABI_AIO_XFER_MAX,
"FILESIZEBITS", _PC_FILESIZEBITS,
};
struct vals hardconf_tab[] = { /* Hardwired conf value */
"_XOPEN_XPG4", _XOPEN_XPG4,
"_XOPEN_XPG3", 0,
"_XOPEN_XPG2", 0,
};
#define STR_BUF_SZ 256
char str_buf[STR_BUF_SZ];
static void dosysconf(int, char **);
int
main(int argc, char **argv)
{
int c,i;
size_t ret;
int iret;
long lret;
char *cmd;
int err=0;
(void)setlocale(LC_ALL, "");
(void)setcat("uxsgicore.abi");
(void)setlabel("UX:getconf");
if ((cmd = strrchr(argv[0], '/')) == NULL)
cmd = argv[0];
else
cmd++;
if (strcmp(cmd, "sysconf") == 0 || strcmp(cmd, "pathconf") == 0)
dosysconf(argc, argv);
/* NOTREACHED */
while ((c=getopt(argc, argv, "")) != EOF)
{
switch(c)
{
case '?':
++err;
break;
}
}
if( err || argc == optind || (argc-optind) > 2 )
{
_sgi_nl_usage(SGINL_USAGE, "UX:getconf",
gettxt(_SGI_DMMX_getconf_usage1, "sysconf"));
_sgi_nl_usage(SGINL_USAGE, "UX:getconf",
gettxt(_SGI_DMMX_getconf_usage2, "pathconf"));
_sgi_nl_usage(SGINL_USAGE, "UX:getconf",
gettxt(_SGI_DMMX_getconf_usage3, "getconf system_var"));
_sgi_nl_usage(SGINL_USAGE, "UX:getconf",
gettxt(_SGI_DMMX_getconf_usage4, "getconf path_var pathname"));
exit(2);
}
errno = 0;
if( (argc-optind) == 1 ) /* System variable or string */
{
/* Check confstr string value */
for(i=0 ; i < sizeof(confstr_tab)/sizeof(confstr_tab[0]); i++)
{
if ((strcasecmp(argv[optind], confstr_tab[i].name)) == 0)
{
ret = confstr(confstr_tab[i].val, str_buf, STR_BUF_SZ);
if( ret == 0 && errno == EINVAL )
exit(1);
else if( ret == 0 && errno == 0 )
{
printf("undefined\n");
exit(0);
}
printf("%s\n", str_buf);
exit(0);
}
}
/* Check sysinfo string value */
for(i=0 ; i < sizeof(sysinfo_tab)/sizeof(sysinfo_tab[0]); i++)
{
if ((strcasecmp(argv[optind], sysinfo_tab[i].name)) == 0)
{
iret = sysinfo(sysinfo_tab[i].val, str_buf, STR_BUF_SZ);
if (iret < 0)
exit(1);
if (iret == 0) {
printf("undefined\n");
exit(0);
}
printf("%s\n", str_buf);
exit(0);
}
}
/* Check sysconf value */
for(i=0 ; i < sizeof(sysconf_tab)/sizeof(sysconf_tab[0]); i++)
{
if ((strcasecmp(argv[optind], sysconf_tab[i].name)) == 0)
{
lret = sysconf(sysconf_tab[i].val);
if( lret == -1L && errno == EINVAL )
exit(1);
else if( lret == -1L && errno == 0 )
{
printf("undefined\n");
exit(0);
}
printf("%ld\n", lret);
exit(0);
}
}
/* Check constant value */
for(i=0 ; i < sizeof(const_tab)/sizeof(const_tab[0]); i++)
{
if ((strcasecmp(argv[optind], const_tab[i].name)) == 0)
{
printf(const_tab[i].fmt, const_tab[i].val);
printf("\n");
exit(0);
}
}
/* Check long long constant value */
for(i=0 ; i < sizeof(llconst_tab)/sizeof(llconst_tab[0]); i++)
{
if ((strcasecmp(argv[optind], llconst_tab[i].name)) == 0)
{
printf(llconst_tab[i].fmt, llconst_tab[i].val);
printf("\n");
exit(0);
}
}
/* Check hardwired conf value */
for(i=0 ; i < sizeof(hardconf_tab)/sizeof(hardconf_tab[0]); i++)
{
if ((strcasecmp(argv[optind], hardconf_tab[i].name)) == 0)
{
if(hardconf_tab[i].val) {
printf("%ld\n",hardconf_tab[i].val);
exit(0);
}
else {
printf("undefined\n");
exit(0);
}
}
}
exit(1);
}
else /* Path variable and path name */
{
/* Check pathconf value and path */
for(i=0 ; i < sizeof(pathconf_tab)/sizeof(pathconf_tab[0]); i++)
{
if ((strcasecmp(argv[optind], pathconf_tab[i].name)) == 0)
{
lret = pathconf(argv[optind+1],pathconf_tab[i].val);
if( lret == -1L && errno != 0 )
exit(1);
else if( lret == -1L && errno == 0 )
{
printf("undefined\n");
exit(0);
}
printf("%ld\n", lret);
exit(0);
}
}
exit(1);
}
}
#define SYSTAB 0
#define PATHTAB 1
const int namelen = 32;
static void
dosysconf(int argc, char **argv)
{
int disptab(int, char *);
int i, itssys = 0;
char *cmd;
char *path = "/"; /* default for pathconf */
int c;
long rv;
int status = 0;
if ((cmd = strrchr(argv[0],'/')) == NULL)
cmd = argv[0]; /* it's only the prog name */
else
cmd++; /* path was skipped, now inc over the last '/' */
if (strcmp(cmd, "sysconf") == 0)
itssys = 1;
while ((c = getopt(argc, argv, "p:")) != EOF)
switch (c) {
case 'p':
path = optarg;
break;
default:
if (itssys)
fprintf(stderr, "Usage:%s [name] ...\n", cmd);
else
fprintf(stderr, "Usage:%s [-p path][name] ...\n", cmd);
exit(1);
}
if (optind == argc) {
/* dump whole thing */
status = disptab(itssys?SYSTAB:PATHTAB, path);
} else {
for (; optind < argc; optind++) {
if (itssys) {
for (i=0; i < sizeof(sysconf_tab)/sizeof(sysconf_tab[0]); i++) {
if (!strcasecmp(argv[optind], sysconf_tab[i].name)) {
errno = 0;
rv = sysconf(sysconf_tab[i].val);
if (rv == -1 && errno == 0)
errno = ENOTSUP;
if (errno) {
status = 1;
printf("%s\n", strerror(errno));
} else
printf("%ld\n", rv);
goto found;
}
}
} else {
for (i=0; i < sizeof(pathconf_tab)/sizeof(pathconf_tab[0]); i++) {
if (!strcasecmp(argv[optind], pathconf_tab[i].name)) {
errno = 0;
rv = pathconf(path, pathconf_tab[i].val);
if (errno) {
status = 1;
printf("%s\n", strerror(errno));
} else
printf("%ld\n", rv);
goto found;
}
}
}
printf("%s: %s is not a valid argument\n",cmd,argv[optind]);
found:;
}
}
exit(status);
}
int
disptab(int which, char *path)
{
int i, ret;
long rv;
int status = 0;
if (which == SYSTAB) {
for (i=0; i < sizeof(sysconf_tab)/sizeof(sysconf_tab[0]); i++) {
errno = 0;
rv = sysconf(sysconf_tab[i].val);
if (rv == -1 && errno == 0)
errno = ENOTSUP;
if (errno) {
status = 1;
printf("%-*s %s\n", namelen, sysconf_tab[i].name, strerror(errno));
} else
printf("%-*s %ld\n", namelen, sysconf_tab[i].name, rv);
}
/* for debugging sanity - dump the constant table also */
for(i=0 ; i < sizeof(const_tab)/sizeof(const_tab[0]); i++) {
printf("%-*s ", namelen, const_tab[i].name);
printf(const_tab[i].fmt, const_tab[i].val);
printf("\n");
}
for(i=0 ; i < sizeof(llconst_tab)/sizeof(llconst_tab[0]); i++) {
printf("%-*s ", namelen, llconst_tab[i].name);
printf(llconst_tab[i].fmt, llconst_tab[i].val);
printf("\n");
}
for(i=0 ; i < sizeof(sysinfo_tab)/sizeof(sysinfo_tab[0]); i++) {
ret = sysinfo(sysinfo_tab[i].val, str_buf, STR_BUF_SZ);
if (ret > 0) {
printf("%-*s ", namelen, sysinfo_tab[i].name);
printf("%s\n", str_buf);
}
}
for(i=0 ; i < sizeof(confstr_tab)/sizeof(confstr_tab[0]); i++) {
errno = 0;
ret = confstr(confstr_tab[i].val, str_buf, STR_BUF_SZ);
if (ret == 0 && errno == 0)
errno = ENOTSUP;
if (errno) {
status = 1;
printf("%-*s %s\n", namelen, confstr_tab[i].name, strerror(errno));
} else {
printf("%-*s %s\n", namelen, confstr_tab[i].name, str_buf);
}
}
} else
for (i=0; i < sizeof(pathconf_tab)/sizeof(pathconf_tab[0]); i++) {
errno = 0;
rv = pathconf(path, pathconf_tab[i].val);
if (errno) {
status = 1;
printf("%-*s %s\n", namelen, pathconf_tab[i].name, strerror(errno));
} else
printf("%-*s %ld\n", namelen, pathconf_tab[i].name, rv);
}
return status;
}