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

1.10    ! otto        1: /*     $OpenBSD: getconf.c,v 1.9 2003/07/10 00:06:51 david 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: #ifndef lint
1.10    ! otto       44: static char rcsid[] = "$OpenBSD: getconf.c,v 1.9 2003/07/10 00:06:51 david Exp $";
1.1       deraadt    45: #endif /* not lint */
                     46:
                     47: #include <stdio.h>
                     48: #include <stdlib.h>
1.9       david      49: #include <string.h>
1.1       deraadt    50: #include <limits.h>
                     51: #include <locale.h>
                     52: #include <unistd.h>
1.5       deraadt    53: #include <err.h>
1.1       deraadt    54: #include <errno.h>
                     55:
1.6       millert    56: static void usage(void);
1.1       deraadt    57:
                     58: struct conf_variable
                     59: {
                     60:   const char *name;
                     61:   enum { SYSCONF, CONFSTR, PATHCONF, CONSTANT } type;
                     62:   long value;
                     63: };
                     64:
                     65: const struct conf_variable conf_table[] =
                     66: {
                     67:   { "PATH",                    CONFSTR,        _CS_PATH                },
                     68:
                     69:   /* Utility Limit Minimum Values */
                     70:   { "POSIX2_BC_BASE_MAX",      CONSTANT,       _POSIX2_BC_BASE_MAX     },
                     71:   { "POSIX2_BC_DIM_MAX",       CONSTANT,       _POSIX2_BC_DIM_MAX      },
                     72:   { "POSIX2_BC_SCALE_MAX",     CONSTANT,       _POSIX2_BC_SCALE_MAX    },
                     73:   { "POSIX2_BC_STRING_MAX",    CONSTANT,       _POSIX2_BC_STRING_MAX   },
                     74:   { "POSIX2_COLL_WEIGHTS_MAX", CONSTANT,       _POSIX2_COLL_WEIGHTS_MAX },
                     75:   { "POSIX2_EXPR_NEST_MAX",    CONSTANT,       _POSIX2_EXPR_NEST_MAX   },
                     76:   { "POSIX2_LINE_MAX",         CONSTANT,       _POSIX2_LINE_MAX        },
                     77:   { "POSIX2_RE_DUP_MAX",       CONSTANT,       _POSIX2_RE_DUP_MAX      },
                     78:   { "POSIX2_VERSION",          CONSTANT,       _POSIX2_VERSION         },
                     79:
                     80:   /* POSIX.1 Minimum Values */
                     81:   { "_POSIX_ARG_MAX",          CONSTANT,       _POSIX_ARG_MAX          },
                     82:   { "_POSIX_CHILD_MAX",                CONSTANT,       _POSIX_CHILD_MAX        },
                     83:   { "_POSIX_LINK_MAX",         CONSTANT,       _POSIX_LINK_MAX         },
                     84:   { "_POSIX_MAX_CANON",                CONSTANT,       _POSIX_MAX_CANON        },
                     85:   { "_POSIX_MAX_INPUT",                CONSTANT,       _POSIX_MAX_INPUT        },
                     86:   { "_POSIX_NAME_MAX",         CONSTANT,       _POSIX_NAME_MAX         },
                     87:   { "_POSIX_NGROUPS_MAX",      CONSTANT,       _POSIX_NGROUPS_MAX      },
                     88:   { "_POSIX_OPEN_MAX",         CONSTANT,       _POSIX_OPEN_MAX         },
1.7       pjanzen    89:   { "_POSIX_PATH_MAX",         CONSTANT,       _POSIX_PATH_MAX         },
1.1       deraadt    90:   { "_POSIX_PIPE_BUF",         CONSTANT,       _POSIX_PIPE_BUF         },
                     91:   { "_POSIX_SSIZE_MAX",                CONSTANT,       _POSIX_SSIZE_MAX        },
                     92:   { "_POSIX_STREAM_MAX",       CONSTANT,       _POSIX_STREAM_MAX       },
                     93:   { "_POSIX_TZNAME_MAX",       CONSTANT,       _POSIX_TZNAME_MAX       },
                     94:
                     95:   /* Symbolic Utility Limits */
                     96:   { "BC_BASE_MAX",             SYSCONF,        _SC_BC_BASE_MAX         },
                     97:   { "BC_DIM_MAX",              SYSCONF,        _SC_BC_DIM_MAX          },
                     98:   { "BC_SCALE_MAX",            SYSCONF,        _SC_BC_SCALE_MAX        },
                     99:   { "BC_STRING_MAX",           SYSCONF,        _SC_BC_STRING_MAX       },
                    100:   { "COLL_WEIGHTS_MAX",                SYSCONF,        _SC_COLL_WEIGHTS_MAX    },
                    101:   { "EXPR_NEST_MAX",           SYSCONF,        _SC_EXPR_NEST_MAX       },
                    102:   { "LINE_MAX",                        SYSCONF,        _SC_LINE_MAX            },
                    103:   { "RE_DUP_MAX",              SYSCONF,        _SC_RE_DUP_MAX          },
                    104:
                    105:   /* Optional Facility Configuration Values */
                    106: #if 0
                    107:   { "POSIX2_C_BIND",           SYSCONF,        ???                     },
                    108: #endif
                    109:   { "POSIX2_C_DEV",            SYSCONF,        _SC_2_C_DEV             },
                    110:   { "POSIX2_CHAR_TERM",                SYSCONF,        _SC_2_CHAR_TERM         },
                    111:   { "POSIX2_FORT_DEV",         SYSCONF,        _SC_2_FORT_DEV          },
                    112:   { "POSIX2_FORT_RUN",         SYSCONF,        _SC_2_FORT_RUN          },
                    113:   { "POSIX2_LOCALEDEF",                SYSCONF,        _SC_2_LOCALEDEF         },
                    114:   { "POSIX2_SW_DEV",           SYSCONF,        _SC_2_SW_DEV            },
                    115:   { "POSIX2_UPE",              SYSCONF,        _SC_2_UPE               },
                    116:
                    117:   /* POSIX.1 Configurable System Variables */
                    118:   { "ARG_MAX",                 SYSCONF,        _SC_ARG_MAX             },
                    119:   { "CHILD_MAX",               SYSCONF,        _SC_CHILD_MAX           },
                    120:   { "CLK_TCK",                 SYSCONF,        _SC_CLK_TCK             },
                    121:   { "NGROUPS_MAX",             SYSCONF,        _SC_NGROUPS_MAX         },
                    122:   { "OPEN_MAX",                        SYSCONF,        _SC_OPEN_MAX            },
                    123:   { "STREAM_MAX",              SYSCONF,        _SC_STREAM_MAX          },
                    124:   { "TZNAME_MAX",              SYSCONF,        _SC_TZNAME_MAX          },
                    125:   { "_POSIX_JOB_CONTROL",      SYSCONF,        _SC_JOB_CONTROL         },
                    126:   { "_POSIX_SAVED_IDS",                SYSCONF,        _SC_SAVED_IDS           },
                    127:   { "_POSIX_VERSION",          SYSCONF,        _SC_VERSION             },
                    128:
                    129:   { "LINK_MAX",                        PATHCONF,       _PC_LINK_MAX            },
                    130:   { "MAX_CANON",               PATHCONF,       _PC_MAX_CANON           },
                    131:   { "MAX_INPUT",               PATHCONF,       _PC_MAX_INPUT           },
                    132:   { "NAME_MAX",                        PATHCONF,       _PC_NAME_MAX            },
                    133:   { "PATH_MAX",                        PATHCONF,       _PC_PATH_MAX            },
                    134:   { "PIPE_BUF",                        PATHCONF,       _PC_PIPE_BUF            },
                    135:   { "_POSIX_CHOWN_RESTRICTED", PATHCONF,       _PC_CHOWN_RESTRICTED    },
                    136:   { "_POSIX_NO_TRUNC",         PATHCONF,       _PC_NO_TRUNC            },
                    137:   { "_POSIX_VDISABLE",         PATHCONF,       _PC_VDISABLE            },
                    138:
                    139:   { NULL }
                    140: };
                    141:
                    142:
                    143: int
1.8       deraadt   144: main(int argc, char *argv[])
1.1       deraadt   145: {
                    146:        int ch;
                    147:        const struct conf_variable *cp;
                    148:
                    149:        long val;
                    150:        size_t slen;
                    151:        char * sval;
                    152:
                    153:        setlocale(LC_ALL, "");
                    154:
                    155:        while ((ch = getopt(argc, argv, "")) != -1) {
                    156:                switch (ch) {
                    157:                case '?':
                    158:                default:
                    159:                        usage();
                    160:                }
                    161:        }
                    162:        argc -= optind;
                    163:        argv += optind;
                    164:
                    165:        if (argc < 1 || argc > 2) {
                    166:                usage();
                    167:                /* NOTREACHED */
                    168:        }
                    169:
                    170:        for (cp = conf_table; cp->name != NULL; cp++) {
                    171:                if (strcmp(*argv, cp->name) == 0)
                    172:                        break;
                    173:        }
                    174:        if (cp->name == NULL) {
1.2       deraadt   175:                errx(1, "%s: unknown variable", *argv);
1.1       deraadt   176:                /* NOTREACHED */
                    177:        }
                    178:
                    179:        if (cp->type == PATHCONF) {
                    180:                if (argc != 2) usage();
                    181:        } else {
                    182:                if (argc != 1) usage();
                    183:        }
                    184:
                    185:        switch (cp->type) {
                    186:        case CONSTANT:
                    187:                printf("%ld\n", cp->value);
                    188:                break;
                    189:
                    190:        case CONFSTR:
1.10    ! otto      191:                errno = 0;
1.1       deraadt   192:                slen = confstr (cp->value, (char *) 0, (size_t) 0);
1.10    ! otto      193:
        !           194:                if (slen == 0 || slen == (size_t)-1) {
        !           195:                        if (errno)
        !           196:                                err(1, "%s", cp->value);
        !           197:                        else
        !           198:                                errx(1, "%s", cp->value);
        !           199:                }
1.1       deraadt   200:                if ((sval = malloc(slen)) == NULL)
                    201:                        err(1, NULL);
                    202:
                    203:                confstr(cp->value, sval, slen);
                    204:                printf("%s\n", sval);
                    205:                break;
                    206:
                    207:        case SYSCONF:
                    208:                errno = 0;
                    209:                if ((val = sysconf(cp->value)) == -1) {
                    210:                        if (errno != 0) {
                    211:                                err(1, NULL);
                    212:                                /* NOTREACHED */
                    213:                        }
                    214:
                    215:                        printf ("undefined\n");
                    216:                } else {
                    217:                        printf("%ld\n", val);
                    218:                }
                    219:                break;
                    220:
                    221:        case PATHCONF:
                    222:                errno = 0;
                    223:                if ((val = pathconf(argv[1], cp->value)) == -1) {
                    224:                        if (errno != 0) {
                    225:                                err(1, "%s", argv[1]);
                    226:                                /* NOTREACHED */
                    227:                        }
                    228:
                    229:                        printf ("undefined\n");
                    230:                } else {
                    231:                        printf ("%ld\n", val);
                    232:                }
                    233:                break;
                    234:        }
                    235:
                    236:        exit (ferror(stdout));
                    237: }
                    238:
                    239:
                    240: static void
1.8       deraadt   241: usage(void)
1.1       deraadt   242: {
1.4       aaron     243:        extern char *__progname;
                    244:
                    245:        (void)fprintf(stderr, "usage: %s name [pathname]\n", __progname);
                    246:        exit(1);
1.1       deraadt   247: }