[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.12

1.12    ! deraadt     1: /*     $OpenBSD: getconf.c,v 1.11 2008/11/08 01:29:10 chl Exp $        */
1.3       deraadt     2:
1.2       deraadt     3: /*-
                      4:  * Copyright (c) 1996 The NetBSD Foundation, Inc.
1.1       deraadt     5:  * All rights reserved.
                      6:  *
1.2       deraadt     7:  * This code is derived from software contributed to The NetBSD Foundation
                      8:  * by J.T. Conklin.
                      9:  *
1.1       deraadt    10:  * Redistribution and use in source and binary forms, with or without
                     11:  * modification, are permitted provided that the following conditions
                     12:  * are met:
                     13:  * 1. Redistributions of source code must retain the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer.
                     15:  * 2. Redistributions in binary form must reproduce the above copyright
                     16:  *    notice, this list of conditions and the following disclaimer in the
                     17:  *    documentation and/or other materials provided with the distribution.
                     18:  * 3. All advertising materials mentioning features or use of this software
                     19:  *    must display the following acknowledgement:
                     20:  *      This product includes software developed by Winning Strategies, Inc.
                     21:  * 4. The name of the author may not be used to endorse or promote products
                     22:  *    derived from this software without specific prior written permission.
                     23:  *
                     24:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     25:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     26:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     27:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     28:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
                     29:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     30:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     31:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     32:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
                     33:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     34:  */
                     35:
                     36: /*
                     37:  * POSIX.2 getconf utility
                     38:  *
                     39:  * Written by:
                     40:  *     J.T. Conklin (jtc@wimsey.com), Winning Strategies, Inc.
                     41:  */
                     42:
                     43: #include <stdio.h>
                     44: #include <stdlib.h>
1.9       david      45: #include <string.h>
1.1       deraadt    46: #include <limits.h>
                     47: #include <locale.h>
                     48: #include <unistd.h>
1.5       deraadt    49: #include <err.h>
1.1       deraadt    50: #include <errno.h>
                     51:
1.6       millert    52: static void usage(void);
1.1       deraadt    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         },
1.7       pjanzen    85:   { "_POSIX_PATH_MAX",         CONSTANT,       _POSIX_PATH_MAX         },
1.1       deraadt    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
1.8       deraadt   140: main(int argc, char *argv[])
1.1       deraadt   141: {
                    142:        int ch;
                    143:        const struct conf_variable *cp;
                    144:
                    145:        long val;
                    146:        size_t slen;
                    147:        char * sval;
                    148:
                    149:        setlocale(LC_ALL, "");
                    150:
                    151:        while ((ch = getopt(argc, argv, "")) != -1) {
                    152:                switch (ch) {
                    153:                case '?':
                    154:                default:
                    155:                        usage();
                    156:                }
                    157:        }
                    158:        argc -= optind;
                    159:        argv += optind;
                    160:
                    161:        if (argc < 1 || argc > 2) {
                    162:                usage();
                    163:                /* NOTREACHED */
                    164:        }
                    165:
                    166:        for (cp = conf_table; cp->name != NULL; cp++) {
                    167:                if (strcmp(*argv, cp->name) == 0)
                    168:                        break;
                    169:        }
                    170:        if (cp->name == NULL) {
1.2       deraadt   171:                errx(1, "%s: unknown variable", *argv);
1.1       deraadt   172:                /* NOTREACHED */
                    173:        }
                    174:
                    175:        if (cp->type == PATHCONF) {
                    176:                if (argc != 2) usage();
                    177:        } else {
                    178:                if (argc != 1) usage();
                    179:        }
                    180:
                    181:        switch (cp->type) {
                    182:        case CONSTANT:
                    183:                printf("%ld\n", cp->value);
                    184:                break;
                    185:
                    186:        case CONFSTR:
1.10      otto      187:                errno = 0;
1.1       deraadt   188:                slen = confstr (cp->value, (char *) 0, (size_t) 0);
1.10      otto      189:
                    190:                if (slen == 0 || slen == (size_t)-1) {
                    191:                        if (errno)
1.11      chl       192:                                err(1, "%ld", cp->value);
1.10      otto      193:                        else
1.11      chl       194:                                errx(1, "%ld", cp->value);
1.10      otto      195:                }
1.1       deraadt   196:                if ((sval = malloc(slen)) == NULL)
                    197:                        err(1, NULL);
                    198:
                    199:                confstr(cp->value, sval, slen);
                    200:                printf("%s\n", sval);
                    201:                break;
                    202:
                    203:        case SYSCONF:
                    204:                errno = 0;
                    205:                if ((val = sysconf(cp->value)) == -1) {
                    206:                        if (errno != 0) {
                    207:                                err(1, NULL);
                    208:                                /* NOTREACHED */
                    209:                        }
                    210:
                    211:                        printf ("undefined\n");
                    212:                } else {
                    213:                        printf("%ld\n", val);
                    214:                }
                    215:                break;
                    216:
                    217:        case PATHCONF:
                    218:                errno = 0;
                    219:                if ((val = pathconf(argv[1], cp->value)) == -1) {
                    220:                        if (errno != 0) {
                    221:                                err(1, "%s", argv[1]);
                    222:                                /* NOTREACHED */
                    223:                        }
                    224:
                    225:                        printf ("undefined\n");
                    226:                } else {
                    227:                        printf ("%ld\n", val);
                    228:                }
                    229:                break;
                    230:        }
                    231:
                    232:        exit (ferror(stdout));
                    233: }
                    234:
                    235:
                    236: static void
1.8       deraadt   237: usage(void)
1.1       deraadt   238: {
1.4       aaron     239:        extern char *__progname;
                    240:
                    241:        (void)fprintf(stderr, "usage: %s name [pathname]\n", __progname);
                    242:        exit(1);
1.1       deraadt   243: }