static int table_passwd_lookup(int service, struct dict *params, const char *key, char *dst, size_t sz) { int r; struct passwd pw; char *line; char tmp[LINE_MAX]; line = dict_get(passwd, key); if (line == NULL) return 0; (void)strlcpy(tmp, line, sizeof tmp); if (! parse_passwd_entry(&pw, tmp)) { log_warnx("warn: table-passwd: invalid entry"); return -1; } r = 1; switch (service) { case K_CREDENTIALS: if (snprintf(dst, sz, "%s:%s", pw.pw_name, pw.pw_passwd) >= (ssize_t)sz) { log_warnx("warn: table-passwd: result too large"); r = -1; } break; case K_USERINFO: if (snprintf(dst, sz, "%d:%d:%s", pw.pw_uid, pw.pw_gid, pw.pw_dir) >= (ssize_t)sz) { log_warnx("warn: table-passwd: result too large"); r = -1; } break; default: log_warnx("warn: table-passwd: unknown service %d", service); r = -1; } return (r); }
static int table_passwd_update(void) { FILE *fp; char *buf, *lbuf = NULL; size_t len; char *line; struct passwd pw; struct dict *npasswd; /* Parse configuration */ fp = fopen(config, "r"); if (fp == NULL) return (0); npasswd = calloc(1, sizeof *passwd); if (npasswd == NULL) goto err; dict_init(npasswd); while ((buf = fgetln(fp, &len))) { if (buf[len - 1] == '\n') buf[len - 1] = '\0'; else { /* EOF without EOL, copy and add the NUL */ if ((lbuf = malloc(len + 1)) == NULL) err(1, NULL); memcpy(lbuf, buf, len); lbuf[len] = '\0'; buf = lbuf; } if (! parse_passwd_entry(&pw, buf)) { log_warnx("warn: table-passwd: invalid entry"); goto err; } if ((line = strdup(buf)) == NULL) err(1, NULL); dict_set(npasswd, pw.pw_name, line); } free(lbuf); fclose(fp); /* swap passwd table and release old one*/ if (passwd) while (dict_poproot(passwd, (void**)&buf)) free(buf); passwd = npasswd; return (1); err: if (fp) fclose(fp); free(lbuf); /* release passwd table */ if (npasswd) { while (dict_poproot(npasswd, (void**)&buf)) free(buf); free(npasswd); } return (0); }
static int table_passwd_update(void) { FILE *fp; char *buf, *lbuf = NULL; char tmp[LINE_MAX]; size_t len; char *line; struct passwd pw; struct dict *npasswd; char *skip; /* Parse configuration */ fp = fopen(config, "r"); if (fp == NULL) return (0); npasswd = calloc(1, sizeof *passwd); if (npasswd == NULL) goto err; dict_init(npasswd); while ((buf = fgetln(fp, &len))) { if (buf[len - 1] == '\n') buf[len - 1] = '\0'; else { /* EOF without EOL, copy and add the NUL */ if ((lbuf = malloc(len + 1)) == NULL) err(1, NULL); memcpy(lbuf, buf, len); lbuf[len] = '\0'; buf = lbuf; } /* skip commented entries */ for (skip = buf; *skip; ++skip) if (*skip == '#') { *skip = '\0'; break; } /* skip empty lines */ if (strlen(buf) == 0) continue; if (strlcpy(tmp, buf, sizeof tmp) >= sizeof tmp) { log_warnx("warn: table-passwd: line too long"); goto err; } if (! parse_passwd_entry(&pw, tmp)) { log_warnx("warn: table-passwd: invalid entry"); goto err; } if ((line = strdup(buf)) == NULL) err(1, NULL); dict_set(npasswd, pw.pw_name, line); } free(lbuf); fclose(fp); /* swap passwd table and release old one*/ if (passwd) while (dict_poproot(passwd, (void**)&buf)) free(buf); passwd = npasswd; return (1); err: if (fp) fclose(fp); free(lbuf); /* release passwd table */ if (npasswd) { while (dict_poproot(npasswd, (void**)&buf)) free(buf); free(npasswd); } return (0); }