[BACK]Return to getconf.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / getconf

Annotation of src/usr.bin/getconf/getconf.c, Revision 1.2

1.2     ! deraadt     1: /*-
        !             2:  * Copyright (c) 1996 The NetBSD Foundation, Inc.
1.1       deraadt     3:  * All rights reserved.
                      4:  *
1.2     ! deraadt     5:  * This code is derived from software contributed to The NetBSD Foundation
        !             6:  * by J.T. Conklin.
        !             7:  *
1.1       deraadt     8:  * Redistribution and use in source and binary forms, with or without
                      9:  * modification, are permitted provided that the following conditions
                     10:  * are met:
                     11:  * 1. Redistributions of source code must retain the above copyright
                     12:  *    notice, this list of conditions and the following disclaimer.
                     13:  * 2. Redistributions in binary form must reproduce the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer in the
                     15:  *    documentation and/or other materials provided with the distribution.
                     16:  * 3. All advertising materials mentioning features or use of this software
                     17:  *    must display the following acknowledgement:
                     18:  *      This product includes software developed by Winning Strategies, Inc.
                     19:  * 4. The name of the author may not be used to endorse or promote products
                     20:  *    derived from this software without specific prior written permission.
                     21:  *
                     22:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     23:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     24:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     25:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     26:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
                     27:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     28:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     29:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     30:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
                     31:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     32:  */
                     33:
                     34: /*
                     35:  * POSIX.2 getconf utility
                     36:  *
                     37:  * Written by:
                     38:  *     J.T. Conklin (jtc@wimsey.com), Winning Strategies, Inc.
                     39:  */
                     40:
                     41: #ifndef lint
1.2     ! deraadt    42: static char rcsid[] = "$Id: getconf.c,v 1.1.1.1 1995/10/18 08:45:19 deraadt Exp $";
1.1       deraadt    43: #endif /* not lint */
                     44:
                     45: #include <stdio.h>
                     46: #include <stdlib.h>
                     47: #include <limits.h>
                     48: #include <locale.h>
                     49: #include <unistd.h>
                     50: #include <errno.h>
                     51:
                     52: static void usage __P((void));
                     53:
                     54: struct conf_variable
                     55: {
                     56:   const char *name;
                     57:   enum { SYSCONF, CONFSTR, PATHCONF, CONSTANT } type;
                     58:   long value;
                     59: };
                     60:
                     61: const struct conf_variable conf_table[] =
                     62: {
                     63:   { "PATH",                    CONFSTR,        _CS_PATH                },
                     64:
                     65:   /* Utility Limit Minimum Values */
                     66:   { "POSIX2_BC_BASE_MAX",      CONSTANT,       _POSIX2_BC_BASE_MAX     },
                     67:   { "POSIX2_BC_DIM_MAX",       CONSTANT,       _POSIX2_BC_DIM_MAX      },
                     68:   { "POSIX2_BC_SCALE_MAX",     CONSTANT,       _POSIX2_BC_SCALE_MAX    },
                     69:   { "POSIX2_BC_STRING_MAX",    CONSTANT,       _POSIX2_BC_STRING_MAX   },
                     70:   { "POSIX2_COLL_WEIGHTS_MAX", CONSTANT,       _POSIX2_COLL_WEIGHTS_MAX },
                     71:   { "POSIX2_EXPR_NEST_MAX",    CONSTANT,       _POSIX2_EXPR_NEST_MAX   },
                     72:   { "POSIX2_LINE_MAX",         CONSTANT,       _POSIX2_LINE_MAX        },
                     73:   { "POSIX2_RE_DUP_MAX",       CONSTANT,       _POSIX2_RE_DUP_MAX      },
                     74:   { "POSIX2_VERSION",          CONSTANT,       _POSIX2_VERSION         },
                     75:
                     76:   /* POSIX.1 Minimum Values */
                     77:   { "_POSIX_ARG_MAX",          CONSTANT,       _POSIX_ARG_MAX          },
                     78:   { "_POSIX_CHILD_MAX",                CONSTANT,       _POSIX_CHILD_MAX        },
                     79:   { "_POSIX_LINK_MAX",         CONSTANT,       _POSIX_LINK_MAX         },
                     80:   { "_POSIX_MAX_CANON",                CONSTANT,       _POSIX_MAX_CANON        },
                     81:   { "_POSIX_MAX_INPUT",                CONSTANT,       _POSIX_MAX_INPUT        },
                     82:   { "_POSIX_NAME_MAX",         CONSTANT,       _POSIX_NAME_MAX         },
                     83:   { "_POSIX_NGROUPS_MAX",      CONSTANT,       _POSIX_NGROUPS_MAX      },
                     84:   { "_POSIX_OPEN_MAX",         CONSTANT,       _POSIX_OPEN_MAX         },
                     85:   { "_POSIX_PATH_MAX",         CONSTANT,       _POSIX_PIPE_BUF         },
                     86:   { "_POSIX_PIPE_BUF",         CONSTANT,       _POSIX_PIPE_BUF         },
                     87:   { "_POSIX_SSIZE_MAX",                CONSTANT,       _POSIX_SSIZE_MAX        },
                     88:   { "_POSIX_STREAM_MAX",       CONSTANT,       _POSIX_STREAM_MAX       },
                     89:   { "_POSIX_TZNAME_MAX",       CONSTANT,       _POSIX_TZNAME_MAX       },
                     90:
                     91:   /* Symbolic Utility Limits */
                     92:   { "BC_BASE_MAX",             SYSCONF,        _SC_BC_BASE_MAX         },
                     93:   { "BC_DIM_MAX",              SYSCONF,        _SC_BC_DIM_MAX          },
                     94:   { "BC_SCALE_MAX",            SYSCONF,        _SC_BC_SCALE_MAX        },
                     95:   { "BC_STRING_MAX",           SYSCONF,        _SC_BC_STRING_MAX       },
                     96:   { "COLL_WEIGHTS_MAX",                SYSCONF,        _SC_COLL_WEIGHTS_MAX    },
                     97:   { "EXPR_NEST_MAX",           SYSCONF,        _SC_EXPR_NEST_MAX       },
                     98:   { "LINE_MAX",                        SYSCONF,        _SC_LINE_MAX            },
                     99:   { "RE_DUP_MAX",              SYSCONF,        _SC_RE_DUP_MAX          },
                    100:
                    101:   /* Optional Facility Configuration Values */
                    102: #if 0
                    103:   { "POSIX2_C_BIND",           SYSCONF,        ???                     },
                    104: #endif
                    105:   { "POSIX2_C_DEV",            SYSCONF,        _SC_2_C_DEV             },
                    106:   { "POSIX2_CHAR_TERM",                SYSCONF,        _SC_2_CHAR_TERM         },
                    107:   { "POSIX2_FORT_DEV",         SYSCONF,        _SC_2_FORT_DEV          },
                    108:   { "POSIX2_FORT_RUN",         SYSCONF,        _SC_2_FORT_RUN          },
                    109:   { "POSIX2_LOCALEDEF",                SYSCONF,        _SC_2_LOCALEDEF         },
                    110:   { "POSIX2_SW_DEV",           SYSCONF,        _SC_2_SW_DEV            },
                    111:   { "POSIX2_UPE",              SYSCONF,        _SC_2_UPE               },
                    112:
                    113:   /* POSIX.1 Configurable System Variables */
                    114:   { "ARG_MAX",                 SYSCONF,        _SC_ARG_MAX             },
                    115:   { "CHILD_MAX",               SYSCONF,        _SC_CHILD_MAX           },
                    116:   { "CLK_TCK",                 SYSCONF,        _SC_CLK_TCK             },
                    117:   { "NGROUPS_MAX",             SYSCONF,        _SC_NGROUPS_MAX         },
                    118:   { "OPEN_MAX",                        SYSCONF,        _SC_OPEN_MAX            },
                    119:   { "STREAM_MAX",              SYSCONF,        _SC_STREAM_MAX          },
                    120:   { "TZNAME_MAX",              SYSCONF,        _SC_TZNAME_MAX          },
                    121:   { "_POSIX_JOB_CONTROL",      SYSCONF,        _SC_JOB_CONTROL         },
                    122:   { "_POSIX_SAVED_IDS",                SYSCONF,        _SC_SAVED_IDS           },
                    123:   { "_POSIX_VERSION",          SYSCONF,        _SC_VERSION             },
                    124:
                    125:   { "LINK_MAX",                        PATHCONF,       _PC_LINK_MAX            },
                    126:   { "MAX_CANON",               PATHCONF,       _PC_MAX_CANON           },
                    127:   { "MAX_INPUT",               PATHCONF,       _PC_MAX_INPUT           },
                    128:   { "NAME_MAX",                        PATHCONF,       _PC_NAME_MAX            },
                    129:   { "PATH_MAX",                        PATHCONF,       _PC_PATH_MAX            },
                    130:   { "PIPE_BUF",                        PATHCONF,       _PC_PIPE_BUF            },
                    131:   { "_POSIX_CHOWN_RESTRICTED", PATHCONF,       _PC_CHOWN_RESTRICTED    },
                    132:   { "_POSIX_NO_TRUNC",         PATHCONF,       _PC_NO_TRUNC            },
                    133:   { "_POSIX_VDISABLE",         PATHCONF,       _PC_VDISABLE            },
                    134:
                    135:   { NULL }
                    136: };
                    137:
                    138:
                    139: int
                    140: main(argc, argv)
                    141:        int argc;
                    142:        char **argv;
                    143: {
                    144:        int ch;
                    145:        const struct conf_variable *cp;
                    146:
                    147:        long val;
                    148:        size_t slen;
                    149:        char * sval;
                    150:
                    151:        setlocale(LC_ALL, "");
                    152:
                    153:        while ((ch = getopt(argc, argv, "")) != -1) {
                    154:                switch (ch) {
                    155:                case '?':
                    156:                default:
                    157:                        usage();
                    158:                }
                    159:        }
                    160:        argc -= optind;
                    161:        argv += optind;
                    162:
                    163:        if (argc < 1 || argc > 2) {
                    164:                usage();
                    165:                /* NOTREACHED */
                    166:        }
                    167:
                    168:        for (cp = conf_table; cp->name != NULL; cp++) {
                    169:                if (strcmp(*argv, cp->name) == 0)
                    170:                        break;
                    171:        }
                    172:        if (cp->name == NULL) {
1.2     ! deraadt   173:                errx(1, "%s: unknown variable", *argv);
1.1       deraadt   174:                /* NOTREACHED */
                    175:        }
                    176:
                    177:        if (cp->type == PATHCONF) {
                    178:                if (argc != 2) usage();
                    179:        } else {
                    180:                if (argc != 1) usage();
                    181:        }
                    182:
                    183:        switch (cp->type) {
                    184:        case CONSTANT:
                    185:                printf("%ld\n", cp->value);
                    186:                break;
                    187:
                    188:        case CONFSTR:
                    189:                slen = confstr (cp->value, (char *) 0, (size_t) 0);
                    190:
                    191:                if ((sval = malloc(slen)) == NULL)
                    192:                        err(1, NULL);
                    193:
                    194:                confstr(cp->value, sval, slen);
                    195:                printf("%s\n", sval);
                    196:                break;
                    197:
                    198:        case SYSCONF:
                    199:                errno = 0;
                    200:                if ((val = sysconf(cp->value)) == -1) {
                    201:                        if (errno != 0) {
                    202:                                err(1, NULL);
                    203:                                /* NOTREACHED */
                    204:                        }
                    205:
                    206:                        printf ("undefined\n");
                    207:                } else {
                    208:                        printf("%ld\n", val);
                    209:                }
                    210:                break;
                    211:
                    212:        case PATHCONF:
                    213:                errno = 0;
                    214:                if ((val = pathconf(argv[1], cp->value)) == -1) {
                    215:                        if (errno != 0) {
                    216:                                err(1, "%s", argv[1]);
                    217:                                /* NOTREACHED */
                    218:                        }
                    219:
                    220:                        printf ("undefined\n");
                    221:                } else {
                    222:                        printf ("%ld\n", val);
                    223:                }
                    224:                break;
                    225:        }
                    226:
                    227:        exit (ferror(stdout));
                    228: }
                    229:
                    230:
                    231: static void
                    232: usage()
                    233: {
                    234:   fprintf (stderr, "usage: getconf system_var\n");
                    235:   fprintf (stderr, "       getconf path_var pathname\n");
                    236:   exit(1);
                    237: }