when determining unit file list, include invalid unit names in an "invalid" state

This commit is contained in:
Lennart Poettering 2012-09-11 01:11:32 +02:00
parent 802840582c
commit b5b46d5995
7 changed files with 84 additions and 19 deletions

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
/test-unit-file
/test-log
/test-journal-verify
/test-journal-match

View File

@ -1120,13 +1120,15 @@ noinst_PROGRAMS += \
test-install \
test-watchdog \
test-unit-name \
test-log
test-log \
test-unit-file
TESTS += \
test-job-type \
test-env-replace \
test-strv \
test-unit-name
test-unit-name \
test-unit-file
test_engine_SOURCES = \
src/test/test-engine.c
@ -1176,6 +1178,12 @@ test_unit_name_SOURCES = \
test_unit_name_LDADD = \
libsystemd-core.la
test_unit_file_SOURCES = \
src/test/test-unit-file.c
test_unit_file_LDADD = \
libsystemd-core.la
test_log_SOURCES = \
src/test/test-log.c

2
TODO
View File

@ -49,6 +49,8 @@ Bugfixes:
Features:
* Document word splitting syntax for ExecStart= and friends
* merge: github.com/systemd/python-systemd
* when writing journal entries order field items by their address to improve speed on rotating media

View File

@ -1999,29 +1999,28 @@ int unit_file_get_list(
}
r = find_symlinks_in_scope(scope, root_dir, de->d_name, &f->state);
if (r < 0) {
free(f->path);
free(f);
goto finish;
} else if (r > 0)
goto found;
r = unit_file_can_install(&paths, root_dir, f->path, true);
if (r < 0) {
free(f->path);
free(f);
goto finish;
} else if (r > 0) {
f->state = UNIT_FILE_DISABLED;
goto found;
} else {
f->state = UNIT_FILE_STATIC;
f->state = UNIT_FILE_ENABLED;
goto found;
}
free(f->path);
free(f);
continue;
r = unit_file_can_install(&paths, root_dir, f->path, true);
if (r == -EINVAL || /* Invalid setting? */
r == -EBADMSG || /* Invalid format? */
r == -ENOENT /* Included file not found? */)
f->state = UNIT_FILE_INVALID;
else if (r < 0) {
free(f->path);
free(f);
goto finish;
} else if (r > 0)
f->state = UNIT_FILE_DISABLED;
else
f->state = UNIT_FILE_STATIC;
found:
r = hashmap_put(h, path_get_file_name(f->path), f);
@ -2051,7 +2050,8 @@ static const char* const unit_file_state_table[_UNIT_FILE_STATE_MAX] = {
[UNIT_FILE_MASKED] = "masked",
[UNIT_FILE_MASKED_RUNTIME] = "masked-runtime",
[UNIT_FILE_STATIC] = "static",
[UNIT_FILE_DISABLED] = "disabled"
[UNIT_FILE_DISABLED] = "disabled",
[UNIT_FILE_INVALID] = "invalid",
};
DEFINE_STRING_TABLE_LOOKUP(unit_file_state, UnitFileState);

View File

@ -40,6 +40,7 @@ typedef enum UnitFileState {
UNIT_FILE_MASKED_RUNTIME,
UNIT_FILE_STATIC,
UNIT_FILE_DISABLED,
UNIT_FILE_INVALID,
_UNIT_FILE_STATE_MAX,
_UNIT_FILE_STATE_INVALID = -1
} UnitFileState;

View File

@ -585,7 +585,8 @@ static void output_unit_file_list(const UnitFileList *units, unsigned c) {
if (u->state == UNIT_FILE_MASKED ||
u->state == UNIT_FILE_MASKED_RUNTIME ||
u->state == UNIT_FILE_DISABLED) {
u->state == UNIT_FILE_DISABLED ||
u->state == UNIT_FILE_INVALID) {
on = ansi_highlight_red(true);
off = ansi_highlight_red(false);
} else if (u->state == UNIT_FILE_ENABLED) {

52
src/test/test-unit-file.c Normal file
View File

@ -0,0 +1,52 @@
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
/***
This file is part of systemd.
Copyright 2012 Lennart Poettering
systemd is free software; you can redistribute it and/or modify it
under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
systemd is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with systemd; If not, see <http://www.gnu.org/licenses/>.
***/
#include <assert.h>
#include <stdio.h>
#include <stddef.h>
#include <string.h>
#include "install.h"
#include "util.h"
#include "macro.h"
#include "hashmap.h"
int main(int argc, char *argv[]) {
int r;
Hashmap *h;
Iterator i;
UnitFileList *p;
h = hashmap_new(string_hash_func, string_compare_func);
assert(h);
r = unit_file_get_list(UNIT_FILE_SYSTEM, NULL, h);
log_info("%s", strerror(-r));
assert(r >= 0);
HASHMAP_FOREACH(p, h, i)
printf("%s = %s\n", p->path, unit_file_state_to_string(p->state));
unit_file_list_free(h);
return 0;
}