mirror of
https://github.com/systemd/systemd.git
synced 2024-11-27 20:23:36 +08:00
manager: notify plymouth about progress if it is running
This commit is contained in:
parent
273f54cdc2
commit
e983b76024
2
fixme
2
fixme
@ -82,8 +82,6 @@ later:
|
||||
|
||||
* ask-password tty agent, ask-password plymouth agent
|
||||
|
||||
* plymouth update status hookup
|
||||
|
||||
* ask-password tty timeout
|
||||
|
||||
* properly handle multiple inotify events per read() in path.c and util.c
|
||||
|
@ -2299,6 +2299,75 @@ void manager_send_unit_audit(Manager *m, Unit *u, int type, bool success) {
|
||||
|
||||
}
|
||||
|
||||
void manager_send_unit_plymouth(Manager *m, Unit *u) {
|
||||
int fd = -1;
|
||||
union sockaddr_union sa;
|
||||
int n = 0;
|
||||
char *message = NULL;
|
||||
ssize_t r;
|
||||
|
||||
/* Don't generate plymouth events if the service was already
|
||||
* started and we're just deserializing */
|
||||
if (m->n_deserializing > 0)
|
||||
return;
|
||||
|
||||
if (m->running_as != MANAGER_SYSTEM)
|
||||
return;
|
||||
|
||||
if (u->meta.type != UNIT_SERVICE &&
|
||||
u->meta.type != UNIT_MOUNT &&
|
||||
u->meta.type != UNIT_SWAP)
|
||||
return;
|
||||
|
||||
/* We set SOCK_NONBLOCK here so that we rather drop the
|
||||
* message then wait for plymouth */
|
||||
if ((fd = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0)) < 0) {
|
||||
log_error("socket() failed: %m");
|
||||
return;
|
||||
}
|
||||
|
||||
zero(sa);
|
||||
sa.sa.sa_family = AF_UNIX;
|
||||
strncpy(sa.un.sun_path+1, "/ply-boot-protocol", sizeof(sa.un.sun_path)-1);
|
||||
if (connect(fd, &sa.sa, sizeof(sa.un)) < 0) {
|
||||
|
||||
if (errno != EPIPE &&
|
||||
errno != EAGAIN &&
|
||||
errno != ENOENT &&
|
||||
errno != ECONNREFUSED &&
|
||||
errno != ECONNRESET &&
|
||||
errno != ECONNABORTED)
|
||||
log_error("connect() failed: %m");
|
||||
|
||||
goto finish;
|
||||
}
|
||||
|
||||
if (asprintf(&message, "U\002%c%s%n", (int) (strlen(u->meta.id) + 1), u->meta.id, &n) < 0) {
|
||||
log_error("Out of memory");
|
||||
goto finish;
|
||||
}
|
||||
|
||||
errno = 0;
|
||||
if ((r = write(fd, message, n + 1)) != n + 1) {
|
||||
|
||||
if (errno != EPIPE &&
|
||||
errno != EAGAIN &&
|
||||
errno != ENOENT &&
|
||||
errno != ECONNREFUSED &&
|
||||
errno != ECONNRESET &&
|
||||
errno != ECONNABORTED)
|
||||
log_error("Failed to write Plymouth message: %m");
|
||||
|
||||
goto finish;
|
||||
}
|
||||
|
||||
finish:
|
||||
if (fd >= 0)
|
||||
close_nointr_nofail(fd);
|
||||
|
||||
free(message);
|
||||
}
|
||||
|
||||
void manager_dispatch_bus_name_owner_changed(
|
||||
Manager *m,
|
||||
const char *name,
|
||||
|
@ -264,6 +264,7 @@ bool manager_is_booting_or_shutting_down(Manager *m);
|
||||
void manager_reset_failed(Manager *m);
|
||||
|
||||
void manager_send_unit_audit(Manager *m, Unit *u, int type, bool success);
|
||||
void manager_send_unit_plymouth(Manager *m, Unit *u);
|
||||
|
||||
bool manager_unit_pending_inactive(Manager *m, const char *name);
|
||||
|
||||
|
@ -1165,10 +1165,13 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns) {
|
||||
if (u->meta.type == UNIT_SERVICE &&
|
||||
!UNIT_IS_ACTIVE_OR_RELOADING(os)) {
|
||||
/* Write audit record if we have just finished starting up */
|
||||
manager_send_unit_audit(u->meta.manager, u, AUDIT_SERVICE_START, 1);
|
||||
manager_send_unit_audit(u->meta.manager, u, AUDIT_SERVICE_START, true);
|
||||
u->meta.in_audit = true;
|
||||
}
|
||||
|
||||
if (!UNIT_IS_ACTIVE_OR_RELOADING(os))
|
||||
manager_send_unit_plymouth(u->meta.manager, u);
|
||||
|
||||
} else {
|
||||
|
||||
if (unit_has_name(u, SPECIAL_SYSLOG_SERVICE))
|
||||
|
Loading…
Reference in New Issue
Block a user