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

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