sd-daemon: introduce sd_pid_notify() and sd_pid_notifyf()

sd_pid_notify() operates like sd_notify(), however operates on a
different PID (for example the parent PID of a process).

Make use of this in systemd-notify, so that message are sent from the
PID specified with --pid= rather than the usually shortlived PID of
systemd-notify itself.

This should increase the likelyhood that PID 1 can identify the cgroup
that the notification message was sent from properly.
This commit is contained in:
Lennart Poettering
2014-06-05 17:05:18 +02:00
parent 03da8f9459
commit be8f4e9e8e
4 changed files with 164 additions and 134 deletions
+23 -24
View File
@@ -147,25 +147,25 @@ static int parse_argv(int argc, char *argv[]) {
}
int main(int argc, char* argv[]) {
char* our_env[4], **final_env = NULL;
_cleanup_free_ char *status = NULL, *cpid = NULL, *n = NULL;
_cleanup_strv_free_ char **final_env = NULL;
char* our_env[4];
unsigned i = 0;
char *status = NULL, *cpid = NULL, *n = NULL;
int r, retval = EXIT_FAILURE;
int r;
log_parse_environment();
log_open();
r = parse_argv(argc, argv);
if (r <= 0) {
retval = r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
if (r <= 0)
goto finish;
}
if (arg_booted)
return sd_booted() <= 0;
if (arg_readahead) {
if ((r = sd_readahead(arg_readahead)) < 0) {
r = sd_readahead(arg_readahead);
if (r < 0) {
log_error("Failed to issue read-ahead control command: %s", strerror(-r));
goto finish;
}
@@ -175,8 +175,9 @@ int main(int argc, char* argv[]) {
our_env[i++] = (char*) "READY=1";
if (arg_status) {
if (!(status = strappend("STATUS=", arg_status))) {
log_error("Failed to allocate STATUS string.");
status = strappend("STATUS=", arg_status);
if (!status) {
r = log_oom();
goto finish;
}
@@ -185,7 +186,7 @@ int main(int argc, char* argv[]) {
if (arg_pid > 0) {
if (asprintf(&cpid, "MAINPID="PID_FMT, arg_pid) < 0) {
log_error("Failed to allocate MAINPID string.");
r = log_oom();
goto finish;
}
@@ -194,34 +195,32 @@ int main(int argc, char* argv[]) {
our_env[i++] = NULL;
if (!(final_env = strv_env_merge(2, our_env, argv + optind))) {
log_error("Failed to merge string sets.");
final_env = strv_env_merge(2, our_env, argv + optind);
if (!final_env) {
r = log_oom();
goto finish;
}
if (strv_length(final_env) <= 0) {
retval = EXIT_SUCCESS;
r = 0;
goto finish;
}
if (!(n = strv_join(final_env, "\n"))) {
log_error("Failed to concatenate strings.");
n = strv_join(final_env, "\n");
if (!n) {
r = log_oom();
goto finish;
}
if ((r = sd_notify(false, n)) < 0) {
r = sd_pid_notify(arg_pid, false, n);
if (r < 0) {
log_error("Failed to notify init system: %s", strerror(-r));
goto finish;
}
retval = r <= 0 ? EXIT_FAILURE : EXIT_SUCCESS;
if (r == 0)
r = -ENOTSUP;
finish:
free(status);
free(cpid);
free(n);
strv_free(final_env);
return retval;
return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
}