[systemd-commits] 4 commits - Makefile.am src/cryptsetup-generator.c src/fsck.c src/job.c src/manager.c src/shutdown.c src/util.c src/util.h TODO
Lennart Poettering
lennart at kemper.freedesktop.org
Mon Feb 14 15:31:04 PST 2011
Makefile.am | 6 +-
TODO | 4 -
src/cryptsetup-generator.c | 2
src/fsck.c | 10 ++-
src/job.c | 2
src/manager.c | 86 +--------------------------------
src/shutdown.c | 2
src/util.c | 114 +++++++++++++++++++++++++++++++++++++++++++++
src/util.h | 2
9 files changed, 137 insertions(+), 91 deletions(-)
New commits:
commit a4c24ff75a57efc95b34ece5a7805c3b156208ef
Author: Lennart Poettering <lennart at poettering.net>
Date: Tue Feb 15 00:30:51 2011 +0100
fsck: do not fail boot if fsck returns with an error code that hasn't 2 or 6 set
diff --git a/TODO b/TODO
index b2b9682..8f9f76e 100644
--- a/TODO
+++ b/TODO
@@ -5,9 +5,7 @@ Bugs:
* when plymouth is disabled the console password entry stuff seems to be borked
https://bugzilla.redhat.com/show_bug.cgi?id=655538
-* fsck.btrfs non-existance should not cause mounting to fail
-
-* single user service needs to be masked?
+* systemctl default is started when we type "reboot" at rescue mode prompt
Features:
diff --git a/src/fsck.c b/src/fsck.c
index fdcf6b4..7855f3a 100644
--- a/src/fsck.c
+++ b/src/fsck.c
@@ -57,7 +57,7 @@ static void start_target(const char *target, bool isolate) {
else
mode = "replace";
- log_debug("Running request %s/start/%s", target, mode);
+ log_info("Running request %s/start/%s", target, mode);
if (!(m = dbus_message_new_method_call("org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", "StartUnitReplace"))) {
log_error("Could not allocate message.");
@@ -247,12 +247,16 @@ int main(int argc, char *argv[]) {
else
log_error("fsck failed due to unknown reason.");
- if (status.si_code == CLD_EXITED && status.si_status & 2)
+ if (status.si_code == CLD_EXITED && (status.si_status & 2) && root_directory)
/* System should be rebooted. */
start_target(SPECIAL_REBOOT_TARGET, false);
- else
+ else if (status.si_code == CLD_EXITED && (status.si_status & 6))
/* Some other problem */
start_target(SPECIAL_EMERGENCY_TARGET, true);
+ else {
+ r = EXIT_SUCCESS;
+ log_warning("Ignoring error.");
+ }
} else
r = EXIT_SUCCESS;
commit 83cc030fadf71d63d488cf9015275f9e5a02e2cc
Author: Lennart Poettering <lennart at poettering.net>
Date: Tue Feb 15 00:30:11 2011 +0100
shutdown: execute all binaries in /lib/systemd/system-shutdown as last step before invoking reboot()
diff --git a/Makefile.am b/Makefile.am
index dd872f8..f508163 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -41,6 +41,7 @@ rootsbindir=$(rootdir)/sbin
rootlibexecdir=$(rootdir)/lib/systemd
systemunitdir=$(rootdir)/lib/systemd/system
systemgeneratordir=$(rootdir)/lib/systemd/system-generators
+systemshutdowndir=$(rootdir)/lib/systemd/system-shutdown
AM_CPPFLAGS = \
-include $(top_builddir)/config.h \
@@ -62,6 +63,7 @@ AM_CPPFLAGS = \
-DSYSTEMD_CRYPTSETUP_PATH=\"$(rootlibexecdir)/systemd-cryptsetup\" \
-DSYSTEM_GENERATOR_PATH=\"$(systemgeneratordir)\" \
-DUSER_GENERATOR_PATH=\"$(usergeneratordir)\" \
+ -DSYSTEM_SHUTDOWN_PATH=\"$(systemshutdowndir)\" \
-I $(top_srcdir)/src
if TARGET_GENTOO
@@ -375,7 +377,8 @@ libsystemd_basic_la_SOURCES = \
src/conf-parser.c \
src/socket-util.c \
src/log.c \
- src/ratelimit.c
+ src/ratelimit.c \
+ src/exit-status.c
libsystemd_basic_la_CFLAGS = \
$(AM_CFLAGS) \
@@ -403,7 +406,6 @@ libsystemd_core_la_SOURCES = \
src/load-dropin.c \
src/execute.c \
src/utmp-wtmp.c \
- src/exit-status.c \
src/dbus.c \
src/dbus-manager.c \
src/dbus-unit.c \
diff --git a/src/manager.c b/src/manager.c
index 92b2745..7d0b351 100644
--- a/src/manager.c
+++ b/src/manager.c
@@ -2836,9 +2836,8 @@ void manager_check_finished(Manager *m) {
void manager_run_generators(Manager *m) {
DIR *d = NULL;
- struct dirent *de;
- Hashmap *pids = NULL;
const char *generator_path;
+ const char *argv[3];
assert(m);
@@ -2868,83 +2867,11 @@ void manager_run_generators(Manager *m) {
}
}
- if (!(pids = hashmap_new(trivial_hash_func, trivial_compare_func))) {
- log_error("Failed to allocate set.");
- goto finish;
- }
-
- while ((de = readdir(d))) {
- char *path;
- pid_t pid;
- int k;
-
- if (ignore_file(de->d_name))
- continue;
+ argv[0] = NULL; /* Leave this empty, execute_directory() will fill something in */
+ argv[1] = m->generator_unit_path;
+ argv[2] = NULL;
- if (de->d_type != DT_REG &&
- de->d_type != DT_LNK &&
- de->d_type != DT_UNKNOWN)
- continue;
-
- if (asprintf(&path, "%s/%s", generator_path, de->d_name) < 0) {
- log_error("Out of memory");
- continue;
- }
-
- if ((pid = fork()) < 0) {
- log_error("Failed to fork: %m");
- free(path);
- continue;
- }
-
- if (pid == 0) {
- const char *arguments[5];
- /* Child */
-
- arguments[0] = path;
- arguments[1] = m->generator_unit_path;
- arguments[2] = NULL;
-
- execv(path, (char **) arguments);
-
- log_error("Failed to execute %s: %m", path);
- _exit(EXIT_FAILURE);
- }
-
- log_debug("Spawned generator %s as %lu", path, (unsigned long) pid);
-
- if ((k = hashmap_put(pids, UINT_TO_PTR(pid), path)) < 0) {
- log_error("Failed to add PID to set: %s", strerror(-k));
- free(path);
- }
- }
-
- while (!hashmap_isempty(pids)) {
- siginfo_t si;
- char *path;
-
- zero(si);
- if (waitid(P_ALL, 0, &si, WEXITED) < 0) {
-
- if (errno == EINTR)
- continue;
-
- log_error("waitid() failed: %m");
- goto finish;
- }
-
- if ((path = hashmap_remove(pids, UINT_TO_PTR(si.si_pid)))) {
- if (!is_clean_exit(si.si_code, si.si_status)) {
- if (si.si_code == CLD_EXITED)
- log_error("%s exited with exit status %i.", path, si.si_status);
- else
- log_error("%s terminated by signal %s.", path, signal_to_string(si.si_status));
- } else
- log_debug("Generator %s exited successfully.", path);
-
- free(path);
- }
- }
+ execute_directory(generator_path, d, (char**) argv);
if (rmdir(m->generator_unit_path) >= 0) {
/* Uh? we were able to remove this dir? I guess that
@@ -2973,9 +2900,6 @@ void manager_run_generators(Manager *m) {
finish:
if (d)
closedir(d);
-
- if (pids)
- hashmap_free_free(pids);
}
void manager_undo_generators(Manager *m) {
diff --git a/src/shutdown.c b/src/shutdown.c
index 94deb85..23b9f1b 100644
--- a/src/shutdown.c
+++ b/src/shutdown.c
@@ -336,6 +336,8 @@ int main(int argc, char *argv[]) {
if (retries >= FINALIZE_ATTEMPTS)
log_error("Too many interations, giving up.");
+ execute_directory(SYSTEM_SHUTDOWN_PATH, NULL, NULL);
+
sync();
if (cmd == LINUX_REBOOT_CMD_KEXEC) {
diff --git a/src/util.c b/src/util.c
index 80b88b0..b0a01fd 100644
--- a/src/util.c
+++ b/src/util.c
@@ -59,6 +59,7 @@
#include "strv.h"
#include "label.h"
#include "exit-status.h"
+#include "hashmap.h"
bool streq_ptr(const char *a, const char *b) {
@@ -3664,6 +3665,119 @@ bool running_in_vm(void) {
return false;
}
+void execute_directory(const char *directory, DIR *d, char *argv[]) {
+ DIR *_d = NULL;
+ struct dirent *de;
+ Hashmap *pids = NULL;
+
+ assert(directory);
+
+ /* Executes all binaries in a directory in parallel and waits
+ * until all they all finished. */
+
+ if (!d) {
+ if (!(_d = opendir(directory))) {
+
+ if (errno == ENOENT)
+ return;
+
+ log_error("Failed to enumerate directory %s: %m", directory);
+ return;
+ }
+
+ d = _d;
+ }
+
+ if (!(pids = hashmap_new(trivial_hash_func, trivial_compare_func))) {
+ log_error("Failed to allocate set.");
+ goto finish;
+ }
+
+ while ((de = readdir(d))) {
+ char *path;
+ pid_t pid;
+ int k;
+
+ if (ignore_file(de->d_name))
+ continue;
+
+ if (de->d_type != DT_REG &&
+ de->d_type != DT_LNK &&
+ de->d_type != DT_UNKNOWN)
+ continue;
+
+ if (asprintf(&path, "%s/%s", directory, de->d_name) < 0) {
+ log_error("Out of memory");
+ continue;
+ }
+
+ if ((pid = fork()) < 0) {
+ log_error("Failed to fork: %m");
+ free(path);
+ continue;
+ }
+
+ if (pid == 0) {
+ char *_argv[2];
+ /* Child */
+
+ if (!argv) {
+ _argv[0] = path;
+ _argv[1] = NULL;
+ argv = _argv;
+ } else
+ if (!argv[0])
+ argv[0] = path;
+
+ execv(path, argv);
+
+ log_error("Failed to execute %s: %m", path);
+ _exit(EXIT_FAILURE);
+ }
+
+ log_debug("Spawned %s as %lu", path, (unsigned long) pid);
+
+ if ((k = hashmap_put(pids, UINT_TO_PTR(pid), path)) < 0) {
+ log_error("Failed to add PID to set: %s", strerror(-k));
+ free(path);
+ }
+ }
+
+ while (!hashmap_isempty(pids)) {
+ siginfo_t si;
+ char *path;
+
+ zero(si);
+ if (waitid(P_ALL, 0, &si, WEXITED) < 0) {
+
+ if (errno == EINTR)
+ continue;
+
+ log_error("waitid() failed: %m");
+ goto finish;
+ }
+
+ if ((path = hashmap_remove(pids, UINT_TO_PTR(si.si_pid)))) {
+ if (!is_clean_exit(si.si_code, si.si_status)) {
+ if (si.si_code == CLD_EXITED)
+ log_error("%s exited with exit status %i.", path, si.si_status);
+ else
+ log_error("%s terminated by signal %s.", path, signal_to_string(si.si_status));
+ } else
+ log_debug("%s exited successfully.", path);
+
+ free(path);
+ }
+ }
+
+finish:
+ if (_d)
+ closedir(_d);
+
+ if (pids)
+ hashmap_free_free(pids);
+}
+
static const char *const ioprio_class_table[] = {
[IOPRIO_CLASS_NONE] = "none",
[IOPRIO_CLASS_RT] = "realtime",
diff --git a/src/util.h b/src/util.h
index a534dcf..3898b89 100644
--- a/src/util.h
+++ b/src/util.h
@@ -375,6 +375,8 @@ const char *default_term_for_tty(const char *tty);
bool running_in_vm(void);
+void execute_directory(const char *directory, DIR *_d, char *argv[]);
+
#define NULSTR_FOREACH(i, l) \
for ((i) = (l); (i) && *(i); (i) = strchr((i), 0)+1)
commit 3036c489fa503031acb9a2fba1f3537cbe59ae9e
Author: Lennart Poettering <lennart at poettering.net>
Date: Mon Feb 14 23:10:31 2011 +0100
job: make status message printing more verbose
diff --git a/src/job.c b/src/job.c
index 30a46be..18a2495 100644
--- a/src/job.c
+++ b/src/job.c
@@ -498,7 +498,7 @@ int job_finish_and_invalidate(Job *j, bool success) {
job_free(j);
if (!success && j->type == JOB_START)
- unit_status_printf(u, "Starting %s " ANSI_HIGHLIGHT_ON "failed" ANSI_HIGHLIGHT_OFF ".\n", unit_description(u));
+ unit_status_printf(u, "Starting %s " ANSI_HIGHLIGHT_ON "failed" ANSI_HIGHLIGHT_OFF ", see 'systemctl status %s' for details.\n", unit_description(u), u->meta.id);
/* Fail depending jobs on failure */
if (!success) {
commit a4477e68524ea7aeadd57028ff83319cb2c83620
Author: Lennart Poettering <lennart at poettering.net>
Date: Mon Feb 14 23:09:27 2011 +0100
cryptsetup: fix unit file description
diff --git a/src/cryptsetup-generator.c b/src/cryptsetup-generator.c
index 2bc4f56..00120f6 100644
--- a/src/cryptsetup-generator.c
+++ b/src/cryptsetup-generator.c
@@ -98,7 +98,7 @@ static int create_disk(
fprintf(f,
"[Unit]\n"
- "Description=Cryptography Setup for %%f\n"
+ "Description=Cryptography Setup for %%I\n"
"DefaultDependencies=no\n"
"BindTo=%s dev-mapper-%%i.device\n"
"After=systemd-readahead-collect.service systemd-readahead-replay.service %s\n"
More information about the systemd-commits
mailing list