diff options
Diffstat (limited to 'nslcd/hackers_parse.c')
-rw-r--r-- | nslcd/hackers_parse.c | 61 |
1 files changed, 30 insertions, 31 deletions
diff --git a/nslcd/hackers_parse.c b/nslcd/hackers_parse.c index 0c9b6f8..0a699cf 100644 --- a/nslcd/hackers_parse.c +++ b/nslcd/hackers_parse.c @@ -1,3 +1,4 @@ +/* -*- tab-width: 4; c-basic-offset: 4 -*- */ /* hackers_parse.c - load user data from hackers.git * * Copyright (C) 2014 Luke Shumaker @@ -17,13 +18,11 @@ */ #define _GNU_SOURCE +#include <errno.h> #include <stdbool.h> #include <stdio.h> #include <yaml.h> -#include <error.h> -#include <errno.h> - /* These three are just for name2gid, which is surprisingly * complicated. */ #include <errno.h> @@ -35,33 +34,23 @@ #define DEFAULT_PASSWORD "!" -#define ASSERT(expr) \ - do { \ - errno = 0; \ - if (!(expr)) { \ - error(0, errno, "%s:%d: ASSERT(%s) failed", \ - __FILE__, __LINE__, #expr); \ - goto error; \ - } \ - } while(0) - /* Get a string value from a YAML scalar node */ -#define STR_VALUE(node) \ - (__extension__ ({ \ - ASSERT((node)->type == YAML_SCALAR_NODE); \ - ((char*)(node)->data.scalar.value); \ - })) +#define STR_VALUE(node) \ + (__extension__ ({ \ + ASSERT((node)->type == YAML_SCALAR_NODE); \ + ((char*)(node)->data.scalar.value); \ + })) /* Bitmask flags for the completion of the fields in * 'struct passwd' (which is defined in <pwd.h>) */ -#define PW_NAME (1 << 0) -#define PW_PASSWD (1 << 1) -#define PW_UID (1 << 2) -#define PW_GID (1 << 3) -#define PW_GECOS (1 << 4) -#define PW_DIR (1 << 5) -#define PW_SHELL (1 << 6) -#define PW_ALL ((1 << 7) - 1) +#define PW_NAME (1 << 0) +#define PW_PASSWD (1 << 1) +#define PW_UID (1 << 2) +#define PW_GID (1 << 3) +#define PW_GECOS (1 << 4) +#define PW_DIR (1 << 5) +#define PW_SHELL (1 << 6) +#define PW_ALL ((1 << 7) - 1) /* Returns GID_INVALID on error */ static @@ -140,7 +129,7 @@ load_user_password(struct passwd *user) { user->pw_passwd = line; return 0; error: - error(0, errno, "unexpected error in %s", __func__); + log_log(LOG_ERR, "unexpected error in %s", __func__); nopassword: free(filename); free(line); @@ -161,7 +150,10 @@ load_user_yaml(const char *filename, struct passwd *user) { yaml_parser_t yaml_parser; ZERO(yaml_parser); yaml_document_t yaml_document; ZERO(yaml_document); - ASSERT((user->pw_uid = filename2uid(filename)) != UID_INVALID); + if ((user->pw_uid = filename2uid(filename)) == UID_INVALID) { + log_log(LOG_NOTICE, "invalid user filename: %s", filename); + goto error; + } flags |= PW_UID; ASSERT((yaml_file = fopen(filename, "r")) != NULL); @@ -201,7 +193,11 @@ load_user_yaml(const char *filename, struct passwd *user) { /* primary group */ /* TODO */ char *grp_name = "users"/*STR_VALUE(item)*/; - ASSERT((user->pw_gid = name2gid(grp_name)) != GID_INVALID); + if ((user->pw_gid = name2gid(grp_name)) == GID_INVALID) { + log_log(LOG_NOTICE, "unrecognized group name: %s", + grp_name); + continue; + } flags |= PW_GID; } else { /* secondary group */ @@ -215,11 +211,14 @@ load_user_yaml(const char *filename, struct passwd *user) { goto error; flags |= PW_PASSWD; } - ASSERT(flags == PW_ALL); + if (flags != PW_ALL) { + log_log(LOG_NOTICE, "user file was incomplete, ignoring: %s", filename); + goto error; + } ret = 0; goto end; error: - error(0, errno, "error when parsing %s", filename); + log_log(LOG_INFO, "ignoring file: %s", filename); PASSWD_FREE(*user); user->pw_uid = UID_INVALID; end: |