summaryrefslogtreecommitdiffstats
path: root/pw/pw_conf.c
diff options
context:
space:
mode:
authorBaptiste Daroussin <bapt@FreeBSD.org>2014-04-22 21:07:56 +0000
committerBaptiste Daroussin <bapt@FreeBSD.org>2014-04-22 21:07:56 +0000
commit2c05e29ec5c606201861c68f5117637e10c7e9fc (patch)
tree6da580ca66efa967b615a95e153eb6a0d6cb0820 /pw/pw_conf.c
parent684277944b55a49597784125470fe239ebade2d8 (diff)
downloadpw-darwin-2c05e29ec5c606201861c68f5117637e10c7e9fc.tar.gz
pw-darwin-2c05e29ec5c606201861c68f5117637e10c7e9fc.tar.zst
pw-darwin-2c05e29ec5c606201861c68f5117637e10c7e9fc.zip
Simplify reading pw.conf(5) by using getline(3)
Diffstat (limited to 'pw/pw_conf.c')
-rw-r--r--pw/pw_conf.c35
1 files changed, 11 insertions, 24 deletions
diff --git a/pw/pw_conf.c b/pw/pw_conf.c
index edeb015..1289b3e 100644
--- a/pw/pw_conf.c
+++ b/pw/pw_conf.c
@@ -226,35 +226,21 @@ newstr(char const * p)
struct userconf *
read_userconfig(char const * file)
{
- FILE *fp;
+ FILE *fp;
+ char *buf, *p;
+ size_t linecap;
+ ssize_t linelen;
+
+ buf = NULL;
+ linecap = 0;
extendarray(&config.groups, &config.numgroups, 200);
memset(config.groups, 0, config.numgroups * sizeof(char *));
if (file == NULL)
file = _PATH_PW_CONF;
- if ((fp = fopen(file, "r")) != NULL) {
- int buflen = LNBUFSZ;
- char *buf = malloc(buflen);
-
- nextline:
- while (fgets(buf, buflen, fp) != NULL) {
- char *p;
-
- while ((p = strchr(buf, '\n')) == NULL) {
- int l;
- if (extendline(&buf, &buflen, buflen + LNBUFSZ) == -1) {
- int ch;
- while ((ch = fgetc(fp)) != '\n' && ch != EOF);
- goto nextline; /* Ignore it */
- }
- l = strlen(buf);
- if (fgets(buf + l, buflen - l, fp) == NULL)
- break; /* Unterminated last line */
- }
-
- if (p != NULL)
- *p = '\0';
+ if ((fp = fopen(file, "r")) != NULL) {
+ while ((linelen = getline(&buf, &linecap, fp)) > 0) {
if (*buf && (p = strtok(buf, " \t\r\n=")) != NULL && *p != '#') {
static char const toks[] = " \t\r\n,=";
char *q = strtok(NULL, toks);
@@ -368,7 +354,8 @@ read_userconfig(char const * file)
}
}
}
- free(buf);
+ if (linecap > 0)
+ free(buf);
fclose(fp);
}
return &config;