1 /*-
2 * Copyright (c) 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * %sccs.include.redist.c%
6 */
7
8 #if defined(LIBC_SCCS) && !defined(lint)
9 static char sccsid[] = "@(#)confstr.c 8.1 (Berkeley) 06/04/93";
10 #endif /* LIBC_SCCS and not lint */
11
12 #include <sys/param.h>
13 #include <sys/sysctl.h>
14
15 #include <errno.h>
16 #include <paths.h>
17 #include <stdlib.h>
18 #include <unistd.h>
19
20 size_t
confstr(name,buf,len)21 confstr(name, buf, len)
22 int name;
23 char *buf;
24 size_t len;
25 {
26 size_t tlen;
27 int mib[2], sverrno;
28 char *p;
29
30 switch (name) {
31 case _CS_PATH:
32 mib[0] = CTL_USER;
33 mib[1] = USER_CS_PATH;
34 if (sysctl(mib, 2, NULL, &tlen, NULL, 0) == -1)
35 return (-1);
36 if (len != 0 && buf != NULL) {
37 if ((p = malloc(tlen)) == NULL)
38 return (-1);
39 if (sysctl(mib, 2, p, &tlen, NULL, 0) == -1) {
40 sverrno = errno;
41 free(p);
42 errno = sverrno;
43 return (-1);
44 }
45 /*
46 * POSIX 1003.2 requires partial return of
47 * the string -- that should be *real* useful.
48 */
49 (void)strncpy(buf, p, len - 1);
50 buf[len - 1] = '\0';
51 free(p);
52 }
53 return (tlen + 1);
54 default:
55 errno = EINVAL;
56 return (0);
57 }
58 /* NOTREACHED */
59 }
60