summaryrefslogtreecommitdiffstats
path: root/pw/pw_conf.c
diff options
context:
space:
mode:
Diffstat (limited to 'pw/pw_conf.c')
-rw-r--r--pw/pw_conf.c35
1 files changed, 24 insertions, 11 deletions
diff --git a/pw/pw_conf.c b/pw/pw_conf.c
index 1289b3e..edeb015 100644
--- a/pw/pw_conf.c
+++ b/pw/pw_conf.c
@@ -226,21 +226,35 @@ newstr(char const * p)
struct userconf *
read_userconfig(char const * file)
{
- FILE *fp;
- char *buf, *p;
- size_t linecap;
- ssize_t linelen;
-
- buf = NULL;
- linecap = 0;
+ FILE *fp;
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) {
- while ((linelen = getline(&buf, &linecap, fp)) > 0) {
+ 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 (*buf && (p = strtok(buf, " \t\r\n=")) != NULL && *p != '#') {
static char const toks[] = " \t\r\n,=";
char *q = strtok(NULL, toks);
@@ -354,8 +368,7 @@ read_userconfig(char const * file)
}
}
}
- if (linecap > 0)
- free(buf);
+ free(buf);
fclose(fp);
}
return &config;