diff options
author | William Jon McCann <jmccann@redhat.com> | 2008-03-17 23:49:00 +0000 |
---|---|---|
committer | William Jon McCann <mccann@src.gnome.org> | 2008-03-17 23:49:00 +0000 |
commit | ca1214f327095f3c080dcf79bee9e4b506d51479 (patch) | |
tree | 552acda2c50baf4d51f8f8ea88c46eed27000fdd /common/gdm-common.c | |
parent | 227edb3aa624b302e69eeb5c33c43c18d450292c (diff) | |
download | gdm-ca1214f327095f3c080dcf79bee9e4b506d51479.tar.gz |
Move wait_on_child to common. Always check return value of gdm_signal_pid.
2008-03-17 William Jon McCann <jmccann@redhat.com>
* common/gdm-common.c: (gdm_wait_on_pid), (gdm_signal_pid),
(_read_bytes), (gdm_generate_random_bytes):
* common/gdm-common.h:
* common/gdm-settings-desktop-backend.c: (parse_key_string),
(gdm_settings_desktop_backend_get_value),
(gdm_settings_desktop_backend_finalize):
* common/gdm-settings-utils.c: (gdm_settings_parse_schemas):
* daemon/gdm-server.c: (server_died), (gdm_server_stop):
* daemon/gdm-session-worker-job.c: (session_worker_job_died),
(gdm_session_worker_job_stop):
* daemon/gdm-slave-proxy.c: (child_watch), (kill_slave),
(gdm_slave_proxy_stop), (gdm_slave_proxy_dispose),
(gdm_slave_proxy_finalize):
* daemon/gdm-welcome-session.c: (stop_dbus_daemon),
(welcome_session_died), (gdm_welcome_session_stop):
* daemon/main.c: (main):
* gui/simple-greeter/gdm-remote-login-window.c: (xserver_died):
* gui/simple-greeter/gdm-session-client.c: (client_died),
(gdm_session_client_stop):
Move wait_on_child to common. Always check return value of
gdm_signal_pid. Fix a number of small leaks. Make sure
to signal the slaves when exiting.
svn path=/trunk/; revision=6036
Diffstat (limited to 'common/gdm-common.c')
-rw-r--r-- | common/gdm-common.c | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/common/gdm-common.c b/common/gdm-common.c index ec9fe99e..b94aa016 100644 --- a/common/gdm-common.c +++ b/common/gdm-common.c @@ -64,13 +64,43 @@ gdm_set_fatal_warnings_if_unstable (void) } int +gdm_wait_on_pid (int pid) +{ + int status; + + wait_again: + errno = 0; + if (waitpid (pid, &status, 0) < 0) { + if (errno == EINTR) { + goto wait_again; + } else if (errno == ECHILD) { + ; /* do nothing, child already reaped */ + } else { + g_debug ("GdmCommon: waitpid () should not fail"); + } + } + + g_debug ("GdmCommon: process (pid:%d) done (%s:%d)", + (int) pid, + WIFEXITED (status) ? "status" + : WIFSIGNALED (status) ? "signal" + : "unknown", + WIFEXITED (status) ? WEXITSTATUS (status) + : WIFSIGNALED (status) ? WTERMSIG (status) + : -1); + + return status; +} + +int gdm_signal_pid (int pid, int signal) { int status = -1; /* perhaps block sigchld */ - g_debug ("sending signal %d to process %d", signal, pid); + g_debug ("GdmCommon: sending signal %d to process %d", signal, pid); + errno = 0; status = kill (pid, signal); if (status < 0) { @@ -324,6 +354,7 @@ _read_bytes (int fd, do { size_t bytes_read = 0; + errno = 0; bytes_read = read (fd, ((guchar *) bytes) + total_bytes_read, bytes_left_to_read); @@ -377,6 +408,7 @@ gdm_generate_random_bytes (gsize size, * than the passed in size. */ + errno = 0; fd = open ("/dev/urandom", O_RDONLY); if (fd < 0) { |