gdm r6036 - in trunk: . common daemon gui/simple-greeter



Author: mccann
Date: Mon Mar 17 23:49:00 2008
New Revision: 6036
URL: http://svn.gnome.org/viewvc/gdm?rev=6036&view=rev

Log:
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.



Modified:
   trunk/ChangeLog
   trunk/common/gdm-common.c
   trunk/common/gdm-common.h
   trunk/common/gdm-settings-desktop-backend.c
   trunk/common/gdm-settings-utils.c
   trunk/daemon/gdm-server.c
   trunk/daemon/gdm-session-worker-job.c
   trunk/daemon/gdm-slave-proxy.c
   trunk/daemon/gdm-welcome-session.c
   trunk/daemon/main.c
   trunk/gui/simple-greeter/gdm-remote-login-window.c
   trunk/gui/simple-greeter/gdm-session-client.c

Modified: trunk/common/gdm-common.c
==============================================================================
--- trunk/common/gdm-common.c	(original)
+++ trunk/common/gdm-common.c	Mon Mar 17 23:49:00 2008
@@ -64,13 +64,43 @@
 }
 
 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 @@
         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 @@
          * than the passed in size.
          */
 
+        errno = 0;
         fd = open ("/dev/urandom", O_RDONLY);
 
         if (fd < 0) {

Modified: trunk/common/gdm-common.h
==============================================================================
--- trunk/common/gdm-common.h	(original)
+++ trunk/common/gdm-common.h	Mon Mar 17 23:49:00 2008
@@ -30,6 +30,7 @@
 gboolean       gdm_is_version_unstable            (void);
 void           gdm_set_fatal_warnings_if_unstable (void);
 
+int            gdm_wait_on_pid           (int pid);
 int            gdm_signal_pid            (int pid,
                                           int signal);
 

Modified: trunk/common/gdm-settings-desktop-backend.c
==============================================================================
--- trunk/common/gdm-settings-desktop-backend.c	(original)
+++ trunk/common/gdm-settings-desktop-backend.c	Mon Mar 17 23:49:00 2008
@@ -77,6 +77,19 @@
         g = k = v = l = NULL;
         split1 = split2 = NULL;
 
+        if (group != NULL) {
+                *group = g;
+        }
+        if (key != NULL) {
+                *key = k;
+        }
+        if (locale != NULL) {
+                *locale = l;
+        }
+        if (value != NULL) {
+                *value = v;
+        }
+
         /*g_debug ("Attempting to parse key string: %s", keystring);*/
 
         split1 = g_strsplit (keystring, "/", 2);
@@ -108,7 +121,7 @@
         }
 
         ret = TRUE;
- out:
+
         if (group != NULL) {
                 *group = g_strdup (g);
         }
@@ -121,6 +134,7 @@
         if (value != NULL) {
                 *value = g_strdup (v);
         }
+ out:
 
         g_strfreev (split1);
         g_strfreev (split2);
@@ -134,23 +148,27 @@
                                         char              **value,
                                         GError            **error)
 {
-        GError *local_error;
-        char   *val;
-        char   *g;
-        char   *k;
-        char   *l;
+        GError  *local_error;
+        char    *val;
+        char    *g;
+        char    *k;
+        char    *l;
+        gboolean ret;
 
         g_return_val_if_fail (GDM_IS_SETTINGS_BACKEND (backend), FALSE);
         g_return_val_if_fail (key != NULL, FALSE);
 
+        ret = FALSE;
+
         if (value != NULL) {
                 *value = NULL;
         }
 
+        val = g = k = l = NULL;
         /*GDM_SETTINGS_BACKEND_CLASS (gdm_settings_desktop_backend_parent_class)->get_value (display);*/
         if (! parse_key_string (key, &g, &k, &l, NULL)) {
                 g_set_error (error, GDM_SETTINGS_BACKEND_ERROR, GDM_SETTINGS_BACKEND_ERROR_KEY_NOT_FOUND, "Key not found");
-                return FALSE;
+                goto out;
         }
 
         /*g_debug ("Getting key: %s %s %s", g, k, l);*/
@@ -162,16 +180,20 @@
         if (local_error != NULL) {
                 g_error_free (local_error);
                 g_set_error (error, GDM_SETTINGS_BACKEND_ERROR, GDM_SETTINGS_BACKEND_ERROR_KEY_NOT_FOUND, "Key not found");
-                return FALSE;
+                goto out;
         }
 
         if (value != NULL) {
                 *value = g_strdup (val);
         }
-
+        ret = TRUE;
+ out:
         g_free (val);
+        g_free (g);
+        g_free (k);
+        g_free (l);
 
-        return TRUE;
+        return ret;
 }
 
 static void
@@ -331,6 +353,7 @@
 
         save_settings (backend);
         g_key_file_free (backend->priv->key_file);
+        g_free (backend->priv->filename);
 
         G_OBJECT_CLASS (gdm_settings_desktop_backend_parent_class)->finalize (object);
 }

Modified: trunk/common/gdm-settings-utils.c
==============================================================================
--- trunk/common/gdm-settings-utils.c	(original)
+++ trunk/common/gdm-settings-utils.c	Mon Mar 17 23:49:00 2008
@@ -216,14 +216,17 @@
         char                *contents;
         gsize                len;
         GError              *error;
+        gboolean             res;
 
         g_return_val_if_fail (file != NULL, FALSE);
         g_return_val_if_fail (root != NULL, FALSE);
 
         g_assert (schemas != NULL);
 
+        contents = NULL;
         error = NULL;
-        if (! g_file_get_contents (file, &contents, &len, &error)) {
+        res = g_file_get_contents (file, &contents, &len, &error);
+        if (! res) {
                 g_warning ("Unable to read schemas file: %s", error->message);
                 g_error_free (error);
                 return FALSE;
@@ -235,7 +238,9 @@
 
         *schemas = info->list;
 
+        g_markup_parse_context_free (ctx);
         g_free (info);
+        g_free (contents);
 
         return TRUE;
 }

Modified: trunk/daemon/gdm-server.c
==============================================================================
--- trunk/daemon/gdm-server.c	(original)
+++ trunk/daemon/gdm-server.c	Mon Mar 17 23:49:00 2008
@@ -678,32 +678,13 @@
         return res;
 }
 
-static int
-wait_on_child (int pid)
-{
-        int status;
-
- wait_again:
-        if (waitpid (pid, &status, 0) < 0) {
-                if (errno == EINTR) {
-                        goto wait_again;
-                } else if (errno == ECHILD) {
-                        ; /* do nothing, child already reaped */
-                } else {
-                        g_debug ("GdmServer: waitpid () should not fail");
-                }
-        }
-
-        return status;
-}
-
 static void
 server_died (GdmServer *server)
 {
         int exit_status;
 
         g_debug ("GdmServer: Waiting on process %d", server->priv->pid);
-        exit_status = wait_on_child (server->priv->pid);
+        exit_status = gdm_wait_on_pid (server->priv->pid);
 
         if (WIFEXITED (exit_status) && (WEXITSTATUS (exit_status) != 0)) {
                 g_debug ("GdmServer: Wait on child process failed");
@@ -726,6 +707,8 @@
 gboolean
 gdm_server_stop (GdmServer *server)
 {
+        int res;
+
         if (server->priv->pid <= 1) {
                 return TRUE;
         }
@@ -738,8 +721,11 @@
 
         g_debug ("GdmServer: Stopping server");
 
-        gdm_signal_pid (server->priv->pid, SIGTERM);
-        server_died (server);
+        res = gdm_signal_pid (server->priv->pid, SIGTERM);
+        if (res < 0) {
+        } else {
+                server_died (server);
+        }
 
         return TRUE;
 }

Modified: trunk/daemon/gdm-session-worker-job.c
==============================================================================
--- trunk/daemon/gdm-session-worker-job.c	(original)
+++ trunk/daemon/gdm-session-worker-job.c	Mon Mar 17 23:49:00 2008
@@ -222,32 +222,13 @@
         return res;
 }
 
-static int
-wait_on_child (int pid)
-{
-        int status;
-
- wait_again:
-        if (waitpid (pid, &status, 0) < 0) {
-                if (errno == EINTR) {
-                        goto wait_again;
-                } else if (errno == ECHILD) {
-                        ; /* do nothing, child already reaped */
-                } else {
-                        g_debug ("GdmSessionWorkerJob: waitpid () should not fail");
-                }
-        }
-
-        return status;
-}
-
 static void
 session_worker_job_died (GdmSessionWorkerJob *session_worker_job)
 {
         int exit_status;
 
         g_debug ("GdmSessionWorkerJob: Waiting on process %d", session_worker_job->priv->pid);
-        exit_status = wait_on_child (session_worker_job->priv->pid);
+        exit_status = gdm_wait_on_pid (session_worker_job->priv->pid);
 
         if (WIFEXITED (exit_status) && (WEXITSTATUS (exit_status) != 0)) {
                 g_debug ("GdmSessionWorkerJob: Wait on child process failed");
@@ -264,6 +245,7 @@
 gboolean
 gdm_session_worker_job_stop (GdmSessionWorkerJob *session_worker_job)
 {
+        int res;
 
         if (session_worker_job->priv->pid <= 1) {
                 return TRUE;
@@ -277,8 +259,12 @@
 
         g_debug ("GdmSessionWorkerJob: Stopping job pid:%d", session_worker_job->priv->pid);
 
-        gdm_signal_pid (session_worker_job->priv->pid, SIGTERM);
-        session_worker_job_died (session_worker_job);
+        res = gdm_signal_pid (session_worker_job->priv->pid, SIGTERM);
+        if (res < 0) {
+                g_warning ("Unable to kill session worker process");
+        } else {
+                session_worker_job_died (session_worker_job);
+        }
 
         return TRUE;
 }

Modified: trunk/daemon/gdm-slave-proxy.c
==============================================================================
--- trunk/daemon/gdm-slave-proxy.c	(original)
+++ trunk/daemon/gdm-slave-proxy.c	Mon Mar 17 23:49:00 2008
@@ -82,6 +82,7 @@
 
         g_spawn_close_pid (slave->priv->pid);
         slave->priv->pid = -1;
+        slave->priv->child_watch_id = 0;
 
         if (WIFEXITED (status)) {
                 int code = WEXITSTATUS (status);
@@ -147,11 +148,21 @@
 static void
 kill_slave (GdmSlaveProxy *slave)
 {
+        int exit_status;
+        int res;
+
         if (slave->priv->pid <= 1) {
                 return;
         }
 
-        gdm_signal_pid (slave->priv->pid, SIGTERM);
+        res = gdm_signal_pid (slave->priv->pid, SIGTERM);
+        if (res < 0) {
+                g_warning ("Unable to kill slave process");
+        } else {
+                exit_status = gdm_wait_on_pid (slave->priv->pid);
+                g_spawn_close_pid (slave->priv->pid);
+                slave->priv->pid = 0;
+        }
 }
 
 gboolean
@@ -167,12 +178,13 @@
 {
         g_debug ("GdmSlaveProxy: Killing slave");
 
-        kill_slave (slave);
-
         if (slave->priv->child_watch_id > 0) {
                 g_source_remove (slave->priv->child_watch_id);
+                slave->priv->child_watch_id = 0;
         }
 
+        kill_slave (slave);
+
         return TRUE;
 }
 
@@ -232,10 +244,7 @@
         slave = GDM_SLAVE_PROXY (object);
 
         g_debug ("GdmSlaveProxy: Disposing slave proxy");
-        if (slave->priv->child_watch_id > 0) {
-                g_source_remove (slave->priv->child_watch_id);
-                slave->priv->child_watch_id = 0;
-        }
+        gdm_slave_proxy_stop (slave);
 
         G_OBJECT_CLASS (gdm_slave_proxy_parent_class)->dispose (object);
 }
@@ -305,6 +314,8 @@
 
         g_return_if_fail (slave->priv != NULL);
 
+        g_free (slave->priv->command);
+
         G_OBJECT_CLASS (gdm_slave_proxy_parent_class)->finalize (object);
 }
 

Modified: trunk/daemon/gdm-welcome-session.c
==============================================================================
--- trunk/daemon/gdm-welcome-session.c	(original)
+++ trunk/daemon/gdm-welcome-session.c	Mon Mar 17 23:49:00 2008
@@ -330,10 +330,16 @@
 static gboolean
 stop_dbus_daemon (GdmWelcomeSession *welcome_session)
 {
+        int res;
+
         if (welcome_session->priv->dbus_pid > 0) {
                 g_debug ("GdmWelcomeSession: Stopping D-Bus daemon");
-                gdm_signal_pid (-1 * welcome_session->priv->dbus_pid, SIGTERM);
-                welcome_session->priv->dbus_pid = 0;
+                res = gdm_signal_pid (-1 * welcome_session->priv->dbus_pid, SIGTERM);
+                if (res < 0) {
+                        g_warning ("Unable to kill D-Bus daemon");
+                } else {
+                        welcome_session->priv->dbus_pid = 0;
+                }
         }
         return TRUE;
 }
@@ -741,32 +747,13 @@
         return res;
 }
 
-static int
-wait_on_child (int pid)
-{
-        int status;
-
- wait_again:
-        if (waitpid (pid, &status, 0) < 0) {
-                if (errno == EINTR) {
-                        goto wait_again;
-                } else if (errno == ECHILD) {
-                        ; /* do nothing, child already reaped */
-                } else {
-                        g_debug ("GdmWelcomeSession: waitpid () should not fail");
-                }
-        }
-
-        return status;
-}
-
 static void
 welcome_session_died (GdmWelcomeSession *welcome_session)
 {
         int exit_status;
 
         g_debug ("GdmWelcomeSession: Waiting on process %d", welcome_session->priv->pid);
-        exit_status = wait_on_child (welcome_session->priv->pid);
+        exit_status = gdm_wait_on_pid (welcome_session->priv->pid);
 
         if (WIFEXITED (exit_status) && (WEXITSTATUS (exit_status) != 0)) {
                 g_debug ("GdmWelcomeSession: Wait on child process failed");
@@ -783,6 +770,7 @@
 gboolean
 gdm_welcome_session_stop (GdmWelcomeSession *welcome_session)
 {
+        int res;
 
         if (welcome_session->priv->pid <= 1) {
                 return TRUE;
@@ -796,8 +784,12 @@
 
         g_debug ("GdmWelcomeSession: Stopping welcome_session");
 
-        gdm_signal_pid (-1 * welcome_session->priv->pid, SIGTERM);
-        welcome_session_died (welcome_session);
+        res = gdm_signal_pid (-1 * welcome_session->priv->pid, SIGTERM);
+        if (res < 0) {
+                g_warning ("Unable to kill welcome session process");
+        } else {
+                welcome_session_died (welcome_session);
+        }
 
         if (welcome_session->priv->ckc != NULL) {
                 close_welcome_session (welcome_session);

Modified: trunk/daemon/main.c
==============================================================================
--- trunk/daemon/main.c	(original)
+++ trunk/daemon/main.c	Mon Mar 17 23:49:00 2008
@@ -630,6 +630,8 @@
 
         g_main_loop_run (main_loop);
 
+        g_debug ("GDM finished, cleaning up...");
+
         if (manager != NULL) {
                 g_object_unref (manager);
         }
@@ -642,6 +644,8 @@
                 g_object_unref (signal_handler);
         }
 
+        gdm_settings_direct_shutdown ();
+
         g_main_loop_unref (main_loop);
 
         ret = 0;

Modified: trunk/gui/simple-greeter/gdm-remote-login-window.c
==============================================================================
--- trunk/gui/simple-greeter/gdm-remote-login-window.c	(original)
+++ trunk/gui/simple-greeter/gdm-remote-login-window.c	Mon Mar 17 23:49:00 2008
@@ -66,32 +66,13 @@
 
 G_DEFINE_TYPE (GdmRemoteLoginWindow, gdm_remote_login_window, GTK_TYPE_WINDOW)
 
-static int
-wait_on_child (int pid)
-{
-        int status;
-
- wait_again:
-        if (waitpid (pid, &status, 0) < 0) {
-                if (errno == EINTR) {
-                        goto wait_again;
-                } else if (errno == ECHILD) {
-                        ; /* do nothing, child already reaped */
-                } else {
-                        g_debug ("GdmRemoteLoginWindow: waitpid () should not fail");
-                }
-        }
-
-        return status;
-}
-
 static void
 xserver_died (GdmRemoteLoginWindow *login_window)
 {
         int exit_status;
 
         g_debug ("GdmRemoteLoginWindow: Waiting on process %d", login_window->priv->xserver_pid);
-        exit_status = wait_on_child (login_window->priv->xserver_pid);
+        exit_status = gdm_wait_on_pid (login_window->priv->xserver_pid);
 
         if (WIFEXITED (exit_status) && (WEXITSTATUS (exit_status) != 0)) {
                 g_debug ("GdmRemoteLoginWindow: Wait on child process failed");

Modified: trunk/gui/simple-greeter/gdm-session-client.c
==============================================================================
--- trunk/gui/simple-greeter/gdm-session-client.c	(original)
+++ trunk/gui/simple-greeter/gdm-session-client.c	Mon Mar 17 23:49:00 2008
@@ -162,32 +162,13 @@
         return ret;
 }
 
-static int
-wait_on_child (int pid)
-{
-        int status;
-
- wait_again:
-        if (waitpid (pid, &status, 0) < 0) {
-                if (errno == EINTR) {
-                        goto wait_again;
-                } else if (errno == ECHILD) {
-                        ; /* do nothing, child already reaped */
-                } else {
-                        g_debug ("GdmSessionClient: waitpid () should not fail");
-                }
-        }
-
-        return status;
-}
-
 static void
 client_died (GdmSessionClient *client)
 {
         int exit_status;
 
         g_debug ("GdmSessionClient: Waiting on process %d", client->priv->pid);
-        exit_status = wait_on_child (client->priv->pid);
+        exit_status = gdm_wait_on_pid (client->priv->pid);
 
         if (WIFEXITED (exit_status) && (WEXITSTATUS (exit_status) != 0)) {
                 g_debug ("GdmSessionClient: Wait on child process failed");
@@ -214,8 +195,14 @@
 
         g_debug ("GdmSessionClient: Stopping client: %s", client->priv->name);
         if (client->priv->pid > 0) {
-                gdm_signal_pid (client->priv->pid, SIGTERM);
-                client_died (client);
+                int res;
+
+                res = gdm_signal_pid (client->priv->pid, SIGTERM);
+                if (res < 0) {
+                        g_warning ("Unable to kill session client process %d", client->priv->pid);
+                } else {
+                        client_died (client);
+                }
         }
 }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]