xref: /openbsd-src/usr.bin/cvs/config.c (revision 397ddb8a3f80a7c0fc96b9834bf9a6841845ed3c)
1*397ddb8aSnicm /*	$OpenBSD: config.c,v 1.17 2015/11/05 09:48:21 nicm Exp $	*/
218911d1eSjoris /*
318911d1eSjoris  * Copyright (c) 2006 Joris Vink <joris@openbsd.org>
418911d1eSjoris  *
518911d1eSjoris  * Permission to use, copy, modify, and distribute this software for any
618911d1eSjoris  * purpose with or without fee is hereby granted, provided that the above
718911d1eSjoris  * copyright notice and this permission notice appear in all copies.
818911d1eSjoris  *
918911d1eSjoris  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1018911d1eSjoris  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1118911d1eSjoris  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1218911d1eSjoris  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1318911d1eSjoris  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1418911d1eSjoris  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1518911d1eSjoris  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1618911d1eSjoris  */
1718911d1eSjoris 
18b9fc9a72Sderaadt #include <sys/types.h>
191f8531bdSotto #include <sys/dirent.h>
201f8531bdSotto #include <sys/resource.h>
211f8531bdSotto 
221f8531bdSotto #include <errno.h>
23a835f639Stobias #include <limits.h>
241f8531bdSotto #include <stdlib.h>
251f8531bdSotto #include <string.h>
2618911d1eSjoris 
2718911d1eSjoris #include "cvs.h"
2818911d1eSjoris #include "config.h"
2918911d1eSjoris 
3018911d1eSjoris void
cvs_parse_configfile(void)3118911d1eSjoris cvs_parse_configfile(void)
3218911d1eSjoris {
33e97aaedbSjoris 	cvs_log(LP_TRACE, "cvs_parse_configfile()");
34e97aaedbSjoris 	cvs_read_config(CVS_PATH_CONFIG, config_parse_line);
35e97aaedbSjoris }
36e97aaedbSjoris 
378868bb21Sjoris int
config_parse_line(char * line,int lineno)38ba6315b4Sjoris config_parse_line(char *line, int lineno)
39e97aaedbSjoris {
406840c8adSjoris 	struct rlimit rl;
4118911d1eSjoris 	const char *errstr;
42e97aaedbSjoris 	char *val, *opt, *ep;
4318911d1eSjoris 
44e97aaedbSjoris 	opt = line;
4518911d1eSjoris 	if ((val = strrchr(opt, '=')) == NULL)
4618911d1eSjoris 		fatal("cvs_parse_configfile: bad option '%s'", opt);
4718911d1eSjoris 
4818911d1eSjoris 	*(val++) = '\0';
4918911d1eSjoris 
5018911d1eSjoris 	if (!strcmp(opt, "tag")) {
51*397ddb8aSnicm 		free(cvs_tagname);
5218911d1eSjoris 		cvs_tagname = xstrdup(val);
5318911d1eSjoris 	} else if (!strcmp(opt, "umask")) {
54a835f639Stobias 		cvs_umask = strtol(val, &ep, 8);
55a835f639Stobias 
56a835f639Stobias 		if (val == ep || *ep != '\0')
57a835f639Stobias 			fatal("cvs_parse_configfile: umask %s is "
58a835f639Stobias 			    "invalid", val);
59a835f639Stobias 		if (cvs_umask < 0 || cvs_umask > 07777)
60a835f639Stobias 			fatal("cvs_parse_configfile: umask %s is "
61a835f639Stobias 			    "invalid", val);
626840c8adSjoris 	} else if (!strcmp(opt, "dlimit")) {
636840c8adSjoris 		if (getrlimit(RLIMIT_DATA, &rl) != -1) {
646840c8adSjoris 			rl.rlim_cur = (int)strtonum(val, 0, INT_MAX,
656840c8adSjoris 			    &errstr);
666840c8adSjoris 			if (errstr != NULL)
676840c8adSjoris 				fatal("cvs_parse_configfile: %s: %s",
686840c8adSjoris 				    val, errstr);
696840c8adSjoris 			rl.rlim_cur = rl.rlim_cur * 1024;
706840c8adSjoris 			(void)setrlimit(RLIMIT_DATA, &rl);
716840c8adSjoris 		}
7218911d1eSjoris 	} else {
7318911d1eSjoris 		cvs_log(LP_ERR, "ignoring unknown option '%s'", opt);
7418911d1eSjoris 	}
758868bb21Sjoris 
768868bb21Sjoris 	return (0);
77e97aaedbSjoris }
78e97aaedbSjoris 
79e97aaedbSjoris void
cvs_read_config(char * name,int (* cb)(char *,int))808868bb21Sjoris cvs_read_config(char *name, int (*cb)(char *, int))
81e97aaedbSjoris {
82e97aaedbSjoris 	FILE *fp;
83e97aaedbSjoris 	size_t len;
84ba6315b4Sjoris 	int lineno;
85b9fc9a72Sderaadt 	char *p, *buf, *lbuf, fpath[PATH_MAX];
86e97aaedbSjoris 
87e97aaedbSjoris 	(void)xsnprintf(fpath, sizeof(fpath), "%s/%s",
88e97aaedbSjoris 	    current_cvsroot->cr_dir, name);
89e97aaedbSjoris 
90e97aaedbSjoris 	if ((fp = fopen(fpath, "r")) == NULL)
91e97aaedbSjoris 		return;
92e97aaedbSjoris 
93e97aaedbSjoris 	lbuf = NULL;
94ba6315b4Sjoris 	lineno = 0;
95e97aaedbSjoris 	while ((buf = fgetln(fp, &len)) != NULL) {
96ba6315b4Sjoris 		lineno++;
97e97aaedbSjoris 		if (buf[len - 1] == '\n') {
98e97aaedbSjoris 			buf[len - 1] = '\0';
99e97aaedbSjoris 		} else {
100e97aaedbSjoris 			lbuf = xmalloc(len + 1);
101e97aaedbSjoris 			memcpy(lbuf, buf, len);
102e97aaedbSjoris 			lbuf[len] = '\0';
103e97aaedbSjoris 			buf = lbuf;
104e97aaedbSjoris 		}
105e97aaedbSjoris 
106e97aaedbSjoris 		p = buf;
107e97aaedbSjoris 		while (*p == ' ' || *p == '\t')
108e97aaedbSjoris 			p++;
109e97aaedbSjoris 
110e97aaedbSjoris 		if (p[0] == '#' || p[0] == '\0')
111e97aaedbSjoris 			continue;
112e97aaedbSjoris 
1138868bb21Sjoris 		if (cb(p, lineno) < 0)
1148868bb21Sjoris 			break;
115e97aaedbSjoris 	}
11618911d1eSjoris 
117*397ddb8aSnicm 	free(lbuf);
11818911d1eSjoris 	(void)fclose(fp);
11918911d1eSjoris }
120