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