summaryrefslogtreecommitdiff
path: root/common/gdm-common.c
diff options
context:
space:
mode:
authorWilliam Jon McCann <jmccann@redhat.com>2008-03-17 23:49:00 +0000
committerWilliam Jon McCann <mccann@src.gnome.org>2008-03-17 23:49:00 +0000
commitca1214f327095f3c080dcf79bee9e4b506d51479 (patch)
tree552acda2c50baf4d51f8f8ea88c46eed27000fdd /common/gdm-common.c
parent227edb3aa624b302e69eeb5c33c43c18d450292c (diff)
downloadgdm-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.c34
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) {