~darkxst/ubuntu/trusty/gdm/nokill

« back to all changes in this revision

Viewing changes to daemon/gdm-server.c

  • Committer: Package Import Robot
  • Author(s): Jeremy Bicha, Tim Lunn, Jeremy Bicha, Robert Ancell
  • Date: 2013-05-31 22:36:08 UTC
  • mfrom: (1.4.55)
  • Revision ID: package-import@ubuntu.com-20130531223608-33uo85niksee5460
Tags: 3.8.1.1-0ubuntu1
[ Tim Lunn ]
* New upstream release
* debian/patches/ubuntu_dont_catch_sigsegv.patch:
  - Dropped, obsolete
* debian/rules:
  - Don't rename gdm binary since that's already been
    done in the new version

[ Jeremy Bicha ]
* debian/control.in: Bump minimum glib
* debian/watch: Watch for unstable releases
* debian/patches/00git_logind_check.patch:
  - Dropped, applied in new release
* debian/patches/08_frequent-users_greeter.patch: Refreshed

[ Robert Ancell ]
* New upstream release
* debian/patches/ubuntu_daemon_autologin_tracking.patch:
* debian/patches/ubuntu_ensure_dirs.patch:
* debian/patches/ubuntu_slave-only-set-up-autologin.patch:
  - Applied upstream

Show diffs side-by-side

added added

removed removed

Lines of Context:
43
43
#include <linux/vt.h>
44
44
#endif
45
45
 
46
 
#include <glib.h>
47
46
#include <glib/gi18n.h>
48
47
#include <glib/gstdio.h>
49
 
#include <glib-object.h>
 
48
#include <gio/gio.h>
50
49
 
51
50
#include <X11/Xlib.h> /* for Display */
52
51
 
53
52
#include "gdm-common.h"
54
 
#include "gdm-signal-handler.h"
55
53
#include "gdm-settings-direct.h"
56
54
#include "gdm-settings-keys.h"
57
55
 
93
91
        char    *chosen_hostname;
94
92
 
95
93
        guint    child_watch_id;
 
94
        guint    sigusr1_id;
96
95
 
97
96
        gboolean is_initial;
98
97
};
187
186
}
188
187
 
189
188
static gboolean
190
 
emit_ready_idle (GdmServer *server)
 
189
on_sigusr1 (gpointer user_data)
 
190
 
191
191
{
 
192
        GdmServer *server = user_data;
 
193
 
192
194
        g_debug ("GdmServer: Got USR1 from X server - emitting READY");
193
195
 
194
196
        g_signal_emit (server, signals[READY], 0);
195
197
        return FALSE;
196
198
}
197
199
 
198
 
 
199
 
static gboolean
200
 
signal_cb (int        signo,
201
 
           GdmServer *server)
202
 
 
203
 
{
204
 
        g_idle_add ((GSourceFunc)emit_ready_idle, server);
205
 
 
206
 
        return TRUE;
207
 
}
208
 
 
209
 
static void
210
 
add_ready_handler (GdmServer *server)
211
 
{
212
 
        GdmSignalHandler *signal_handler;
213
 
 
214
 
        signal_handler = gdm_signal_handler_new ();
215
 
        gdm_signal_handler_add (signal_handler,
216
 
                                SIGUSR1,
217
 
                                (GdmSignalHandlerFunc)signal_cb,
218
 
                                server);
219
 
        g_object_unref (signal_handler);
220
 
}
221
 
 
222
 
static void
223
 
remove_ready_handler (GdmServer *server)
224
 
{
225
 
        GdmSignalHandler *signal_handler;
226
 
 
227
 
        signal_handler = gdm_signal_handler_new ();
228
 
        gdm_signal_handler_remove_func (signal_handler,
229
 
                                        SIGUSR1,
230
 
                                        (GdmSignalHandlerFunc)signal_cb,
231
 
                                        server);
232
 
        g_object_unref (signal_handler);
233
 
}
234
 
 
235
200
/* We keep a connection (parent_dsp) open with the parent X server
236
201
 * before running a proxy on it to prevent the X server resetting
237
202
 * as we open and close other connections.
690
655
}
691
656
 
692
657
static gboolean
693
 
gdm_server_spawn (GdmServer  *server,
694
 
                  const char *vtarg)
 
658
gdm_server_spawn (GdmServer    *server,
 
659
                  const char   *vtarg,
 
660
                  GError      **error)
695
661
{
696
662
        int              argc;
697
663
        gchar          **argv = NULL;
698
 
        GError          *error;
699
 
        GPtrArray       *env;
700
 
        gboolean         ret;
 
664
        GPtrArray       *env = NULL;
 
665
        gboolean         ret = FALSE;
701
666
        char            *freeme;
702
667
 
703
 
        ret = FALSE;
704
 
 
705
668
        /* Figure out the server command */
706
669
        argv = NULL;
707
670
        argc = 0;
715
678
        }
716
679
 
717
680
        if (argv[0] == NULL) {
718
 
                g_warning (_("%s: Empty server command for display %s"),
719
 
                           "gdm_server_spawn",
720
 
                           server->priv->display_name);
 
681
                g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
 
682
                             _("%s: Empty server command for display %s"),
 
683
                             "gdm_server_spawn",
 
684
                             server->priv->display_name);
721
685
                goto out;
722
686
        }
723
687
 
727
691
        g_debug ("GdmServer: Starting X server process: %s", freeme);
728
692
        g_free (freeme);
729
693
 
730
 
        error = NULL;
731
 
        ret = g_spawn_async_with_pipes (NULL,
732
 
                                        argv,
733
 
                                        (char **)env->pdata,
734
 
                                        G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,
735
 
                                        (GSpawnChildSetupFunc)server_child_setup,
736
 
                                        server,
737
 
                                        &server->priv->pid,
738
 
                                        NULL,
739
 
                                        NULL,
740
 
                                        NULL,
741
 
                                        &error);
742
 
 
743
 
        if (! ret) {
744
 
                g_warning ("Could not start command '%s': %s",
745
 
                           server->priv->command,
746
 
                           error->message);
747
 
                g_error_free (error);
748
 
        }
749
 
 
 
694
        if (!g_spawn_async_with_pipes (NULL,
 
695
                                       argv,
 
696
                                       (char **)env->pdata,
 
697
                                       G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,
 
698
                                       (GSpawnChildSetupFunc)server_child_setup,
 
699
                                       server,
 
700
                                       &server->priv->pid,
 
701
                                       NULL,
 
702
                                       NULL,
 
703
                                       NULL,
 
704
                                       error))
 
705
                goto out;
 
706
 
 
707
        g_debug ("GdmServer: Started X server process %d - waiting for READY", (int)server->priv->pid);
 
708
 
 
709
        server->priv->child_watch_id = g_child_watch_add (server->priv->pid,
 
710
                                                          (GChildWatchFunc)server_child_watch,
 
711
                                                          server);
 
712
 
 
713
        ret = TRUE;
 
714
 out:
750
715
        g_strfreev (argv);
751
 
        g_ptr_array_foreach (env, (GFunc)g_free, NULL);
752
 
        g_ptr_array_free (env, TRUE);
753
 
 
754
 
        if (ret) {
755
 
                g_debug ("GdmServer: Started X server process %d - waiting for READY", (int)server->priv->pid);
756
 
 
757
 
                server->priv->child_watch_id = g_child_watch_add (server->priv->pid,
758
 
                                                                  (GChildWatchFunc)server_child_watch,
759
 
                                                                  server);
 
716
        if (env) {
 
717
                g_ptr_array_foreach (env, (GFunc)g_free, NULL);
 
718
                g_ptr_array_free (env, TRUE);
760
719
        }
761
 
 
762
 
out:
763
720
        return ret;
764
721
}
765
722
 
773
730
gboolean
774
731
gdm_server_start (GdmServer *server)
775
732
{
776
 
        gboolean res;
 
733
        gboolean res = FALSE;
777
734
        const char *vtarg = NULL;
 
735
        GError *local_error = NULL;
 
736
        GError **error = &local_error;
778
737
 
779
738
        /* Hardcode the VT for the initial X server, but nothing else */
780
739
        if (server->priv->is_initial) {
791
750
        }
792
751
 
793
752
        /* fork X server process */
794
 
        res = gdm_server_spawn (server, vtarg);
 
753
        if (!gdm_server_spawn (server, vtarg, error)) {
 
754
                goto out;
 
755
        }
795
756
 
 
757
        res = TRUE;
 
758
 out:
 
759
        if (local_error) {
 
760
                g_printerr ("%s\n", local_error->message);
 
761
                g_clear_error (&local_error);
 
762
        }
796
763
        return res;
797
764
}
798
765
 
1075
1042
 
1076
1043
        server->priv->log_dir = g_strdup (LOGDIR);
1077
1044
 
1078
 
        add_ready_handler (server);
 
1045
        server->priv->sigusr1_id = g_unix_signal_add (SIGUSR1,
 
1046
                                                      on_sigusr1,
 
1047
                                                      server);
1079
1048
}
1080
1049
 
1081
1050
static void
1090
1059
 
1091
1060
        g_return_if_fail (server->priv != NULL);
1092
1061
 
1093
 
        remove_ready_handler (server);
 
1062
        if (server->priv->sigusr1_id > 0)
 
1063
                g_source_remove (server->priv->sigusr1_id);
1094
1064
 
1095
1065
        gdm_server_stop (server);
1096
1066