getconf.c - sbase - suckless unix tools
 (HTM) git clone git://git.suckless.org/sbase
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       getconf.c (2048B)
       ---
            1 /* See LICENSE file for copyright and license details. */
            2 #include <errno.h>
            3 #include <unistd.h>
            4 #include <limits.h>
            5 #include <stdlib.h>
            6 #include <string.h>
            7 
            8 #include "util.h"
            9 
           10 struct var {
           11         const char *k;
           12         long v;
           13 };
           14 
           15 #include "getconf.h"
           16 
           17 void
           18 usage(void)
           19 {
           20         eprintf("usage: %s [-v spec] var [path]\n", argv0);
           21 }
           22 
           23 int
           24 main(int argc, char *argv[])
           25 {
           26         size_t len;
           27         long res;
           28         int i;
           29         char *str;
           30 
           31         ARGBEGIN {
           32         case 'v':
           33                 /* ignore */
           34                 EARGF(usage());
           35                 break;
           36         default:
           37                 usage();
           38                 break;
           39         } ARGEND
           40 
           41         if (argc == 1) {
           42                 /* sysconf */
           43                 for (i = 0; i < LEN(sysconf_l); i++) {
           44                         if (strcmp(argv[0], sysconf_l[i].k))
           45                                 continue;
           46                         errno = 0;
           47                         if ((res = sysconf(sysconf_l[i].v)) < 0) {
           48                                 if (errno)
           49                                         eprintf("sysconf %ld:", sysconf_l[i].v);
           50                                 puts("undefined");
           51                         } else {
           52                                 printf("%ld\n", res);
           53                         }
           54                         return fshut(stdout, "<stdout>");
           55                 }
           56                 /* confstr */
           57                 for (i = 0; i < LEN(confstr_l); i++) {
           58                         if (strcmp(argv[0], confstr_l[i].k))
           59                                 continue;
           60                         errno = 0;
           61                         if (!(len = confstr(confstr_l[i].v, NULL, 0))) {
           62                                 if (errno)
           63                                         eprintf("confstr %ld:", confstr_l[i].v);
           64                                 puts("undefined");
           65                         } else {
           66                                 str = emalloc(len);
           67                                 errno = 0;
           68                                 if (!confstr(confstr_l[i].v, str, len)) {
           69                                         if (errno)
           70                                                 eprintf("confstr %ld:", confstr_l[i].v);
           71                                         puts("undefined");
           72                                 } else {
           73                                         puts(str);
           74                                 }
           75                                 free(str);
           76                         }
           77                         return fshut(stdout, "<stdout>");
           78                 }
           79                 /* limits */
           80                 for (i = 0; i < LEN(limits_l); i++) {
           81                         if (strcmp(argv[0], limits_l[i].k))
           82                                 continue;
           83                         printf("%ld\n", limits_l[i].v);
           84                         return fshut(stdout, "<stdout>");
           85                 }
           86         } else if (argc == 2) {
           87                 /* pathconf */
           88                 for (i = 0; i < LEN(pathconf_l); i++) {
           89                         if (strcmp(argv[0], pathconf_l[i].k))
           90                                 continue;
           91                         errno = 0;
           92                         if ((res = pathconf(argv[1], pathconf_l[i].v)) < 0) {
           93                                 if (errno)
           94                                         eprintf("pathconf %ld:", pathconf_l[i].v);
           95                                 puts("undefined");
           96                         } else {
           97                                 printf("%ld\n", res);
           98                         }
           99                         return fshut(stdout, "<stdout>");
          100                 }
          101         } else {
          102                 usage();
          103         }
          104 
          105         eprintf("invalid variable: %s\n", argv[0]);
          106 
          107         return 0;
          108 }