mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-12-31 17:17:43 +03:00
sysusers: use log_syntax (changes prefix from '[%s:%u]' to '%s:%u:')
This makes the sysusers use the same message convention as other tools. Also adds the prefix in a few places.
This commit is contained in:
parent
905ec0c0af
commit
87c696f247
@ -1506,22 +1506,22 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) {
|
||||
r = extract_many_words(&p, NULL, EXTRACT_UNQUOTE,
|
||||
&action, &name, &id, &description, &home, &shell, NULL);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "[%s:%u] Syntax error.", fname, line);
|
||||
return log_syntax(NULL, LOG_ERR, fname, line, r, "Syntax error.");
|
||||
if (r < 2)
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"[%s:%u] Missing action and name columns.", fname, line);
|
||||
return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL),
|
||||
"Missing action and name columns.");
|
||||
if (!isempty(p))
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"[%s:%u] Trailing garbage.", fname, line);
|
||||
return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL),
|
||||
"Trailing garbage.");
|
||||
|
||||
/* Verify action */
|
||||
if (strlen(action) != 1)
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"[%s:%u] Unknown modifier '%s'", fname, line, action);
|
||||
return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL),
|
||||
"Unknown modifier '%s'.", action);
|
||||
|
||||
if (!IN_SET(action[0], ADD_USER, ADD_GROUP, ADD_MEMBER, ADD_RANGE))
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EBADMSG),
|
||||
"[%s:%u] Unknown command type '%c'.", fname, line, action[0]);
|
||||
return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EBADMSG),
|
||||
"Unknown command type '%c'.", action[0]);
|
||||
|
||||
/* Verify name */
|
||||
if (empty_or_dash(name))
|
||||
@ -1530,12 +1530,11 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) {
|
||||
if (name) {
|
||||
r = specifier_printf(name, NAME_MAX, system_and_tmp_specifier_table, arg_root, NULL, &resolved_name);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "[%s:%u] Failed to replace specifiers in '%s': %m", fname, line, name);
|
||||
return log_syntax(NULL, LOG_ERR, fname, line, r, "Failed to replace specifiers in '%s': %m", name);
|
||||
|
||||
if (!valid_user_group_name(resolved_name, 0))
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"[%s:%u] '%s' is not a valid user or group name.",
|
||||
fname, line, resolved_name);
|
||||
return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL),
|
||||
"'%s' is not a valid user or group name.", resolved_name);
|
||||
}
|
||||
|
||||
/* Verify id */
|
||||
@ -1545,8 +1544,8 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) {
|
||||
if (id) {
|
||||
r = specifier_printf(id, PATH_MAX-1, system_and_tmp_specifier_table, arg_root, NULL, &resolved_id);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "[%s:%u] Failed to replace specifiers in '%s': %m",
|
||||
fname, line, name);
|
||||
return log_syntax(NULL, LOG_ERR, fname, line, r,
|
||||
"Failed to replace specifiers in '%s': %m", name);
|
||||
}
|
||||
|
||||
/* Verify description */
|
||||
@ -1556,13 +1555,12 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) {
|
||||
if (description) {
|
||||
r = specifier_printf(description, LONG_LINE_MAX, system_and_tmp_specifier_table, arg_root, NULL, &resolved_description);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "[%s:%u] Failed to replace specifiers in '%s': %m",
|
||||
fname, line, description);
|
||||
return log_syntax(NULL, LOG_ERR, fname, line, r,
|
||||
"Failed to replace specifiers in '%s': %m", description);
|
||||
|
||||
if (!valid_gecos(resolved_description))
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"[%s:%u] '%s' is not a valid GECOS field.",
|
||||
fname, line, resolved_description);
|
||||
return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL),
|
||||
"'%s' is not a valid GECOS field.", resolved_description);
|
||||
}
|
||||
|
||||
/* Verify home */
|
||||
@ -1572,13 +1570,12 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) {
|
||||
if (home) {
|
||||
r = specifier_printf(home, PATH_MAX-1, system_and_tmp_specifier_table, arg_root, NULL, &resolved_home);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "[%s:%u] Failed to replace specifiers in '%s': %m",
|
||||
fname, line, home);
|
||||
return log_syntax(NULL, LOG_ERR, fname, line, r,
|
||||
"Failed to replace specifiers in '%s': %m", home);
|
||||
|
||||
if (!valid_home(resolved_home))
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"[%s:%u] '%s' is not a valid home directory field.",
|
||||
fname, line, resolved_home);
|
||||
return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL),
|
||||
"'%s' is not a valid home directory field.", resolved_home);
|
||||
}
|
||||
|
||||
/* Verify shell */
|
||||
@ -1588,63 +1585,57 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) {
|
||||
if (shell) {
|
||||
r = specifier_printf(shell, PATH_MAX-1, system_and_tmp_specifier_table, arg_root, NULL, &resolved_shell);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "[%s:%u] Failed to replace specifiers in '%s': %m",
|
||||
fname, line, shell);
|
||||
return log_syntax(NULL, LOG_ERR, fname, line, r,
|
||||
"Failed to replace specifiers in '%s': %m", shell);
|
||||
|
||||
if (!valid_shell(resolved_shell))
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"[%s:%u] '%s' is not a valid login shell field.",
|
||||
fname, line, resolved_shell);
|
||||
return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL),
|
||||
"'%s' is not a valid login shell field.", resolved_shell);
|
||||
}
|
||||
|
||||
switch (action[0]) {
|
||||
|
||||
case ADD_RANGE:
|
||||
if (resolved_name)
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"[%s:%u] Lines of type 'r' don't take a name field.",
|
||||
fname, line);
|
||||
return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL),
|
||||
"Lines of type 'r' don't take a name field.");
|
||||
|
||||
if (!resolved_id)
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"[%s:%u] Lines of type 'r' require an ID range in the third field.",
|
||||
fname, line);
|
||||
return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL),
|
||||
"Lines of type 'r' require an ID range in the third field.");
|
||||
|
||||
if (description || home || shell)
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"[%s:%u] Lines of type '%c' don't take a %s field.",
|
||||
fname, line, action[0],
|
||||
description ? "GECOS" : home ? "home directory" : "login shell");
|
||||
return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL),
|
||||
"Lines of type '%c' don't take a %s field.",
|
||||
action[0],
|
||||
description ? "GECOS" : home ? "home directory" : "login shell");
|
||||
|
||||
r = uid_range_add_str(&uid_range, &n_uid_range, resolved_id);
|
||||
if (r < 0)
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"[%s:%u] Invalid UID range %s.", fname, line, resolved_id);
|
||||
return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL),
|
||||
"Invalid UID range %s.", resolved_id);
|
||||
|
||||
return 0;
|
||||
|
||||
case ADD_MEMBER: {
|
||||
/* Try to extend an existing member or group item */
|
||||
if (!name)
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"[%s:%u] Lines of type 'm' require a user name in the second field.",
|
||||
fname, line);
|
||||
return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL),
|
||||
"Lines of type 'm' require a user name in the second field.");
|
||||
|
||||
if (!resolved_id)
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"[%s:%u] Lines of type 'm' require a group name in the third field.",
|
||||
fname, line);
|
||||
return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL),
|
||||
"Lines of type 'm' require a group name in the third field.");
|
||||
|
||||
if (!valid_user_group_name(resolved_id, 0))
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"[%s:%u] '%s' is not a valid user or group name.",
|
||||
fname, line, resolved_id);
|
||||
return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL),
|
||||
"'%s' is not a valid user or group name.", resolved_id);
|
||||
|
||||
if (description || home || shell)
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"[%s:%u] Lines of type '%c' don't take a %s field.",
|
||||
fname, line, action[0],
|
||||
description ? "GECOS" : home ? "home directory" : "login shell");
|
||||
return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL),
|
||||
"Lines of type '%c' don't take a %s field.",
|
||||
action[0],
|
||||
description ? "GECOS" : home ? "home directory" : "login shell");
|
||||
|
||||
r = string_strv_ordered_hashmap_put(&members, resolved_id, resolved_name);
|
||||
if (r < 0)
|
||||
@ -1655,9 +1646,8 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) {
|
||||
|
||||
case ADD_USER:
|
||||
if (!name)
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"[%s:%u] Lines of type 'u' require a user name in the second field.",
|
||||
fname, line);
|
||||
return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL),
|
||||
"Lines of type 'u' require a user name in the second field.");
|
||||
|
||||
r = ordered_hashmap_ensure_allocated(&users, &item_hash_ops);
|
||||
if (r < 0)
|
||||
@ -1679,7 +1669,8 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) {
|
||||
if (valid_user_group_name(gid, 0))
|
||||
i->group_name = TAKE_PTR(gid);
|
||||
else
|
||||
return log_error_errno(r, "Failed to parse GID: '%s': %m", id);
|
||||
return log_syntax(NULL, LOG_ERR, fname, line, r,
|
||||
"Failed to parse GID: '%s': %m", id);
|
||||
} else {
|
||||
i->gid_set = true;
|
||||
i->id_set_strict = true;
|
||||
@ -1689,7 +1680,8 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) {
|
||||
if (!streq(resolved_id, "-")) {
|
||||
r = parse_uid(resolved_id, &i->uid);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to parse UID: '%s': %m", id);
|
||||
return log_syntax(NULL, LOG_ERR, fname, line, r,
|
||||
"Failed to parse UID: '%s': %m", id);
|
||||
i->uid_set = true;
|
||||
}
|
||||
}
|
||||
@ -1704,15 +1696,14 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) {
|
||||
|
||||
case ADD_GROUP:
|
||||
if (!name)
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"[%s:%u] Lines of type 'g' require a user name in the second field.",
|
||||
fname, line);
|
||||
return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL),
|
||||
"Lines of type 'g' require a user name in the second field.");
|
||||
|
||||
if (description || home || shell)
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"[%s:%u] Lines of type '%c' don't take a %s field.",
|
||||
fname, line, action[0],
|
||||
description ? "GECOS" : home ? "home directory" : "login shell");
|
||||
return log_syntax(NULL, LOG_ERR, fname, line, SYNTHETIC_ERRNO(EINVAL),
|
||||
"Lines of type '%c' don't take a %s field.",
|
||||
action[0],
|
||||
description ? "GECOS" : home ? "home directory" : "login shell");
|
||||
|
||||
r = ordered_hashmap_ensure_allocated(&groups, &item_hash_ops);
|
||||
if (r < 0)
|
||||
@ -1729,7 +1720,8 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) {
|
||||
} else {
|
||||
r = parse_gid(resolved_id, &i->gid);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to parse GID: '%s': %m", id);
|
||||
return log_syntax(NULL, LOG_ERR, fname, line, r,
|
||||
"Failed to parse GID: '%s': %m", id);
|
||||
|
||||
i->gid_set = true;
|
||||
}
|
||||
@ -1749,9 +1741,9 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) {
|
||||
if (existing) {
|
||||
/* Two identical items are fine */
|
||||
if (!item_equal(existing, i))
|
||||
log_warning("%s:%u: conflict with earlier configuration for %s '%s', ignoring line.",
|
||||
fname, line,
|
||||
item_type_to_string(i->type), i->name);
|
||||
log_syntax(NULL, LOG_WARNING, fname, line, SYNTHETIC_ERRNO(EUCLEAN),
|
||||
"Conflict with earlier configuration for %s '%s', ignoring line.",
|
||||
item_type_to_string(i->type), i->name);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -152,7 +152,7 @@ for f in $(ls -1 $SOURCE/unhappy-*.input | sort -V); do
|
||||
echo "*** Running test $f"
|
||||
prepare_testdir ${f%.input}
|
||||
cp $f $TESTDIR/usr/lib/sysusers.d/test.conf
|
||||
$SYSUSERS --root=$TESTDIR 2>&1 | tail -n1 > $TESTDIR/err
|
||||
$SYSUSERS --root=$TESTDIR 2>&1 | tail -n1 | sed -r 's/^[^:]+:[^:]+://' >$TESTDIR/err
|
||||
if ! diff -u $TESTDIR/err ${f%.*}.expected-err; then
|
||||
echo "**** Unexpected error output for $f"
|
||||
cat $TESTDIR/err
|
||||
|
@ -1 +1 @@
|
||||
Failed to parse UID: '9999999999': Numerical result out of range
|
||||
Failed to parse UID: '9999999999': Numerical result out of range
|
||||
|
Loading…
Reference in New Issue
Block a user