summaryrefslogtreecommitdiff
path: root/nslcd/hackers_parse.c
diff options
context:
space:
mode:
Diffstat (limited to 'nslcd/hackers_parse.c')
-rw-r--r--nslcd/hackers_parse.c61
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: