xref: /original-bsd/usr.bin/man/config.c (revision 4ec22e22)
1 /*
2  * Copyright (c) 1989 The Regents of the University of California.
3  * All rights reserved.
4  *
5  * %sccs.include.redist.c%
6  */
7 
8 #ifndef lint
9 static char sccsid[] = "@(#)config.c	5.3 (Berkeley) 06/01/90";
10 #endif /* not lint */
11 
12 #include <sys/param.h>
13 #include <stdio.h>
14 #include <errno.h>
15 #include <string.h>
16 #include <stdlib.h>
17 #include <pwd.h>
18 #include "pathnames.h"
19 
20 #define	MAXLINE		1024
21 
22 extern char *progname;
23 
24 static FILE *cfp;
25 static char *buf;
26 
27 /*
28  * getpath --
29  *	read in the configuration file, calling a function with the line
30  *	from each matching section.
31  */
32 char *
33 getpath(sects)
34 	char **sects;
35 {
36 	register char **av, *p;
37 	size_t len;
38 	char **ar, line[MAXLINE], **getorder();
39 
40 	ar = getorder();
41 	openconfig();
42 	while (fgets(line, sizeof(line), cfp)) {
43 		if (!index(line, '\n')) {
44 			(void)fprintf(stderr, "%s: config line too long.\n",
45 			    progname);
46 			exit(1);
47 		}
48 		p = strtok(line, " \t\n");
49 		if (!p || *p == '#')
50 			continue;
51 		for (av = sects; *av; ++av)
52 			if (!strcmp(p, *av))
53 				break;
54 		if (!*av)
55 			continue;
56 		while (p = strtok((char *)NULL, " \t\n")) {
57 			len = strlen(p);
58 			if (p[len - 1] == '/')
59 				for (av = ar; *av; ++av)
60 					cadd(p, len, *av);
61 			else
62 				cadd(p, len, (char *)NULL);
63 		}
64 	}
65 	return(buf);
66 }
67 
68 static
69 cadd(add1, len1, add2)
70 char *add1, *add2;
71 register size_t len1;
72 {
73 	static size_t buflen;
74 	static char *bp, *endp;
75 	register size_t len2;
76 
77 	len2 = add2 ? strlen(add2) : 0;
78 	if (!bp || bp + len1 + len2 + 2 >= endp) {
79 		if (!(buf = realloc(buf, buflen += 1024)))
80 			enomem();
81 		if (!bp)
82 			bp = buf;
83 		endp = buf + buflen;
84 	}
85 	bcopy(add1, bp, len1);
86 	bp += len1;
87 	if (len2) {
88 		bcopy(add2, bp, len2);
89 		bp += len2;
90 	}
91 	*bp++ = ':';
92 	*bp = '\0';
93 }
94 
95 static
96 openconfig()
97 {
98 	if (cfp) {
99 		rewind(cfp);
100 		return;
101 	}
102 	if (!(cfp = fopen(_PATH_MANCONF, "r"))) {
103 		(void)fprintf(stderr, "%s: no configuration file %s.\n",
104 		    progname, _PATH_MANCONF);
105 		exit(1);
106 	}
107 }
108 
109 char **
110 getdb()
111 {
112 	register char *p;
113 	int cnt, num;
114 	char **ar, line[MAXLINE];
115 
116 	ar = NULL;
117 	num = 0;
118 	cnt = -1;
119 	openconfig();
120 	while (fgets(line, sizeof(line), cfp)) {
121 		if (!index(line, '\n')) {
122 			(void)fprintf(stderr, "%s: config line too long.\n",
123 			    progname);
124 			exit(1);
125 		}
126 		p = strtok(line, " \t\n");
127 #define	WHATDB	"_whatdb"
128 		if (!p || *p == '#' || strcmp(p, WHATDB))
129 			continue;
130 		while (p = strtok((char *)NULL, " \t\n")) {
131 			if (cnt == num - 1 &&
132 			    !(ar = realloc(ar, (num += 30) * sizeof(char **))))
133 				enomem();
134 			if (!(ar[++cnt] = strdup(p)))
135 				enomem();
136 		}
137 	}
138 	if (ar) {
139 		if (cnt == num - 1 &&
140 		    !(ar = realloc(ar, ++num * sizeof(char **))))
141 			enomem();
142 		ar[++cnt] = NULL;
143 	}
144 	return(ar);
145 }
146 
147 static char **
148 getorder()
149 {
150 	register char *p;
151 	int cnt, num;
152 	char **ar, line[MAXLINE];
153 
154 	ar = NULL;
155 	num = 0;
156 	cnt = -1;
157 	openconfig();
158 	while (fgets(line, sizeof(line), cfp)) {
159 		if (!index(line, '\n')) {
160 			(void)fprintf(stderr, "%s: config line too long.\n",
161 			    progname);
162 			exit(1);
163 		}
164 		p = strtok(line, " \t\n");
165 #define	SUBDIR	"_subdir"
166 		if (!p || *p == '#' || strcmp(p, SUBDIR))
167 			continue;
168 		while (p = strtok((char *)NULL, " \t\n")) {
169 			if (cnt == num - 1 &&
170 			    !(ar = realloc(ar, (num += 30) * sizeof(char **))))
171 				enomem();
172 			if (!(ar[++cnt] = strdup(p)))
173 				enomem();
174 		}
175 	}
176 	if (ar) {
177 		if (cnt == num - 1 &&
178 		    !(ar = realloc(ar, ++num * sizeof(char **))))
179 			enomem();
180 		ar[++cnt] = NULL;
181 	}
182 	return(ar);
183 }
184 
185 getsection(sect)
186 	char *sect;
187 {
188 	register char *p;
189 	char line[MAXLINE];
190 
191 	openconfig();
192 	while (fgets(line, sizeof(line), cfp)) {
193 		if (!index(line, '\n')) {
194 			(void)fprintf(stderr, "%s: config line too long.\n",
195 			    progname);
196 			exit(1);
197 		}
198 		p = strtok(line, " \t\n");
199 		if (!p || *p == '#')
200 			continue;
201 		if (!strcmp(p, sect))
202 			return(1);
203 	}
204 	return(0);
205 }
206 
207 enomem()
208 {
209 	(void)fprintf(stderr, "%s: %s\n", progname, strerror(ENOMEM));
210 	exit(1);
211 }
212