/* See LICENSE file for copyright and license details. */
#include <errno.h>
#include <unistd.h>
#include <limits.h>
#include <stdlib.h>
#include <string.h>

#include "util.h"

struct var {
	const char *k;
	long v;
};

#include "getconf.h"

void
usage(void)
{
	eprintf("usage: %s [-v spec] var [path]\n", argv0);
}

int
main(int argc, char *argv[])
{
	size_t len;
	long res;
	int i;
	char *str;

	ARGBEGIN {
	case 'v':
		/* ignore */
		EARGF(usage());
		break;
	default:
		usage();
		break;
	} ARGEND

	if (argc == 1) {
		/* sysconf */
		for (i = 0; i < LEN(sysconf_l); i++) {
			if (strcmp(argv[0], sysconf_l[i].k))
				continue;
			errno = 0;
			if ((res = sysconf(sysconf_l[i].v)) < 0) {
				if (errno)
					eprintf("sysconf %ld:", sysconf_l[i].v);
				puts("undefined");
			} else {
				printf("%ld\n", res);
			}
			return 0;
		}
		/* confstr */
		for (i = 0; i < LEN(confstr_l); i++) {
			if (strcmp(argv[0], confstr_l[i].k))
				continue;
			errno = 0;
			if (!(len = confstr(confstr_l[i].v, NULL, 0))) {
				if (errno)
					eprintf("confstr %ld:", confstr_l[i].v);
				puts("undefined");
			} else {
				str = emalloc(len);
				errno = 0;
				if (!confstr(confstr_l[i].v, str, len)) {
					if (errno)
						eprintf("confstr %ld:", confstr_l[i].v);
					puts("undefined");
				} else {
					puts(str);
				}
				free(str);
			}
			return 0;
		}
		/* limits */
		for (i = 0; i < LEN(limits_l); i++) {
			if (strcmp(argv[0], limits_l[i].k))
				continue;
			printf("%ld\n", limits_l[i].v);
			return 0;
		}
	} else if (argc == 2) {
		/* pathconf */
		for (i = 0; i < LEN(pathconf_l); i++) {
			if (strcmp(argv[0], pathconf_l[i].k))
				continue;
			errno = 0;
			if ((res = pathconf(argv[1], pathconf_l[i].v)) < 0) {
				if (errno)
					eprintf("pathconf %ld:", pathconf_l[i].v);
				puts("undefined");
			} else {
				printf("%ld\n", res);
			}
			return 0;
		}
	} else {
		usage();
	}

	puts("undefined");

	return 1;
}
