Formerly ../posix/getconf.c.~5~
[kopensolaris-gnu/glibc.git] / posix / getconf.c
1 /* Copyright (C) 1991, 1992 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
3
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public License as
6 published by the Free Software Foundation; either version 2 of the
7 License, or (at your option) any later version.
8
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 Library General Public License for more details.
13
14 You should have received a copy of the GNU Library General Public
15 License along with the GNU C Library; see the file COPYING.LIB.  If
16 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
17 Cambridge, MA 02139, USA.  */
18
19 #include <ansidecl.h>
20 #include <unistd.h>
21 #include <errno.h>
22 #include <string.h>
23 #include <stdlib.h>
24 #include <stdio.h>
25
26 struct conf
27     {
28       CONST char *name;
29       CONST int call_name;
30       CONST enum
31           {
32             SYSCONF, CONFSTR, PATHCONF
33           } call;
34     };
35
36 static struct conf vars[] =
37 {
38   {"LINK_MAX", _PC_LINK_MAX, PATHCONF},
39   {"MAX_CANON", _PC_MAX_CANON, PATHCONF},
40   {"MAX_INPUT", _PC_MAX_INPUT, PATHCONF},
41   {"NAME_MAX", _PC_NAME_MAX, PATHCONF},
42   {"PATH_MAX", _PC_PATH_MAX, PATHCONF},
43   {"PIPE_BUF", _PC_PIPE_BUF, PATHCONF},
44   {"_POSIX_CHOWN_RESTRICTED", _PC_CHOWN_RESTRICTED, PATHCONF},
45   {"_POSIX_NO_TRUNC", _PC_NO_TRUNC, PATHCONF},
46   {"_POSIX_VDISABLE", _PC_VDISABLE, PATHCONF},
47
48   {"ARG_MAX", _SC_ARG_MAX, SYSCONF},
49   {"CHILD_MAX", _SC_CHILD_MAX, SYSCONF},
50   {"CLK_TCK", _SC_CLK_TCK, SYSCONF},
51   {"NGROUPS_MAX", _SC_NGROUPS_MAX, SYSCONF},
52   {"OPEN_MAX", _SC_OPEN_MAX, SYSCONF},
53   {"_POSIX_JOB_CONTROL", _SC_JOB_CONTROL, SYSCONF},
54   {"_POSIX_SAVED_IDS", _SC_SAVED_IDS, SYSCONF},
55   {"_POSIX_VERSION", _SC_VERSION, SYSCONF},
56
57   {"PATH", _CS_PATH, CONFSTR},
58
59   {NULL, 0, SYSCONF}
60 };
61
62 static CONST char *program;
63
64 static void
65 DEFUN_VOID (usage)
66 {
67   fprintf (stderr, "Usage: %s variable_name [pathname]\n", program);
68   exit (2);
69 }
70
71 int
72 DEFUN (main, (argc, argv), int argc AND char **argv)
73 {
74   register CONST struct conf *c;
75
76   program = strrchr (argv[0], '/');
77   if (program == NULL)
78     program = argv[0];
79   else
80     ++program;
81
82   if (argc < 2 || argc > 3)
83     usage ();
84
85   for (c = vars; c->name != NULL; ++c)
86     if (!strcmp (c->name, argv[1]))
87         {
88           long int value;
89           size_t clen;
90           char *cvalue;
91           switch (c->call)
92               {
93               case PATHCONF:
94                 if (argc < 3)
95                   usage ();
96                 value = pathconf (argv[2], c->call_name);
97                 if (value == -1)
98                     {
99                       fprintf (stderr, "%s: pathconf: %s: %s\n",
100                                program, argv[2], strerror (errno));
101                       exit (3);
102                     }
103                 printf ("%ld\n", value);
104                 exit (0);
105
106               case SYSCONF:
107                 if (argc > 2)
108                   usage ();
109                 value = sysconf (c->call_name);
110                 printf ("%ld\n", value);
111                 exit (0);
112
113               case CONFSTR:
114                 if (argc > 2)
115                   usage ();
116                 clen = confstr (c->call_name, (char *) NULL, 0);
117                 cvalue = (char *) malloc (clen);
118                 if (cvalue == NULL)
119                     {
120                       fprintf (stderr, "%s: malloc: %s\n",
121                                program, strerror (errno));
122                       exit (3);
123                     }
124                 if (confstr (c->call_name, cvalue, clen) != clen)
125                     {
126                       fprintf (stderr, "%s: confstr: %s\n",
127                                program, strerror (errno));
128                       exit (3);
129                     }
130                 printf ("%.*s\n", (int) clen, cvalue);
131                 exit (0);
132               }
133         }
134
135   fprintf (stderr, "%s: Unrecognized variable `%s'\n", program, argv[1]);
136   exit (2);
137 }