~robert-ancell/lightdm/private-mir-connection-merge

« back to all changes in this revision

Viewing changes to tests/src/X.c

  • Committer: Robert Ancell
  • Date: 2013-07-23 02:24:45 UTC
  • mfrom: (1723 trunk)
  • mto: This revision was merged to the branch mainline in revision 1741.
  • Revision ID: robert.ancell@canonical.com-20130723022445-gpaq8vtkp4hods7r
Merge with trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
3
3
#include <string.h>
4
4
#include <sys/types.h>
5
5
#include <unistd.h>
6
 
#include <signal.h>
7
6
#include <sys/stat.h>
8
7
#include <fcntl.h>
9
8
#include <errno.h>
 
9
#include <glib-unix.h>
10
10
 
11
11
#include "status.h"
12
12
#include "x-server.h"
58
58
    g_main_loop_quit (loop);
59
59
}
60
60
 
61
 
static void
62
 
indicate_ready (void)
63
 
{
64
 
    void *handler;  
65
 
    handler = signal (SIGUSR1, SIG_IGN);
66
 
    if (handler == SIG_IGN)
67
 
    {
68
 
        status_notify ("XSERVER-%d INDICATE-READY", display_number);
69
 
        kill (getppid (), SIGUSR1);
70
 
    }
71
 
    signal (SIGUSR1, handler);
72
 
}
73
 
 
74
 
static void
75
 
signal_cb (int signum)
76
 
{
77
 
    if (signum == SIGHUP)
78
 
    {
79
 
        status_notify ("XSERVER-%d DISCONNECT-CLIENTS", display_number);
80
 
        indicate_ready ();
81
 
    }
82
 
    else
83
 
    {
84
 
        status_notify ("XSERVER-%d TERMINATE SIGNAL=%d", display_number, signum);
85
 
        quit (EXIT_SUCCESS);
86
 
    }
 
61
static gboolean
 
62
sighup_cb (gpointer user_data)
 
63
{
 
64
    status_notify ("XSERVER-%d DISCONNECT-CLIENTS", display_number);
 
65
    return TRUE;
 
66
}
 
67
 
 
68
static gboolean
 
69
sigint_cb (gpointer user_data)
 
70
{
 
71
    status_notify ("XSERVER-%d TERMINATE SIGNAL=%d", display_number, SIGINT);
 
72
    quit (EXIT_SUCCESS);
 
73
    return TRUE;
 
74
}
 
75
 
 
76
static gboolean
 
77
sigterm_cb (gpointer user_data)
 
78
{
 
79
    status_notify ("XSERVER-%d TERMINATE SIGNAL=%d", display_number, SIGTERM);
 
80
    quit (EXIT_SUCCESS);
 
81
    return TRUE;
87
82
}
88
83
 
89
84
static void
166
161
client_disconnected_cb (XServer *server, XClient *client)
167
162
{  
168
163
    g_signal_handlers_disconnect_matched (client, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, NULL);  
169
 
    if (x_server_get_n_clients (server) == 0)
170
 
        indicate_ready ();
171
164
}
172
165
 
173
166
static void
188
181
        kill (getpid (), SIGSEGV);
189
182
    }
190
183
    g_free (r);
 
184
    r = g_strdup_printf ("XSERVER-%d INDICATE-READY", display_number);
 
185
    if (strcmp (request, r) == 0)
 
186
    {
 
187
        void *handler;
 
188
 
 
189
        handler = signal (SIGUSR1, SIG_IGN);
 
190
        if (handler == SIG_IGN)
 
191
        {
 
192
            status_notify ("XSERVER-%d INDICATE-READY", display_number);
 
193
            kill (getppid (), SIGUSR1);
 
194
        }
 
195
        signal (SIGUSR1, handler);
 
196
    }
 
197
    g_free (r);
 
198
    r = g_strdup_printf ("XSERVER-%d START-XDMCP", display_number);
 
199
    if (strcmp (request, r) == 0)
 
200
    {
 
201
        if (!xdmcp_client_start (xdmcp_client))
 
202
            quit (EXIT_FAILURE);
 
203
    }
 
204
    g_free (r);
191
205
}
192
206
 
193
207
int
203
217
    int lock_file;
204
218
    GString *status_text;
205
219
 
206
 
    signal (SIGINT, signal_cb);
207
 
    signal (SIGTERM, signal_cb);
208
 
    signal (SIGHUP, signal_cb);
209
 
 
210
220
#if !defined(GLIB_VERSION_2_36)
211
221
    g_type_init ();
212
222
#endif
213
223
 
214
224
    loop = g_main_loop_new (NULL, FALSE);
215
225
 
 
226
    g_unix_signal_add (SIGINT, sigint_cb, NULL);
 
227
    g_unix_signal_add (SIGTERM, sigterm_cb, NULL);
 
228
    g_unix_signal_add (SIGHUP, sighup_cb, NULL);
 
229
 
216
230
    status_connect (request_cb);
217
231
 
218
232
    for (i = 1; i < argc; i++)
397
411
        g_signal_connect (xdmcp_client, "accept", G_CALLBACK (xdmcp_accept_cb), NULL);
398
412
        g_signal_connect (xdmcp_client, "decline", G_CALLBACK (xdmcp_decline_cb), NULL);
399
413
        g_signal_connect (xdmcp_client, "failed", G_CALLBACK (xdmcp_failed_cb), NULL);
400
 
 
401
 
        if (!xdmcp_client_start (xdmcp_client))
402
 
            quit (EXIT_FAILURE);
403
414
    }
404
415
 
405
 
    /* Indicate ready if parent process has requested it */
406
 
    indicate_ready ();
407
 
 
408
416
    g_main_loop_run (loop);
409
417
 
410
418
    cleanup ();