~darkxst/ubuntu/saucy/gdm/lp1212408

« back to all changes in this revision

Viewing changes to gui/gdmchooser.c

  • Committer: Bazaar Package Importer
  • Author(s): Josselin Mouette
  • Date: 2008-09-02 10:37:20 UTC
  • mfrom: (1.4.27 upstream)
  • mto: This revision was merged to the branch mainline in revision 261.
  • Revision ID: james.westby@ubuntu.com-20080902103720-p810vv530hqj45wg
Tags: 2.20.7-3
* Install the debian-moreblue-orbit theme, thanks Andre Luiz Rodrigues 
  Ferreira. Closes: #497440.
* 35_gdm.conf.patch: make it the default.
* copyright: fix encoding.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* GDM - The GNOME Display Manager
 
1
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
 
2
 *
 
3
 * GDM - The GNOME Display Manager
2
4
 * Copyright (C) 1998, 1999, 2000 Martin K, Petersen <mkp@mkp.net>
3
5
 *
4
6
 * This program is free software; you can redistribute it and/or modify
27
29
#include <dirent.h>
28
30
#include <string.h>
29
31
#include <unistd.h>
30
 
#include <syslog.h>
31
32
#include <ctype.h>
32
33
#include <fcntl.h>
33
34
#include <signal.h>
57
58
#include "gdmcommon.h"
58
59
#include "gdmconfig.h"
59
60
 
60
 
#include "viciousui.h"
 
61
#include "gdm-common.h"
 
62
#include "gdm-daemon-config-keys.h"
61
63
 
62
64
static gboolean RUNNING_UNDER_GDM = FALSE;
63
65
 
69
71
 
70
72
typedef struct _GdmChooserHost GdmChooserHost;
71
73
struct _GdmChooserHost {
72
 
    gchar *name;
73
 
    gchar *desc;
 
74
        gchar *name;
 
75
        gchar *desc;
74
76
#ifdef ENABLE_IPV6
75
 
    struct in6_addr ia6;
 
77
        struct in6_addr ia6;
76
78
#endif
77
 
    struct in_addr ia;
78
 
    gint addrtype;    /* Address stored is IPv4 or IPv6 */
79
 
    GdkPixbuf *picture;
80
 
    gboolean willing;
 
79
        struct in_addr ia;
 
80
        gint addrtype;    /* Address stored is IPv4 or IPv6 */
 
81
        GdkPixbuf *picture;
 
82
        gboolean willing;
81
83
};
82
84
 
83
85
 
91
93
static gint connection_type = 0;
92
94
 
93
95
/* Exported for glade */
94
 
void gdm_chooser_cancel (/*void*/);
95
96
void gdm_chooser_add_host (void);
96
97
void gdm_chooser_add_entry_changed (void);
 
98
void gdm_chooser_cancel (int sig);
97
99
void gdm_chooser_manage (GtkButton *button, gpointer data);
98
100
void gdm_chooser_browser_select (GtkWidget *widget,
99
101
                                 gint selected,
108
110
static guint add_check_handler = 0;
109
111
 
110
112
/* if this is received, select that host automatically */
111
 
#ifdef ENABLE_IPV6 
 
113
#ifdef ENABLE_IPV6
112
114
static struct in6_addr *added6_addr = NULL;
113
115
#endif
114
116
static struct in_addr *added_addr = NULL;
130
132
 
131
133
 
132
134
typedef struct _XdmAuth {
133
 
    ARRAY8  authentication;
134
 
    ARRAY8  authorization;
 
135
        ARRAY8  authentication;
 
136
        ARRAY8  authorization;
135
137
} XdmAuthRec, *XdmAuthPtr;
136
138
 
137
139
static XdmAuthRec authlist = { 
138
 
    { (CARD16)  0, (CARD8 *) 0 },
139
 
    { (CARD16)  0, (CARD8 *) 0 }
 
140
        { (CARD16)  0, (CARD8 *) 0 },
 
141
        { (CARD16)  0, (CARD8 *) 0 }
140
142
};
141
143
 
142
144
 
184
186
static void
185
187
gdm_chooser_host_dispose (GdmChooserHost *host)
186
188
{
187
 
    if (!host)
188
 
        return;
189
 
 
190
 
    if (host->picture != NULL)
191
 
            g_object_unref (G_OBJECT (host->picture));
192
 
    host->picture = NULL;
193
 
 
194
 
    g_free (host->name);
195
 
    host->name = NULL;
196
 
    g_free (host->desc);
197
 
    host->desc = NULL;
198
 
    g_free (host);
 
189
        if (!host)
 
190
                return;
 
191
 
 
192
        if (host->picture != NULL)
 
193
                g_object_unref (G_OBJECT (host->picture));
 
194
        host->picture = NULL;
 
195
 
 
196
        g_free (host->name);
 
197
        host->name = NULL;
 
198
        g_free (host->desc);
 
199
        host->desc = NULL;
 
200
        g_free (host);
199
201
}
200
202
 
201
 
static GdmChooserHost * 
 
203
static GdmChooserHost *
202
204
gdm_chooser_host_alloc (const char *hostname,
203
205
                        const char *description,
204
206
                        char *ia,
205
207
                        int family,
206
208
                        gboolean willing)
207
209
{
208
 
    GdmChooserHost *host;
209
 
    GdkPixbuf *img;
210
 
    gchar *hostimg;
211
 
    gchar *hostimgdir;
212
 
 
213
 
    host = g_new0 (GdmChooserHost, 1);
214
 
    host->name = g_strdup (hostname);
215
 
    host->desc = g_strdup (description);
216
 
    host->willing = willing;
 
210
        GdmChooserHost *host;
 
211
        GdkPixbuf *img;
 
212
        gchar *hostimg;
 
213
        gchar *hostimgdir;
 
214
 
 
215
        host = g_new0 (GdmChooserHost, 1);
 
216
        host->name = g_strdup (hostname);
 
217
        host->desc = g_strdup (description);
 
218
        host->willing = willing;
 
219
 
217
220
#ifdef ENABLE_IPV6
218
 
    if (family == AF_INET6)
219
 
            memcpy (&host->ia6, (struct in6_addr *)ia, sizeof (struct in6_addr));
220
 
    else
 
221
        if (family == AF_INET6)
 
222
                memcpy (&host->ia6, (struct in6_addr *)ia, sizeof (struct in6_addr));
 
223
        else
221
224
#endif
222
 
            memcpy (&host->ia, (struct in_addr *)ia, sizeof (struct in_addr));
223
 
 
224
 
    host->addrtype = family;
225
 
    chooser_hosts = g_list_prepend (chooser_hosts, host);
226
 
    
227
 
    if ( ! willing)
228
 
            return host;
229
 
 
230
 
    hostimgdir = gdm_config_get_string (GDM_KEY_HOST_IMAGE_DIR); 
231
 
    hostimg    = g_strconcat (hostimgdir, "/", hostname, NULL);
232
 
    if (g_access (hostimg, R_OK) != 0) {
233
 
            g_free (hostimg);
234
 
            hostimg = g_strconcat (hostimgdir, "/", hostname, ".png", NULL);
235
 
    }
236
 
 
237
 
    if (g_access (hostimg, R_OK) == 0 &&
238
 
        (img = gdk_pixbuf_new_from_file (hostimg, NULL)) != NULL) {
239
 
        gint w, h, maxw, maxh;
240
 
 
241
 
        w = gdk_pixbuf_get_width (img);
242
 
        h = gdk_pixbuf_get_height (img);
243
 
        
244
 
        maxw = gdm_config_get_int (GDM_KEY_MAX_ICON_WIDTH);
245
 
        maxh = gdm_config_get_int (GDM_KEY_MAX_ICON_HEIGHT);
246
 
 
247
 
        if (w > h && w > maxw) {
248
 
            h = h * ((gfloat) maxw / w);
249
 
            w = maxw;
250
 
        } else if (h > maxh) {
251
 
            w = w * ((gfloat) maxh / h);
252
 
            h = maxh;
253
 
        }
254
 
 
255
 
 
256
 
        if (w != gdk_pixbuf_get_width (img) ||
257
 
            h != gdk_pixbuf_get_height (img))
258
 
                host->picture = gdk_pixbuf_scale_simple (img, w, h,
259
 
                                                         GDK_INTERP_BILINEAR);
260
 
        else
261
 
                host->picture = g_object_ref (G_OBJECT (img));
262
 
        
263
 
        g_object_unref (G_OBJECT (img));
264
 
    } else if (defhostimg != NULL) {
265
 
            host->picture = (GdkPixbuf *)g_object_ref (G_OBJECT (defhostimg));
266
 
    }
267
 
 
268
 
    g_free (hostimg);
269
 
 
270
 
    return host;
 
225
                memcpy (&host->ia, (struct in_addr *)ia, sizeof (struct in_addr));
 
226
 
 
227
        host->addrtype = family;
 
228
        chooser_hosts = g_list_prepend (chooser_hosts, host);
 
229
 
 
230
        if ( ! willing)
 
231
                return host;
 
232
 
 
233
        hostimgdir = gdm_config_get_string (GDM_KEY_HOST_IMAGE_DIR); 
 
234
        hostimg    = g_strconcat (hostimgdir, "/", hostname, NULL);
 
235
        if (g_access (hostimg, R_OK) != 0) {
 
236
                g_free (hostimg);
 
237
                hostimg = g_strconcat (hostimgdir, "/", hostname, ".png", NULL);
 
238
        }
 
239
 
 
240
        if (g_access (hostimg, R_OK) == 0 &&
 
241
            (img = gdk_pixbuf_new_from_file (hostimg, NULL)) != NULL) {
 
242
                gint w, h, maxw, maxh;
 
243
 
 
244
                w = gdk_pixbuf_get_width (img);
 
245
                h = gdk_pixbuf_get_height (img);
 
246
 
 
247
                maxw = gdm_config_get_int (GDM_KEY_MAX_ICON_WIDTH);
 
248
                maxh = gdm_config_get_int (GDM_KEY_MAX_ICON_HEIGHT);
 
249
 
 
250
                if (w > h && w > maxw) {
 
251
                        h = h * ((gfloat) maxw / w);
 
252
                        w = maxw;
 
253
                } else if (h > maxh) {
 
254
                        w = w * ((gfloat) maxh / h);
 
255
                        h = maxh;
 
256
                }
 
257
 
 
258
 
 
259
                if (w != gdk_pixbuf_get_width (img) ||
 
260
                    h != gdk_pixbuf_get_height (img))
 
261
                        host->picture = gdk_pixbuf_scale_simple (img, w, h,
 
262
                                                                 GDK_INTERP_BILINEAR);
 
263
                else
 
264
                        host->picture = g_object_ref (G_OBJECT (img));
 
265
        
 
266
                g_object_unref (G_OBJECT (img));
 
267
        } else if (defhostimg != NULL) {
 
268
                host->picture = (GdkPixbuf *)g_object_ref (G_OBJECT (defhostimg));
 
269
        }
 
270
 
 
271
        g_free (hostimg);
 
272
 
 
273
        return host;
271
274
}
272
275
 
273
276
static void
274
277
gdm_chooser_browser_add_host (GdmChooserHost *host)
275
278
{
276
 
    gboolean add_this_host = FALSE;
 
279
        gboolean add_this_host = FALSE;
277
280
 
278
 
    if (host->willing) {
279
 
            GtkTreeIter iter = {0};
280
 
            const char *addr;
281
 
            char *label;
282
 
            char *name, *desc;
 
281
        if (host->willing) {
 
282
                GtkTreeIter iter = {0};
 
283
                const char *addr;
 
284
                char *label;
 
285
                char *name, *desc;
283
286
#ifdef ENABLE_IPV6
284
 
            if (host->addrtype == AF_INET6) {   /* IPv6 address */
285
 
                static char buffer6[INET6_ADDRSTRLEN];
 
287
                if (host->addrtype == AF_INET6) {   /* IPv6 address */
 
288
                        static char buffer6[INET6_ADDRSTRLEN];
286
289
 
287
 
                addr = inet_ntop (AF_INET6, host->ia6.s6_addr, buffer6, INET6_ADDRSTRLEN);
288
 
            }
289
 
            else /* IPv4 address */
 
290
                        addr = inet_ntop (AF_INET6, host->ia6.s6_addr, buffer6, INET6_ADDRSTRLEN);
 
291
                }
 
292
                else /* IPv4 address */
290
293
#endif
291
 
            {
292
 
                addr = inet_ntoa (host->ia);
293
 
            }
294
 
 
295
 
            name = g_markup_escape_text (host->name, -1);
296
 
            desc = g_markup_escape_text (host->desc, -1);
297
 
 
298
 
            if (strcmp (addr, host->name) == 0)
299
 
                    label = g_strdup_printf ("<b>%s</b>\n%s",
300
 
                                             name,
301
 
                                             desc);
302
 
            else
303
 
                    label = g_strdup_printf ("<b>%s</b> (%s)\n%s",
304
 
                                             name,
305
 
                                             addr,
306
 
                                             desc);
307
 
 
308
 
            g_free (name);
309
 
            g_free (desc);
310
 
 
311
 
            gtk_list_store_append (GTK_LIST_STORE (browser_model), &iter);
312
 
            gtk_list_store_set (GTK_LIST_STORE (browser_model), &iter,
313
 
                                CHOOSER_LIST_ICON_COLUMN, host->picture,
314
 
                                CHOOSER_LIST_LABEL_COLUMN, label,
315
 
                                CHOOSER_LIST_HOST_COLUMN, host,
316
 
                                -1);
317
 
            g_free (label);
 
294
                        {
 
295
                                addr = inet_ntoa (host->ia);
 
296
                        }
 
297
 
 
298
                name = g_markup_escape_text (host->name, -1);
 
299
                desc = g_markup_escape_text (host->desc, -1);
 
300
 
 
301
                if (strcmp (addr, host->name) == 0)
 
302
                        label = g_strdup_printf ("<b>%s</b>\n%s",
 
303
                                                 name,
 
304
                                                 desc);
 
305
                else
 
306
                        label = g_strdup_printf ("<b>%s</b> (%s)\n%s",
 
307
                                                 name,
 
308
                                                 addr,
 
309
                                                 desc);
 
310
 
 
311
                g_free (name);
 
312
                g_free (desc);
 
313
 
 
314
                gtk_list_store_append (GTK_LIST_STORE (browser_model), &iter);
 
315
                gtk_list_store_set (GTK_LIST_STORE (browser_model), &iter,
 
316
                                    CHOOSER_LIST_ICON_COLUMN, host->picture,
 
317
                                    CHOOSER_LIST_LABEL_COLUMN, label,
 
318
                                    CHOOSER_LIST_HOST_COLUMN, host,
 
319
                                    -1);
 
320
                g_free (label);
318
321
 
319
322
#ifdef ENABLE_IPV6
320
 
            if (added6_addr != NULL && memcmp (&host->ia6, added6_addr,
321
 
                                   sizeof (struct in6_addr)) == 0) {
322
 
                added6_addr = NULL;
323
 
                add_this_host = TRUE;
324
 
            }
 
323
                if (added6_addr != NULL && memcmp (&host->ia6, added6_addr,
 
324
                                                   sizeof (struct in6_addr)) == 0) {
 
325
                        added6_addr = NULL;
 
326
                        add_this_host = TRUE;
 
327
                }
325
328
#else
326
 
            if (added_addr != NULL &&
327
 
                memcmp (&host->ia, added_addr,
328
 
                        sizeof (struct in_addr)) == 0) {
329
 
                added_addr = NULL;
330
 
                add_this_host = TRUE;
331
 
            }
 
329
                if (added_addr != NULL &&
 
330
                    memcmp (&host->ia, added_addr,
 
331
                            sizeof (struct in_addr)) == 0) {
 
332
                        added_addr = NULL;
 
333
                        add_this_host = TRUE;
 
334
                }
332
335
#endif
333
 
            if (add_this_host) {
334
 
                    GtkTreeSelection *selection;
335
 
                    GtkTreePath *path = gtk_tree_model_get_path (browser_model, &iter);
336
 
                    selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (browser));
337
 
                    gtk_tree_selection_select_iter (selection, &iter);
338
 
                    gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (browser),
339
 
                                                  path, NULL,
340
 
                                                  FALSE, 0.0, 0.0);
341
 
                    gtk_tree_path_free (path);
342
 
                    gtk_widget_grab_focus (manage);
343
 
            }
344
 
            g_free (added_host);
345
 
            added_host = NULL;
346
 
            if (add_check_handler > 0)
347
 
                    g_source_remove (add_check_handler);
348
 
            add_check_handler = 0;
349
 
    }
 
336
                if (add_this_host) {
 
337
                        GtkTreeSelection *selection;
 
338
                        GtkTreePath *path = gtk_tree_model_get_path (browser_model, &iter);
 
339
                        selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (browser));
 
340
                        gtk_tree_selection_select_iter (selection, &iter);
 
341
                        gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (browser),
 
342
                                                      path, NULL,
 
343
                                                      FALSE, 0.0, 0.0);
 
344
                        gtk_tree_path_free (path);
 
345
                        gtk_widget_grab_focus (manage);
 
346
                }
 
347
                g_free (added_host);
 
348
                added_host = NULL;
 
349
                if (add_check_handler > 0)
 
350
                        g_source_remove (add_check_handler);
 
351
                add_check_handler = 0;
 
352
        }
350
353
 
351
 
    gtk_widget_set_sensitive (GTK_WIDGET (browser), TRUE);
 
354
        gtk_widget_set_sensitive (GTK_WIDGET (browser), TRUE);
352
355
}
353
356
 
354
357
static GdmChooserHost *
367
370
                }
368
371
                else
369
372
#endif
370
 
                if (family == AF_INET) {
371
 
                        if (host->addrtype != AF_INET)
372
 
                                continue;
373
 
                        if ( ! memcmp (&host->ia, (struct in_addr *)ia, sizeof (struct in_addr)))
374
 
                                return host;
375
 
                }
 
373
                        if (family == AF_INET) {
 
374
                                if (host->addrtype != AF_INET)
 
375
                                        continue;
 
376
                                if ( ! memcmp (&host->ia, (struct in_addr *)ia, sizeof (struct in_addr)))
 
377
                                        return host;
 
378
                        }
376
379
        }
377
380
        return NULL;
378
381
}
384
387
 
385
388
#ifdef ENABLE_IPV6
386
389
        if (family == AF_INET6 && IN6_IS_ADDR_LOOPBACK ((struct in6_addr *)ia)) {
387
 
            return TRUE;
 
390
                return TRUE;
388
391
        } else
389
392
#endif
390
 
        if (((family == AF_INET) && (((struct in_addr *) ia)->s_addr == INADDR_LOOPBACK)) || memcmp (&((struct in_addr *)ia)->s_addr, lo, 4) == 0) {
391
 
            return TRUE;
392
 
        }
393
 
        else {
394
 
            return FALSE;
395
 
        }
 
393
                if (((family == AF_INET) && (((struct in_addr *) ia)->s_addr == INADDR_LOOPBACK)) || memcmp (&((struct in_addr *)ia)->s_addr, lo, 4) == 0) {
 
394
                        return TRUE;
 
395
                }
 
396
                else {
 
397
                        return FALSE;
 
398
                }
396
399
}
397
400
 
398
401
static gboolean
427
430
        return FALSE;
428
431
}
429
432
 
 
433
static GtkWidget *
 
434
hig_dialog_new (GtkWindow      *parent,
 
435
                GtkDialogFlags flags,
 
436
                GtkMessageType type,
 
437
                GtkButtonsType buttons,
 
438
                const gchar    *primary_message,
 
439
                const gchar    *secondary_message)
 
440
{
 
441
        GtkWidget *dialog;
 
442
 
 
443
        dialog = gtk_message_dialog_new (GTK_WINDOW (parent),
 
444
                                         GTK_DIALOG_DESTROY_WITH_PARENT,
 
445
                                         type,
 
446
                                         buttons,
 
447
                                         "%s", primary_message);
 
448
 
 
449
        gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
 
450
                                                  "%s", secondary_message);
 
451
 
 
452
        gtk_window_set_title (GTK_WINDOW (dialog), "");
 
453
        gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
 
454
        gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 14);
 
455
 
 
456
        return dialog;
 
457
}
 
458
 
430
459
static gboolean
431
460
gdm_chooser_decode_packet (GIOChannel   *source,
432
461
                           GIOCondition  condition,
433
462
                           gpointer      data)
434
463
{
435
464
#ifdef ENABLE_IPV6
436
 
    char hbuf[NI_MAXHOST];
437
 
    struct sockaddr_in6 clnt6_sa;
438
 
#endif
439
 
    struct sockaddr_in clnt_sa;
440
 
    gint sa_len;
441
 
    static XdmcpBuffer buf;
442
 
    XdmcpHeader header;
443
 
    struct hostent *he;
444
 
    gchar *hostname = NULL;
445
 
    gchar *status = NULL;
446
 
    ARRAY8 auth = {0}, host = {0}, stat = {0};
447
 
    GdmChooserHost *gh;
448
 
    int pipe_buf;
449
 
    gboolean host_not_willing = FALSE;
450
 
 
451
 
    if ( ! (condition & G_IO_IN)) 
452
 
        return TRUE;
 
465
        char hbuf[NI_MAXHOST];
 
466
        struct sockaddr_in6 clnt6_sa;
 
467
#endif
 
468
        struct sockaddr_in clnt_sa;
 
469
        gint sa_len;
 
470
        static XdmcpBuffer buf;
 
471
        XdmcpHeader header;
 
472
        struct hostent *he;
 
473
        gchar *hostname = NULL;
 
474
        gchar *status = NULL;
 
475
        ARRAY8 auth = {0}, host = {0}, stat = {0};
 
476
        GdmChooserHost *gh;
 
477
        int pipe_buf;
 
478
        gboolean host_not_willing = FALSE;
 
479
 
 
480
#ifdef PIPE_BUF
 
481
        pipe_buf = PIPE_BUF;
 
482
#else
 
483
        /* apparently Hurd doesn't have PIPE_BUF */
 
484
        pipe_buf = fpathconf (1 /*stdout*/, _PC_PIPE_BUF);
 
485
        /* could return -1 if no limit */
 
486
#endif
 
487
 
 
488
        if ( ! (condition & G_IO_IN)) 
 
489
                return TRUE;
453
490
 
454
491
#ifdef ENABLE_IPV6
455
 
    if (have_ipv6) {
456
 
            sa_len = sizeof (struct sockaddr_in6);
457
 
            if (! XdmcpFill (sockfd, &buf, (XdmcpNetaddr) &clnt6_sa, &sa_len))
458
 
                    return TRUE;
459
 
    } else
 
492
        if (have_ipv6) {
 
493
                sa_len = sizeof (struct sockaddr_in6);
 
494
                if (! XdmcpFill (sockfd, &buf, (XdmcpNetaddr) &clnt6_sa, &sa_len))
 
495
                        return TRUE;
 
496
        } else
460
497
#endif
461
 
    {
462
 
            sa_len = sizeof (struct sockaddr_in);
463
 
            if (! XdmcpFill (sockfd, &buf, (XdmcpNetaddr) &clnt_sa, &sa_len))
464
 
                    return TRUE;
465
 
    }
 
498
                {
 
499
                        sa_len = sizeof (struct sockaddr_in);
 
500
                        if (! XdmcpFill (sockfd, &buf, (XdmcpNetaddr) &clnt_sa, &sa_len))
 
501
                                return TRUE;
 
502
                }
466
503
 
467
 
    if (! XdmcpReadHeader (&buf, &header))
468
 
        return TRUE;
 
504
        if (! XdmcpReadHeader (&buf, &header))
 
505
                return TRUE;
469
506
    
470
 
    if (header.version != XDM_PROTOCOL_VERSION)
471
 
        return TRUE;
472
 
 
473
 
    if (header.opcode == WILLING) {
474
 
            if (! XdmcpReadARRAY8 (&buf, &auth))
475
 
                    goto done;
476
 
 
477
 
            if (! XdmcpReadARRAY8 (&buf, &host))
478
 
                    goto done;
479
 
 
480
 
            if (! XdmcpReadARRAY8 (&buf, &stat))
481
 
                    goto done;
482
 
 
483
 
            status = g_strndup ((char *) stat.data, MIN (stat.length, 256));
484
 
    } else if (header.opcode == UNWILLING) {
485
 
            /* immaterial, will not be shown */
486
 
            status = NULL;
487
 
    } else {
488
 
            return TRUE;
489
 
    }
 
507
        if (header.version != XDM_PROTOCOL_VERSION)
 
508
                return TRUE;
 
509
 
 
510
        if (header.opcode == WILLING) {
 
511
                if (! XdmcpReadARRAY8 (&buf, &auth))
 
512
                        goto done;
 
513
 
 
514
                if (! XdmcpReadARRAY8 (&buf, &host))
 
515
                        goto done;
 
516
 
 
517
                if (! XdmcpReadARRAY8 (&buf, &stat))
 
518
                        goto done;
 
519
 
 
520
                status = g_strndup ((char *) stat.data, MIN (stat.length, 256));
 
521
        } else if (header.opcode == UNWILLING) {
 
522
                /* immaterial, will not be shown */
 
523
                status = NULL;
 
524
        } else {
 
525
                return TRUE;
 
526
        }
490
527
#ifdef ENABLE_IPV6
491
 
    /*Since, IPv4 addresses will get extracted as V4 mapped IPv6 address*/
492
 
 
493
 
    if (have_ipv6 &&
494
 
        IN6_IS_ADDR_V4MAPPED (&(clnt6_sa.sin6_addr))) {
495
 
        memset (&clnt_sa, 0, sizeof (clnt_sa));
496
 
        memcpy (&(clnt_sa.sin_addr), &(clnt6_sa.sin6_addr.s6_addr[12]), 4);
497
 
        clnt_sa.sin_family = AF_INET;
498
 
        clnt_sa.sin_port = clnt6_sa.sin6_port;
499
 
        clnt6_sa.sin6_family = AF_INET;
500
 
    }
501
 
 
502
 
    if (have_ipv6 &&
503
 
        ((struct sockaddr *) &clnt6_sa)->sa_family == AF_INET6) {
504
 
        if ( ! is_loopback_addr ((gchar *) &clnt6_sa.sin6_addr, AF_INET6)) {
505
 
            clnt6_sa.sin6_scope_id = 0;
506
 
        
507
 
            getnameinfo ((struct sockaddr *)&clnt6_sa, sizeof (struct sockaddr_in6), hbuf, sizeof (hbuf), NULL, 0, 0);
508
 
 
509
 
            hostname = hbuf;
510
 
 
511
 
            if (strlen (hostname)+1 > PIPE_BUF)
512
 
                goto done;
513
 
            hostname = g_strdup (hostname);
514
 
 
515
 
        } else {
516
 
            hostname = g_new0 (char, 1024);
517
 
        
518
 
            if (gethostname (hostname, 1023) != 0) {
 
528
        /*Since, IPv4 addresses will get extracted as V4 mapped IPv6 address*/
 
529
 
 
530
        if (have_ipv6 &&
 
531
            IN6_IS_ADDR_V4MAPPED (&(clnt6_sa.sin6_addr))) {
 
532
                memset (&clnt_sa, 0, sizeof (clnt_sa));
 
533
                memcpy (&(clnt_sa.sin_addr), &(clnt6_sa.sin6_addr.s6_addr[12]), 4);
 
534
                clnt_sa.sin_family = AF_INET;
 
535
                clnt_sa.sin_port = clnt6_sa.sin6_port;
 
536
                clnt6_sa.sin6_family = AF_INET;
 
537
        }
 
538
 
 
539
        if (have_ipv6 &&
 
540
            ((struct sockaddr *) &clnt6_sa)->sa_family == AF_INET6) {
 
541
                if ( ! is_loopback_addr ((gchar *) &clnt6_sa.sin6_addr, AF_INET6)) {
 
542
                        clnt6_sa.sin6_scope_id = 0;
 
543
        
 
544
                        getnameinfo ((struct sockaddr *)&clnt6_sa, sizeof (struct sockaddr_in6), hbuf, sizeof (hbuf), NULL, 0, 0);
 
545
 
 
546
                        hostname = hbuf;
 
547
 
 
548
                        if (strlen (hostname) + 1 > pipe_buf)
 
549
                                goto done;
 
550
                        hostname = g_strdup (hostname);
 
551
 
 
552
                } else {
 
553
                        hostname = g_new0 (char, 1024);
 
554
        
 
555
                        if (gethostname (hostname, 1023) != 0) {
 
556
                                g_free (hostname);
 
557
                                goto done;
 
558
                        }
 
559
                        added6_addr = NULL;
 
560
                        gh = gdm_host_known ((char *)&clnt6_sa.sin6_addr, AF_INET6);
 
561
                }
 
562
        } else
 
563
#endif
 
564
                {
 
565
                        if ( !is_loopback_addr ((char *)&clnt_sa.sin_addr, AF_INET)) {
 
566
                                he = gethostbyaddr ((gchar *) &clnt_sa.sin_addr,
 
567
                                                    sizeof (struct in_addr),
 
568
                                                    AF_INET);
 
569
 
 
570
                                hostname = (he && he->h_name) ? he->h_name : inet_ntoa (clnt_sa.sin_addr);
 
571
                                if (strlen (hostname) + 1 > pipe_buf)
 
572
                                        goto done;
 
573
 
 
574
                                hostname = g_strdup (hostname);
 
575
                        } else {
 
576
                                hostname = g_new0 (char, 1024);
 
577
                                if (gethostname (hostname, 1023) != 0) {
 
578
                                        g_free (hostname);
 
579
                                        goto done;
 
580
                                }
 
581
                        }
 
582
                }
 
583
 
 
584
        /* We can't pipe hostnames larger than this */
 
585
        if (pipe_buf > 0 && strlen (hostname)+1 > pipe_buf) {
519
586
                g_free (hostname);
520
587
                goto done;
521
 
            }
522
 
            added6_addr = NULL;
523
 
            gh = gdm_host_known ((char *)&clnt6_sa.sin6_addr, AF_INET6);
524
 
        }
525
 
    } else
526
 
#endif
527
 
    {
528
 
        if ( !is_loopback_addr ((char *)&clnt_sa.sin_addr, AF_INET)) {
529
 
            he = gethostbyaddr ((gchar *) &clnt_sa.sin_addr,
530
 
                                sizeof (struct in_addr),
531
 
                                AF_INET);
532
 
 
533
 
            hostname = (he && he->h_name) ? he->h_name : inet_ntoa (clnt_sa.sin_addr);
534
 
            if (strlen (hostname)+1 > PIPE_BUF)
535
 
                   goto done;
536
 
 
537
 
            hostname = g_strdup (hostname);
538
 
        } else {
539
 
            hostname = g_new0 (char, 1024);
540
 
            if (gethostname (hostname, 1023) != 0) {
541
 
                    g_free (hostname);
542
 
                    goto done;
543
 
            }
544
 
        }
545
 
    }
546
 
 
547
 
#ifdef PIPE_BUF
548
 
    pipe_buf = PIPE_BUF;
549
 
#else
550
 
    /* apparently Hurd doesn't have PIPE_BUF */
551
 
    pipe_buf = fpathconf (1 /*stdout*/, _PC_PIPE_BUF);
552
 
    /* could return -1 if no limit */
553
 
#endif
554
 
 
555
 
    /* We can't pipe hostnames larger than this */
556
 
    if (pipe_buf > 0 && strlen (hostname)+1 > pipe_buf) {
557
 
            g_free (hostname);
558
 
            goto done;
559
 
    }
560
 
 
561
 
#ifdef ENABLE_IPV6
562
 
    if (have_ipv6 && ((struct sockaddr *) &clnt6_sa)->sa_family == AF_INET6) {
563
 
            gh = gdm_host_known ((char *)&clnt6_sa.sin6_addr, AF_INET6);
564
 
            if (gh == NULL) {
565
 
                gh = gdm_chooser_host_alloc (hostname, status, (char *)&clnt6_sa.sin6_addr, AF_INET6, header.opcode == WILLING);
566
 
                gdm_chooser_browser_add_host (gh);
567
 
            }
568
 
    } else
569
 
#endif
570
 
    {
571
 
            gh = gdm_host_known ((char *)&clnt_sa.sin_addr, AF_INET);
572
 
            if (gh == NULL) {
573
 
                gh = gdm_chooser_host_alloc (hostname, status, (char *)&clnt_sa.sin_addr, AF_INET, header.opcode == WILLING);
574
 
                gdm_chooser_browser_add_host (gh);
575
 
            }
576
 
    }
577
 
    if (gh != NULL) {
578
 
      /* server changed it's mind */
579
 
            if (header.opcode == WILLING &&
580
 
                ! gh->willing) {
581
 
                    gh->willing = TRUE;
582
 
                    gdm_chooser_browser_add_host (gh);
583
 
            }
584
 
            /* hmmm what about the other change, just ignore
585
 
               for now, it's kind of confusing to just remove
586
 
               servers really */
587
 
    }
588
 
#ifdef ENABLE_IPV6
589
 
    if (have_ipv6 &&
590
 
        ((struct sockaddr *) &clnt6_sa)->sa_family == AF_INET6 &&
591
 
        ! gh->willing &&
592
 
        added6_addr != NULL &&
593
 
        memcmp (&gh->ia6, added6_addr, sizeof (struct in6_addr)) == 0) {
594
 
 
595
 
            added6_addr = NULL;
596
 
            host_not_willing = TRUE;
597
 
    }
598
 
    else
599
 
#endif
600
 
    if (clnt_sa.sin_family == AF_INET &&
601
 
        ! gh->willing &&
602
 
        added_addr != NULL &&
603
 
        memcmp (&gh->ia, added_addr, sizeof (struct in_addr)) == 0) {
604
 
 
605
 
            added_addr = NULL;
606
 
            host_not_willing = TRUE;
607
 
    }
608
 
 
609
 
    if (host_not_willing) {
610
 
            GtkWidget *dialog;
611
 
            gchar *msg;
612
 
 
613
 
            if (add_check_handler > 0)
614
 
                    g_source_remove (add_check_handler);
615
 
            add_check_handler = 0;
616
 
 
617
 
            msg = g_strdup_printf (_("The host \"%s\" is not willing "
618
 
                                     "to support a login session right now.  "
619
 
                                     "Please try again later."),
620
 
                                   added_host);
621
 
 
622
 
            dialog = ve_hig_dialog_new
623
 
                    (GTK_WINDOW (chooser) /* parent */,
624
 
                     GTK_DIALOG_MODAL /* flags */,
625
 
                     GTK_MESSAGE_ERROR,
626
 
                     GTK_BUTTONS_OK,
627
 
                     _("Cannot connect to remote server"),
628
 
                     msg);
629
 
 
630
 
            g_free (msg);
631
 
 
632
 
            if (RUNNING_UNDER_GDM)
633
 
                    gdm_wm_center_window (GTK_WINDOW (dialog));
634
 
 
635
 
            gdm_wm_no_login_focus_push ();
636
 
            gtk_dialog_run (GTK_DIALOG (dialog));
637
 
            gtk_widget_destroy (dialog);
638
 
            gdm_wm_no_login_focus_pop ();
639
 
 
640
 
            g_free (added_host);
641
 
            added_host = NULL;
642
 
    }
643
 
 
644
 
    g_free (hostname);
 
588
        }
 
589
 
 
590
#ifdef ENABLE_IPV6
 
591
        if (have_ipv6 && ((struct sockaddr *) &clnt6_sa)->sa_family == AF_INET6) {
 
592
                gh = gdm_host_known ((char *)&clnt6_sa.sin6_addr, AF_INET6);
 
593
                if (gh == NULL) {
 
594
                        gh = gdm_chooser_host_alloc (hostname, status, (char *)&clnt6_sa.sin6_addr, AF_INET6, header.opcode == WILLING);
 
595
                        gdm_chooser_browser_add_host (gh);
 
596
                }
 
597
        } else
 
598
#endif
 
599
                {
 
600
                        gh = gdm_host_known ((char *)&clnt_sa.sin_addr, AF_INET);
 
601
                        if (gh == NULL) {
 
602
                                gh = gdm_chooser_host_alloc (hostname, status, (char *)&clnt_sa.sin_addr, AF_INET, header.opcode == WILLING);
 
603
                                gdm_chooser_browser_add_host (gh);
 
604
                        }
 
605
                }
 
606
        if (gh != NULL) {
 
607
                /* server changed it's mind */
 
608
                if (header.opcode == WILLING &&
 
609
                    ! gh->willing) {
 
610
                        gh->willing = TRUE;
 
611
                        gdm_chooser_browser_add_host (gh);
 
612
                }
 
613
                /* hmmm what about the other change, just ignore
 
614
                   for now, it's kind of confusing to just remove
 
615
                   servers really */
 
616
        }
 
617
#ifdef ENABLE_IPV6
 
618
        if (have_ipv6 &&
 
619
            ((struct sockaddr *) &clnt6_sa)->sa_family == AF_INET6 &&
 
620
            ! gh->willing &&
 
621
            added6_addr != NULL &&
 
622
            memcmp (&gh->ia6, added6_addr, sizeof (struct in6_addr)) == 0) {
 
623
 
 
624
                added6_addr = NULL;
 
625
                host_not_willing = TRUE;
 
626
        }
 
627
        else
 
628
#endif
 
629
                if (clnt_sa.sin_family == AF_INET &&
 
630
                    ! gh->willing &&
 
631
                    added_addr != NULL &&
 
632
                    memcmp (&gh->ia, added_addr, sizeof (struct in_addr)) == 0) {
 
633
 
 
634
                        added_addr = NULL;
 
635
                        host_not_willing = TRUE;
 
636
                }
 
637
 
 
638
        if (host_not_willing) {
 
639
                GtkWidget *dialog;
 
640
                gchar *msg;
 
641
 
 
642
                if (add_check_handler > 0)
 
643
                        g_source_remove (add_check_handler);
 
644
                add_check_handler = 0;
 
645
 
 
646
                msg = g_strdup_printf (_("The host \"%s\" is not willing "
 
647
                                         "to support a login session right now.  "
 
648
                                         "Please try again later."),
 
649
                                       added_host);
 
650
 
 
651
                dialog = hig_dialog_new (GTK_WINDOW (chooser) /* parent */,
 
652
                                         GTK_DIALOG_MODAL /* flags */,
 
653
                                         GTK_MESSAGE_ERROR,
 
654
                                         GTK_BUTTONS_OK,
 
655
                                         _("Cannot connect to remote server"),
 
656
                                         msg);
 
657
 
 
658
                g_free (msg);
 
659
 
 
660
                if (RUNNING_UNDER_GDM)
 
661
                        gdm_wm_center_window (GTK_WINDOW (dialog));
 
662
 
 
663
                gdm_wm_no_login_focus_push ();
 
664
                gtk_dialog_run (GTK_DIALOG (dialog));
 
665
                gtk_widget_destroy (dialog);
 
666
                gdm_wm_no_login_focus_pop ();
 
667
 
 
668
                g_free (added_host);
 
669
                added_host = NULL;
 
670
        }
 
671
 
 
672
        g_free (hostname);
645
673
    
646
674
 done:
647
 
    if (header.opcode == WILLING) {
648
 
            XdmcpDisposeARRAY8 (&auth);
649
 
            XdmcpDisposeARRAY8 (&host);
650
 
            XdmcpDisposeARRAY8 (&stat);
651
 
    }
652
 
    
653
 
    g_free (status);
654
 
    
655
 
    return TRUE;
 
675
        if (header.opcode == WILLING) {
 
676
                XdmcpDisposeARRAY8 (&auth);
 
677
                XdmcpDisposeARRAY8 (&host);
 
678
                XdmcpDisposeARRAY8 (&stat);
 
679
        }
 
680
    
 
681
        g_free (status);
 
682
    
 
683
        return TRUE;
656
684
}
657
685
 
658
686
 
750
778
 
751
779
        if (ioctl (sock, SIOCGIFCONF, &ifc) >= 0)
752
780
                ifr = ifc.ifc_req;
753
 
                num = ifc.ifc_len / sizeof (struct ifreq); /* No of interfaces */
754
 
                for (i = 0 ; i < num ; i++) {
755
 
                        struct ifreq ifreq;
756
 
                        int ifindex;
 
781
        num = ifc.ifc_len / sizeof (struct ifreq); /* No of interfaces */
 
782
        for (i = 0 ; i < num ; i++) {
 
783
                struct ifreq ifreq;
 
784
                int ifindex;
757
785
                                                            
758
 
                        memset (&ifreq, 0, sizeof (ifreq));
759
 
                        strncpy (ifreq.ifr_name, ifr[i].ifr_name, sizeof (ifreq.ifr_name));
760
 
                        ifreq.ifr_name[sizeof (ifreq.ifr_name) - 1] = '\0';
 
786
                memset (&ifreq, 0, sizeof (ifreq));
 
787
                strncpy (ifreq.ifr_name, ifr[i].ifr_name, sizeof (ifreq.ifr_name));
 
788
                ifreq.ifr_name[sizeof (ifreq.ifr_name) - 1] = '\0';
761
789
 
762
 
                        if (ioctl (sock, SIOCGIFFLAGS, &ifreq) < 0)
763
 
                                gdm_common_error ("Could not get interface flags for %s\n", ifr[i].ifr_name); 
764
 
                        ifindex = if_nametoindex (ifr[i].ifr_name);
 
790
                if (ioctl (sock, SIOCGIFFLAGS, &ifreq) < 0)
 
791
                        gdm_common_error ("Could not get interface flags for %s\n", ifr[i].ifr_name); 
 
792
                ifindex = if_nametoindex (ifr[i].ifr_name);
765
793
                                                            
766
 
                        if ((!(ifreq.ifr_flags & IFF_UP) || (!(ifreq.ifr_flags & IFF_MULTICAST))) || (ifindex == 0 )) {
 
794
                if ((!(ifreq.ifr_flags & IFF_UP) || (!(ifreq.ifr_flags & IFF_MULTICAST))) || (ifindex == 0 )) {
767
795
                        /* Not a valid interface or Not up */
768
 
                                continue;
769
 
                        }
770
 
 
771
 
                        sin6 = g_new0 (struct sockaddr_in6, 1);
772
 
                        sin6->sin6_family = AF_INET6;
773
 
                        sin6->sin6_port = htons (XDM_UDP_PORT);
774
 
                        sin6->sin6_scope_id = ifindex;
775
 
                        inet_pton (AF_INET6, gdm_config_get_string (GDM_KEY_MULTICAST_ADDR),
776
 
                                &sin6->sin6_addr);
777
 
 
778
 
                        /* bcaddr is also serving for multicast address for IPv6 */
779
 
                        bcaddr = g_slist_append (bcaddr, sin6);
 
796
                        continue;
780
797
                }
 
798
 
 
799
                sin6 = g_new0 (struct sockaddr_in6, 1);
 
800
                sin6->sin6_family = AF_INET6;
 
801
                sin6->sin6_port = htons (XDM_UDP_PORT);
 
802
                sin6->sin6_scope_id = ifindex;
 
803
                inet_pton (AF_INET6, gdm_config_get_string (GDM_KEY_MULTICAST_ADDR),
 
804
                           &sin6->sin6_addr);
 
805
 
 
806
                /* bcaddr is also serving for multicast address for IPv6 */
 
807
                bcaddr = g_slist_append (bcaddr, sin6);
 
808
        }
781
809
}
782
810
#endif
783
811
 
803
831
static void
804
832
do_ping (gboolean full)
805
833
{
806
 
    struct sockaddr_in sock;
807
 
    GSList *bl = bcaddr;
808
 
    GSList *ql = queryaddr;
809
 
    struct sockaddr *ia;
810
 
#ifdef ENABLE_IPV6
811
 
    struct sockaddr_in6 sock6;
812
 
 
813
 
    memset (&sock6, 0, sizeof (sock6));
814
 
    sock6.sin6_family = AF_INET6;
815
 
    sock6.sin6_port = htons (XDM_UDP_PORT);
816
 
#endif
817
 
 
818
 
    sock.sin_family = AF_INET;
819
 
    sock.sin_port = htons (XDM_UDP_PORT);
820
 
 
821
 
    while (bl) {
822
 
            ia = (struct sockaddr *) bl->data;
823
 
#ifdef ENABLE_IPV6
824
 
            if (have_ipv6) {    /* Convert the IPv4 broadcast address to v4 mapped v6 address.*/
825
 
                if (ia->sa_family == AF_INET) {
826
 
                    char tmpaddr[30];
827
 
                    struct in6_addr in6;
828
 
 
829
 
                    sprintf (tmpaddr, "::ffff:%s", inet_ntoa (((struct sockaddr_in *)(ia))->sin_addr));
830
 
                    inet_pton (AF_INET6, tmpaddr, &in6);
831
 
                    memcpy (sock6.sin6_addr.s6_addr, in6.s6_addr, sizeof (struct in6_addr));
832
 
                    XdmcpFlush (sockfd, &bcbuf, (XdmcpNetaddr) &sock6, (int) sizeof (struct sockaddr_in6));
833
 
                }
834
 
 
835
 
                else if (ia->sa_family == AF_INET6) {
836
 
                    memcpy (sock6.sin6_addr.s6_addr, ((struct sockaddr_in6 *)ia)->sin6_addr.s6_addr, sizeof (struct in6_addr));
837
 
                    XdmcpFlush (sockfd, &bcbuf, (XdmcpNetaddr) &sock6, (int) sizeof (struct sockaddr_in6));
838
 
                }
839
 
            }
840
 
            else
841
 
#endif
842
 
            {
843
 
                if (ia->sa_family == AF_INET) {
844
 
                    sock.sin_addr.s_addr = ((struct sockaddr_in *)ia)->sin_addr.s_addr;
845
 
                    XdmcpFlush (sockfd, &bcbuf, (XdmcpNetaddr) &sock, (int)sizeof (struct sockaddr_in));
846
 
                }
847
 
            }
848
 
            bl = bl->next;
849
 
    }
850
 
 
851
 
    while (ql != NULL) {
852
 
            ia = (struct sockaddr *) ql->data;
853
 
 
854
 
#ifdef ENABLE_IPV6
855
 
            if (have_ipv6) {
856
 
                if (ia->sa_family == AF_INET) {
857
 
                    char tmpaddr[30];
858
 
                    struct in6_addr in6;
859
 
 
860
 
                    sprintf (tmpaddr, "::ffff:%s", inet_ntoa (((struct sockaddr_in *)(ia))->sin_addr));
861
 
                    inet_pton (AF_INET6, tmpaddr, &in6);
862
 
 
863
 
                    if (full || ! gdm_host_known ((char *)&((struct sockaddr_in6 *)ia)->sin6_addr, AF_INET6)) {
864
 
                        memcpy (sock6.sin6_addr.s6_addr, in6.s6_addr, sizeof (struct in6_addr));
865
 
                        XdmcpFlush (sockfd, &bcbuf, (XdmcpNetaddr) &sock6, (int) sizeof (struct sockaddr_in6));
866
 
                    }
867
 
                }
868
 
 
869
 
                if (ia->sa_family == AF_INET6) {
870
 
                    if (full || ! gdm_host_known ((char *)&((struct sockaddr_in6 *)ia)->sin6_addr, AF_INET6)) {
871
 
                        memcpy (&sock6.sin6_addr, &((struct sockaddr_in6 *)ia)->sin6_addr, sizeof (struct in6_addr));
872
 
                        XdmcpFlush (sockfd, &querybuf, (XdmcpNetaddr) &sock6, (int) sizeof (struct sockaddr_in6));
873
 
                    }
874
 
                }
875
 
            }
876
 
            else
877
 
#endif
878
 
            {
879
 
                if (full || ! gdm_host_known ((char *)&((struct sockaddr_in *)ia)->sin_addr, AF_INET)) {
880
 
                    sock.sin_addr.s_addr = ((struct sockaddr_in *)ia)->sin_addr.s_addr;
881
 
                    XdmcpFlush (sockfd, &querybuf, (XdmcpNetaddr) &sock, (int)sizeof (struct sockaddr_in));
882
 
                }
883
 
            }
884
 
            ql = ql->next;
885
 
    }
 
834
        struct sockaddr_in sock;
 
835
        GSList *bl = bcaddr;
 
836
        GSList *ql = queryaddr;
 
837
        struct sockaddr *ia;
 
838
#ifdef ENABLE_IPV6
 
839
        struct sockaddr_in6 sock6;
 
840
 
 
841
        memset (&sock6, 0, sizeof (sock6));
 
842
        sock6.sin6_family = AF_INET6;
 
843
        sock6.sin6_port = htons (XDM_UDP_PORT);
 
844
#endif
 
845
 
 
846
        sock.sin_family = AF_INET;
 
847
        sock.sin_port = htons (XDM_UDP_PORT);
 
848
 
 
849
        while (bl) {
 
850
                ia = (struct sockaddr *) bl->data;
 
851
#ifdef ENABLE_IPV6
 
852
                if (have_ipv6) {    /* Convert the IPv4 broadcast address to v4 mapped v6 address.*/
 
853
                        if (ia->sa_family == AF_INET) {
 
854
                                char tmpaddr[30];
 
855
                                struct in6_addr in6;
 
856
 
 
857
                                sprintf (tmpaddr, "::ffff:%s", inet_ntoa (((struct sockaddr_in *)(ia))->sin_addr));
 
858
                                inet_pton (AF_INET6, tmpaddr, &in6);
 
859
                                memcpy (sock6.sin6_addr.s6_addr, in6.s6_addr, sizeof (struct in6_addr));
 
860
                                XdmcpFlush (sockfd, &bcbuf, (XdmcpNetaddr) &sock6, (int) sizeof (struct sockaddr_in6));
 
861
                        }
 
862
 
 
863
                        else if (ia->sa_family == AF_INET6) {
 
864
                                memcpy (sock6.sin6_addr.s6_addr, ((struct sockaddr_in6 *)ia)->sin6_addr.s6_addr, sizeof (struct in6_addr));
 
865
                                XdmcpFlush (sockfd, &bcbuf, (XdmcpNetaddr) &sock6, (int) sizeof (struct sockaddr_in6));
 
866
                        }
 
867
                }
 
868
                else
 
869
#endif
 
870
                        {
 
871
                                if (ia->sa_family == AF_INET) {
 
872
                                        sock.sin_addr.s_addr = ((struct sockaddr_in *)ia)->sin_addr.s_addr;
 
873
                                        XdmcpFlush (sockfd, &bcbuf, (XdmcpNetaddr) &sock, (int)sizeof (struct sockaddr_in));
 
874
                                }
 
875
                        }
 
876
                bl = bl->next;
 
877
        }
 
878
 
 
879
        while (ql != NULL) {
 
880
                ia = (struct sockaddr *) ql->data;
 
881
 
 
882
#ifdef ENABLE_IPV6
 
883
                if (have_ipv6) {
 
884
                        if (ia->sa_family == AF_INET) {
 
885
                                char tmpaddr[30];
 
886
                                struct in6_addr in6;
 
887
 
 
888
                                sprintf (tmpaddr, "::ffff:%s", inet_ntoa (((struct sockaddr_in *)(ia))->sin_addr));
 
889
                                inet_pton (AF_INET6, tmpaddr, &in6);
 
890
 
 
891
                                if (full || ! gdm_host_known ((char *)&((struct sockaddr_in6 *)ia)->sin6_addr, AF_INET6)) {
 
892
                                        memcpy (sock6.sin6_addr.s6_addr, in6.s6_addr, sizeof (struct in6_addr));
 
893
                                        XdmcpFlush (sockfd, &bcbuf, (XdmcpNetaddr) &sock6, (int) sizeof (struct sockaddr_in6));
 
894
                                }
 
895
                        }
 
896
 
 
897
                        if (ia->sa_family == AF_INET6) {
 
898
                                if (full || ! gdm_host_known ((char *)&((struct sockaddr_in6 *)ia)->sin6_addr, AF_INET6)) {
 
899
                                        memcpy (&sock6.sin6_addr, &((struct sockaddr_in6 *)ia)->sin6_addr, sizeof (struct in6_addr));
 
900
                                        XdmcpFlush (sockfd, &querybuf, (XdmcpNetaddr) &sock6, (int) sizeof (struct sockaddr_in6));
 
901
                                }
 
902
                        }
 
903
                }
 
904
                else
 
905
#endif
 
906
                        {
 
907
                                if (full || ! gdm_host_known ((char *)&((struct sockaddr_in *)ia)->sin_addr, AF_INET)) {
 
908
                                        sock.sin_addr.s_addr = ((struct sockaddr_in *)ia)->sin_addr.s_addr;
 
909
                                        XdmcpFlush (sockfd, &querybuf, (XdmcpNetaddr) &sock, (int)sizeof (struct sockaddr_in));
 
910
                                }
 
911
                        }
 
912
                ql = ql->next;
 
913
        }
886
914
}
887
915
 
888
916
static gboolean
900
928
void
901
929
gdm_chooser_xdmcp_discover (void)
902
930
{
903
 
    GList *hl = chooser_hosts;
 
931
        GList *hl = chooser_hosts;
904
932
 
905
 
    g_free (added_host);
906
 
    added_host = NULL;
 
933
        g_free (added_host);
 
934
        added_host = NULL;
907
935
#ifdef ENABLE_IPV6
908
 
    added6_addr = NULL;
 
936
        added6_addr = NULL;
909
937
#endif
910
 
    added_addr = NULL;
911
 
    if (add_check_handler > 0)
912
 
            g_source_remove (add_check_handler);
913
 
    add_check_handler = 0;
914
 
 
915
 
    gtk_widget_set_sensitive (GTK_WIDGET (manage), FALSE);
916
 
    gtk_widget_set_sensitive (GTK_WIDGET (rescan), FALSE);
917
 
    gtk_list_store_clear (GTK_LIST_STORE (browser_model));
918
 
    gtk_widget_set_sensitive (GTK_WIDGET (browser), FALSE);
919
 
    gtk_label_set_label (GTK_LABEL (status_label),
920
 
                         _(scanning_message));
921
 
 
922
 
    while (hl) {
923
 
        gdm_chooser_host_dispose ((GdmChooserHost *) hl->data);
924
 
        hl = hl->next;
925
 
    }
926
 
 
927
 
    g_list_free (chooser_hosts);
928
 
    chooser_hosts = NULL;
929
 
 
930
 
    do_ping (TRUE);
931
 
 
932
 
    if (scan_time_handler > 0)
933
 
            g_source_remove (scan_time_handler);
934
 
    scan_time_handler = g_timeout_add (gdm_config_get_int (GDM_KEY_SCAN_TIME) * 1000, 
935
 
                                       chooser_scan_time_update, NULL);
936
 
 
937
 
    /* Note we already used up one try */
938
 
    ping_tries = PING_TRIES - 1;
939
 
    if (ping_try_handler > 0)
940
 
            g_source_remove (ping_try_handler);
941
 
    ping_try_handler = g_timeout_add (PING_TIMEOUT, ping_try, NULL);
 
938
        added_addr = NULL;
 
939
        if (add_check_handler > 0)
 
940
                g_source_remove (add_check_handler);
 
941
        add_check_handler = 0;
 
942
 
 
943
        gtk_widget_set_sensitive (GTK_WIDGET (manage), FALSE);
 
944
        gtk_widget_set_sensitive (GTK_WIDGET (rescan), FALSE);
 
945
        gtk_list_store_clear (GTK_LIST_STORE (browser_model));
 
946
        gtk_widget_set_sensitive (GTK_WIDGET (browser), FALSE);
 
947
        gtk_label_set_label (GTK_LABEL (status_label),
 
948
                             _(scanning_message));
 
949
 
 
950
        while (hl) {
 
951
                gdm_chooser_host_dispose ((GdmChooserHost *) hl->data);
 
952
                hl = hl->next;
 
953
        }
 
954
 
 
955
        g_list_free (chooser_hosts);
 
956
        chooser_hosts = NULL;
 
957
 
 
958
        do_ping (TRUE);
 
959
 
 
960
        if (scan_time_handler > 0)
 
961
                g_source_remove (scan_time_handler);
 
962
        scan_time_handler = g_timeout_add (gdm_config_get_int (GDM_KEY_SCAN_TIME) * 1000, 
 
963
                                           chooser_scan_time_update, NULL);
 
964
 
 
965
        /* Note we already used up one try */
 
966
        ping_tries = PING_TRIES - 1;
 
967
        if (ping_try_handler > 0)
 
968
                g_source_remove (ping_try_handler);
 
969
        ping_try_handler = g_timeout_add (PING_TIMEOUT, ping_try, NULL);
942
970
}
943
971
 
944
972
#ifndef ishexdigit
949
977
static int
950
978
from_hex (const char *s, char *d, int len)
951
979
{
952
 
  int t;
953
 
  while (len >= 2)
954
 
    {
955
 
      if (!ishexdigit(*s))
956
 
 return 1;
957
 
      t = HexChar(*s) << 4;
958
 
      s++;
959
 
      if (!ishexdigit(*s))
960
 
 return 1;
961
 
      t += HexChar(*s);
962
 
      s++;
963
 
      *d++ = t;
964
 
      len -= 2;
965
 
    }
966
 
  return len;
 
980
        int t;
 
981
        while (len >= 2)
 
982
                {
 
983
                        if (!ishexdigit(*s))
 
984
                                return 1;
 
985
                        t = HexChar(*s) << 4;
 
986
                        s++;
 
987
                        if (!ishexdigit(*s))
 
988
                                return 1;
 
989
                        t += HexChar(*s);
 
990
                        s++;
 
991
                        *d++ = t;
 
992
                        len -= 2;
 
993
                }
 
994
        return len;
967
995
}
968
996
 
969
997
static void
998
1026
                }
999
1027
#ifdef ENABLE_IPV6
1000
1028
                if (used_addr == AF_INET6 || !qa6) {
1001
 
                         qa6 = g_new0 (struct sockaddr_in6, 1);
1002
 
                         memset (qa6, 0, sizeof (qa6));
1003
 
                         qa6->sin6_family = AF_INET6;
 
1029
                        qa6 = g_new0 (struct sockaddr_in6, 1);
 
1030
                        memset (qa6, 0, sizeof (qa6));
 
1031
                        qa6->sin6_family = AF_INET6;
1004
1032
                }
1005
1033
 
1006
1034
                result = NULL;
1015
1043
                }
1016
1044
                else
1017
1045
#endif
1018
 
                if ((strlen (name) == 8) && (from_hex (name, (char *) &qa->sin_addr, strlen (name)) == 0)) {
1019
 
                        queryaddr = g_slist_append (queryaddr, qa);
1020
 
#ifdef ENABLE_IPV6
1021
 
                        g_free (qa6);
1022
 
                        qa6 = NULL;
1023
 
#endif
1024
 
                        used_addr = AF_INET;
1025
 
                }
1026
 
                else
1027
 
#ifdef ENABLE_IPV6
1028
 
                if (inet_pton (AF_INET6, name, &qa6->sin6_addr) > 0) {
1029
 
                        queryaddr = g_slist_append (queryaddr, qa6);
1030
 
                        g_free (qa);
1031
 
                        qa = NULL;
1032
 
                        used_addr = AF_INET6;
1033
 
                }
1034
 
                else
1035
 
#endif
1036
 
                if ((qa->sin_addr.s_addr = inet_addr (name)) != -1) {
1037
 
                        queryaddr = g_slist_append (queryaddr, qa);
1038
 
#ifdef ENABLE_IPV6
1039
 
                        g_free (qa6);
1040
 
                        qa6 = NULL;
1041
 
#endif
1042
 
                        used_addr = AF_INET;
1043
 
                }
1044
 
                else
1045
 
#ifdef ENABLE_IPV6
1046
 
                if (getaddrinfo (name, NULL, &hints, &result) == 0) {
1047
 
                        for (res = result; res; res = res->ai_next) {
1048
 
                                if (res && res->ai_family == AF_INET6) {
1049
 
                                        memmove (qa6, res->ai_addr, res->ai_addrlen);
 
1046
                        if ((strlen (name) == 8) && (from_hex (name, (char *) &qa->sin_addr, strlen (name)) == 0)) {
 
1047
                                queryaddr = g_slist_append (queryaddr, qa);
 
1048
#ifdef ENABLE_IPV6
 
1049
                                g_free (qa6);
 
1050
                                qa6 = NULL;
 
1051
#endif
 
1052
                                used_addr = AF_INET;
 
1053
                        }
 
1054
                        else
 
1055
#ifdef ENABLE_IPV6
 
1056
                                if (inet_pton (AF_INET6, name, &qa6->sin6_addr) > 0) {
1050
1057
                                        queryaddr = g_slist_append (queryaddr, qa6);
1051
1058
                                        g_free (qa);
1052
1059
                                        qa = NULL;
1053
1060
                                        used_addr = AF_INET6;
1054
 
                           }
1055
 
                                if (res && res->ai_family == AF_INET) {
1056
 
                                        memmove (qa, res->ai_addr, res->ai_addrlen);
1057
 
                                        queryaddr = g_slist_append (queryaddr, qa);
1058
 
                                        g_free (qa6);
1059
 
                                        qa6 = NULL;
1060
 
                                        used_addr = AF_INET;
1061
1061
                                }
1062
 
                        }
1063
 
                } else
1064
 
#endif
1065
 
                if ((hostent = gethostbyname (name)) != NULL
1066
 
                         && hostent->h_addrtype == AF_INET
1067
 
                         && hostent->h_length == 4) {
1068
 
                        qa->sin_family = AF_INET;
1069
 
                        memmove (&qa->sin_addr, hostent->h_addr, 4);
1070
 
                        queryaddr = g_slist_append (queryaddr, qa);
1071
 
#ifdef ENABLE_IPV6
1072
 
                        g_free (qa6);
1073
 
                        qa6 = NULL;
1074
 
#endif
1075
 
                        used_addr = AF_INET;
1076
 
                } else {
1077
 
                        continue; /* not a valid address */
1078
 
                }
 
1062
                                else
 
1063
#endif
 
1064
                                        if ((qa->sin_addr.s_addr = inet_addr (name)) != -1) {
 
1065
                                                queryaddr = g_slist_append (queryaddr, qa);
 
1066
#ifdef ENABLE_IPV6
 
1067
                                                g_free (qa6);
 
1068
                                                qa6 = NULL;
 
1069
#endif
 
1070
                                                used_addr = AF_INET;
 
1071
                                        }
 
1072
                                        else
 
1073
#ifdef ENABLE_IPV6
 
1074
                                                if (getaddrinfo (name, NULL, &hints, &result) == 0) {
 
1075
                                                        for (res = result; res; res = res->ai_next) {
 
1076
                                                                if (res && res->ai_family == AF_INET6) {
 
1077
                                                                        memmove (qa6, res->ai_addr, res->ai_addrlen);
 
1078
                                                                        queryaddr = g_slist_append (queryaddr, qa6);
 
1079
                                                                        g_free (qa);
 
1080
                                                                        qa = NULL;
 
1081
                                                                        used_addr = AF_INET6;
 
1082
                                                                }
 
1083
                                                                if (res && res->ai_family == AF_INET) {
 
1084
                                                                        memmove (qa, res->ai_addr, res->ai_addrlen);
 
1085
                                                                        queryaddr = g_slist_append (queryaddr, qa);
 
1086
                                                                        g_free (qa6);
 
1087
                                                                        qa6 = NULL;
 
1088
                                                                        used_addr = AF_INET;
 
1089
                                                                }
 
1090
                                                        }
 
1091
                                                } else
 
1092
#endif
 
1093
                                                        if ((hostent = gethostbyname (name)) != NULL
 
1094
                                                            && hostent->h_addrtype == AF_INET
 
1095
                                                            && hostent->h_length == 4) {
 
1096
                                                                qa->sin_family = AF_INET;
 
1097
                                                                memmove (&qa->sin_addr, hostent->h_addr, 4);
 
1098
                                                                queryaddr = g_slist_append (queryaddr, qa);
 
1099
#ifdef ENABLE_IPV6
 
1100
                                                                g_free (qa6);
 
1101
                                                                qa6 = NULL;
 
1102
#endif
 
1103
                                                                used_addr = AF_INET;
 
1104
                                                        } else {
 
1105
                                                                continue; /* not a valid address */
 
1106
                                                        }
1079
1107
        }
1080
1108
 
1081
1109
        if (bcaddr == NULL &&
1086
1114
static void
1087
1115
gdm_chooser_xdmcp_init (char **hosts)
1088
1116
{
1089
 
    static XdmcpHeader header;
1090
 
    gint sockopts = 1;
 
1117
        static XdmcpHeader header;
 
1118
        gint sockopts = 1;
1091
1119
 
1092
 
    /* Open socket for communication */
 
1120
        /* Open socket for communication */
1093
1121
#ifdef ENABLE_IPV6
1094
 
    if ((sockfd = socket (AF_INET6, SOCK_DGRAM, 0)) == -1)
1095
 
        have_ipv6 = FALSE;
1096
 
    else
1097
 
        have_ipv6 = TRUE;
 
1122
        if ((sockfd = socket (AF_INET6, SOCK_DGRAM, 0)) == -1)
 
1123
                have_ipv6 = FALSE;
 
1124
        else
 
1125
                have_ipv6 = TRUE;
1098
1126
#endif
1099
 
    if ( ! have_ipv6) {
1100
 
        if ((sockfd = socket (AF_INET, SOCK_DGRAM, 0)) == -1) {
1101
 
            gdm_common_fail_exit ("Could not create socket!");
1102
 
        }
1103
 
    }
1104
 
 
1105
 
    if (setsockopt (sockfd, SOL_SOCKET, SO_BROADCAST,
1106
 
        (char *) &sockopts, sizeof (sockopts)) < 0) {
1107
 
        gdm_common_fail_exit ("Could not set socket options!");
1108
 
    }
1109
 
 
1110
 
    /* Assemble XDMCP BROADCAST_QUERY packet in static buffer */
1111
 
    header.opcode  = (CARD16) BROADCAST_QUERY;
1112
 
    header.length  = 1;
1113
 
    header.version = XDM_PROTOCOL_VERSION;
1114
 
    XdmcpWriteHeader (&bcbuf, &header);
1115
 
    XdmcpWriteARRAY8 (&bcbuf, &authlist.authentication);
1116
 
 
1117
 
    /* Assemble XDMCP QUERY packet in static buffer */
1118
 
    header.opcode  = (CARD16) QUERY;
1119
 
    header.length  = 1;
1120
 
    header.version = XDM_PROTOCOL_VERSION;
1121
 
    XdmcpWriteHeader (&querybuf, &header);
1122
 
    XdmcpWriteARRAY8 (&querybuf, &authlist.authentication);
1123
 
 
1124
 
    gdm_chooser_add_hosts (hosts);
1125
 
 
1126
 
    channel = g_io_channel_unix_new (sockfd);
1127
 
    g_io_channel_set_encoding (channel, NULL, NULL);
1128
 
    g_io_channel_set_buffered (channel, FALSE);
1129
 
    g_io_add_watch_full (channel, G_PRIORITY_DEFAULT,
1130
 
                        G_IO_IN|G_IO_PRI|G_IO_ERR|G_IO_HUP|G_IO_NVAL,
1131
 
                        gdm_chooser_decode_packet,
1132
 
                        GINT_TO_POINTER (sockfd), NULL);
1133
 
    g_io_channel_unref (channel);
1134
 
 
1135
 
    gdm_chooser_xdmcp_discover ();
 
1127
        if ( ! have_ipv6) {
 
1128
                if ((sockfd = socket (AF_INET, SOCK_DGRAM, 0)) == -1) {
 
1129
                        gdm_common_fail_exit ("Could not create socket!");
 
1130
                }
 
1131
        }
 
1132
 
 
1133
        if (setsockopt (sockfd, SOL_SOCKET, SO_BROADCAST,
 
1134
                        (char *) &sockopts, sizeof (sockopts)) < 0) {
 
1135
                gdm_common_fail_exit ("Could not set socket options!");
 
1136
        }
 
1137
 
 
1138
        /* Assemble XDMCP BROADCAST_QUERY packet in static buffer */
 
1139
        header.opcode  = (CARD16) BROADCAST_QUERY;
 
1140
        header.length  = 1;
 
1141
        header.version = XDM_PROTOCOL_VERSION;
 
1142
        XdmcpWriteHeader (&bcbuf, &header);
 
1143
        XdmcpWriteARRAY8 (&bcbuf, &authlist.authentication);
 
1144
 
 
1145
        /* Assemble XDMCP QUERY packet in static buffer */
 
1146
        header.opcode  = (CARD16) QUERY;
 
1147
        header.length  = 1;
 
1148
        header.version = XDM_PROTOCOL_VERSION;
 
1149
        XdmcpWriteHeader (&querybuf, &header);
 
1150
        XdmcpWriteARRAY8 (&querybuf, &authlist.authentication);
 
1151
 
 
1152
        gdm_chooser_add_hosts (hosts);
 
1153
 
 
1154
        channel = g_io_channel_unix_new (sockfd);
 
1155
        g_io_channel_set_encoding (channel, NULL, NULL);
 
1156
        g_io_channel_set_buffered (channel, FALSE);
 
1157
        g_io_add_watch_full (channel, G_PRIORITY_DEFAULT,
 
1158
                             G_IO_IN|G_IO_PRI|G_IO_ERR|G_IO_HUP|G_IO_NVAL,
 
1159
                             gdm_chooser_decode_packet,
 
1160
                             GINT_TO_POINTER (sockfd), NULL);
 
1161
        g_io_channel_unref (channel);
 
1162
 
 
1163
        gdm_chooser_xdmcp_discover ();
1136
1164
}
1137
1165
 
1138
1166
static void
1139
1167
gdm_chooser_choose_host (const char *hostname)
1140
1168
{
1141
 
  ARRAY8 tmparr;
 
1169
        ARRAY8 tmparr;
1142
1170
#ifndef ENABLE_IPV6
1143
 
  struct hostent *hentry;
1144
 
#endif
1145
 
 
1146
 
  printf ("\n%s\n", curhost->name);
1147
 
  fflush (stdout);
1148
 
  if (xdm_address != NULL) {
1149
 
#ifdef ENABLE_IPV6
1150
 
      int status;
1151
 
      struct sockaddr_in6 in6_addr;
1152
 
      struct addrinfo hints, *result;
1153
 
#endif
1154
 
      struct sockaddr_in in_addr;
1155
 
      char xdm_addr[32];
1156
 
      char client_addr[32];
1157
 
      int fd;
1158
 
      char buf[1024];
1159
 
      XdmcpBuffer buffer;
1160
 
      long family, port, addr;
1161
 
 
1162
 
      if (strlen (xdm_address) > 64 ||
1163
 
          from_hex (xdm_address, xdm_addr, strlen (xdm_address)) != 0) {
1164
 
              gdm_common_fail_exit ("gdm_chooser_chooser_host: Invalid xdm address.");
1165
 
      }
1166
 
 
1167
 
      family = (xdm_addr[0] << 8) | xdm_addr[1];
1168
 
      port = (xdm_addr[2] << 8) | xdm_addr[3];
1169
 
 
1170
 
#ifdef ENABLE_IPV6
1171
 
      if (family == AF_INET6) {
1172
 
          memset (&in6_addr, 0, sizeof (in6_addr));
1173
 
 
1174
 
          in6_addr.sin6_port   = htons (port);
1175
 
          in6_addr.sin6_family = AF_INET6;
1176
 
 
1177
 
          memcpy (&in6_addr.sin6_addr, &xdm_address[4], 16);
1178
 
 
1179
 
          if ((fd = socket (PF_INET6, SOCK_STREAM, 0)) == -1) {
1180
 
              gdm_common_fail_exit ("gdm_chooser_choose_host: Could not create response socket.");
1181
 
          }
1182
 
 
1183
 
          if (connect (fd, (struct sockaddr *) &in6_addr,
1184
 
              sizeof (in6_addr)) == -1) {
1185
 
 
1186
 
              gdm_common_fail_exit ("gdm_chooser_chooser_host: Could not connect to xdm.");
1187
 
          }
1188
 
      } else
1189
 
#endif
1190
 
      {
1191
 
          addr = (xdm_addr[4] << 24) | (xdm_addr[5] << 16) |
1192
 
                 (xdm_addr[6] << 8)  | xdm_addr[7];
1193
 
 
1194
 
          in_addr.sin_family      = AF_INET;
1195
 
          in_addr.sin_port        = htons (port);
1196
 
          in_addr.sin_addr.s_addr = htonl (addr);
1197
 
 
1198
 
          if ((fd = socket (PF_INET, SOCK_STREAM, 0)) == -1) {
1199
 
              gdm_common_fail_exit ("gdm_chooser_chooser_host: Could not create response socket.");
1200
 
          }
1201
 
 
1202
 
          if (connect (fd, (struct sockaddr *) &in_addr,
1203
 
              sizeof (in_addr)) == -1) {
1204
 
 
1205
 
              gdm_common_fail_exit ("gdm_chooser_chooser_host: Could not connect to xdm.");
1206
 
          }
1207
 
      }
1208
 
 
1209
 
      buffer.data = (BYTE *) buf;
1210
 
      buffer.size = sizeof (buf);
1211
 
      buffer.pointer = 0;
1212
 
      buffer.count = 0;
1213
 
 
1214
 
      if (strlen (client_address) > 64 || from_hex (client_address,
1215
 
          client_addr, strlen (client_address)) != 0) {
1216
 
 
1217
 
           gdm_common_fail_exit ("gdm_chooser_chooser_host: Invalid client address.");
1218
 
      }
1219
 
 
1220
 
      tmparr.data   = (BYTE *) client_addr;
1221
 
      tmparr.length = strlen (client_address) / 2;
1222
 
 
1223
 
      XdmcpWriteARRAY8 (&buffer, &tmparr);
1224
 
      XdmcpWriteCARD16 (&buffer, (CARD16) connection_type);
1225
 
 
1226
 
#ifdef ENABLE_IPV6
1227
 
      result = NULL;
1228
 
      memset (&hints, 0, sizeof (hints));
1229
 
      hints.ai_socktype = SOCK_STREAM;
1230
 
 
1231
 
      status = getaddrinfo (hostname, NULL, &hints, &result);
1232
 
 
1233
 
      if (status != 0) {
1234
 
           gdm_common_fail_exit ("gdm_chooser_chooser_host: Could not get host entry for %s",
1235
 
               hostname);
1236
 
      }
1237
 
 
1238
 
      if (result->ai_family == AF_INET6)
1239
 
          tmparr.length = 16;
1240
 
      if (result->ai_family == AF_INET)
1241
 
          tmparr.length = 4;
1242
 
      tmparr.data = (BYTE *) result->ai_addr;
 
1171
        struct hostent *hentry;
 
1172
#endif
 
1173
 
 
1174
        printf ("\n%s\n", curhost->name);
 
1175
        fflush (stdout);
 
1176
        if (xdm_address != NULL) {
 
1177
#ifdef ENABLE_IPV6
 
1178
                int status;
 
1179
                struct sockaddr_in6 in6_addr;
 
1180
                struct addrinfo hints, *result;
 
1181
#endif
 
1182
                struct sockaddr_in in_addr;
 
1183
                char xdm_addr[32];
 
1184
                char client_addr[32];
 
1185
                int fd;
 
1186
                char buf[1024];
 
1187
                XdmcpBuffer buffer;
 
1188
                long family, port, addr;
 
1189
 
 
1190
                if (strlen (xdm_address) > 64 ||
 
1191
                    from_hex (xdm_address, xdm_addr, strlen (xdm_address)) != 0) {
 
1192
                        gdm_common_fail_exit ("gdm_chooser_chooser_host: Invalid xdm address.");
 
1193
                }
 
1194
 
 
1195
                family = (xdm_addr[0] << 8) | xdm_addr[1];
 
1196
                port = (xdm_addr[2] << 8) | xdm_addr[3];
 
1197
 
 
1198
#ifdef ENABLE_IPV6
 
1199
                if (family == AF_INET6) {
 
1200
                        memset (&in6_addr, 0, sizeof (in6_addr));
 
1201
 
 
1202
                        in6_addr.sin6_port   = htons (port);
 
1203
                        in6_addr.sin6_family = AF_INET6;
 
1204
 
 
1205
                        memcpy (&in6_addr.sin6_addr, &xdm_address[4], 16);
 
1206
 
 
1207
                        if ((fd = socket (PF_INET6, SOCK_STREAM, 0)) == -1) {
 
1208
                                gdm_common_fail_exit ("gdm_chooser_choose_host: Could not create response socket.");
 
1209
                        }
 
1210
 
 
1211
                        if (connect (fd, (struct sockaddr *) &in6_addr,
 
1212
                                     sizeof (in6_addr)) == -1) {
 
1213
 
 
1214
                                gdm_common_fail_exit ("gdm_chooser_chooser_host: Could not connect to xdm.");
 
1215
                        }
 
1216
                } else
 
1217
#endif
 
1218
                        {
 
1219
                                addr = (xdm_addr[4] << 24) | (xdm_addr[5] << 16) |
 
1220
                                        (xdm_addr[6] << 8)  | xdm_addr[7];
 
1221
 
 
1222
                                in_addr.sin_family      = AF_INET;
 
1223
                                in_addr.sin_port        = htons (port);
 
1224
                                in_addr.sin_addr.s_addr = htonl (addr);
 
1225
 
 
1226
                                if ((fd = socket (PF_INET, SOCK_STREAM, 0)) == -1) {
 
1227
                                        gdm_common_fail_exit ("gdm_chooser_chooser_host: Could not create response socket.");
 
1228
                                }
 
1229
 
 
1230
                                if (connect (fd, (struct sockaddr *) &in_addr,
 
1231
                                             sizeof (in_addr)) == -1) {
 
1232
 
 
1233
                                        gdm_common_fail_exit ("gdm_chooser_chooser_host: Could not connect to xdm.");
 
1234
                                }
 
1235
                        }
 
1236
 
 
1237
                buffer.data = (BYTE *) buf;
 
1238
                buffer.size = sizeof (buf);
 
1239
                buffer.pointer = 0;
 
1240
                buffer.count = 0;
 
1241
 
 
1242
                if (strlen (client_address) > 64 || from_hex (client_address,
 
1243
                                                              client_addr, strlen (client_address)) != 0) {
 
1244
 
 
1245
                        gdm_common_fail_exit ("gdm_chooser_chooser_host: Invalid client address.");
 
1246
                }
 
1247
 
 
1248
                tmparr.data   = (BYTE *) client_addr;
 
1249
                tmparr.length = strlen (client_address) / 2;
 
1250
 
 
1251
                XdmcpWriteARRAY8 (&buffer, &tmparr);
 
1252
                XdmcpWriteCARD16 (&buffer, (CARD16) connection_type);
 
1253
 
 
1254
#ifdef ENABLE_IPV6
 
1255
                result = NULL;
 
1256
                memset (&hints, 0, sizeof (hints));
 
1257
                hints.ai_socktype = SOCK_STREAM;
 
1258
 
 
1259
                status = getaddrinfo (hostname, NULL, &hints, &result);
 
1260
 
 
1261
                if (status != 0) {
 
1262
                        gdm_common_fail_exit ("gdm_chooser_chooser_host: Could not get host entry for %s",
 
1263
                                              hostname);
 
1264
                }
 
1265
 
 
1266
                if (result->ai_family == AF_INET6)
 
1267
                        tmparr.length = 16;
 
1268
                if (result->ai_family == AF_INET)
 
1269
                        tmparr.length = 4;
 
1270
                tmparr.data = (BYTE *) result->ai_addr;
1243
1271
#else
1244
 
      hentry = gethostbyname (hostname);
1245
 
 
1246
 
      if (!hentry) {
1247
 
          gdm_common_fail_exit ("gdm_chooser_chooser_host: Could not get host entry for %s",
1248
 
             hostname);
1249
 
      }
1250
 
 
1251
 
      tmparr.data   = (BYTE *) hentry->h_addr_list[0]; /* XXX */
1252
 
      tmparr.length = 4;
 
1272
                hentry = gethostbyname (hostname);
 
1273
 
 
1274
                if (!hentry) {
 
1275
                        gdm_common_fail_exit ("gdm_chooser_chooser_host: Could not get host entry for %s",
 
1276
                                              hostname);
 
1277
                }
 
1278
 
 
1279
                tmparr.data   = (BYTE *) hentry->h_addr_list[0]; /* XXX */
 
1280
                tmparr.length = 4;
1253
1281
 
1254
1282
#endif
1255
 
      XdmcpWriteARRAY8 (&buffer, &tmparr);
1256
 
      write (fd, (char *) buffer.data, buffer.pointer);
1257
 
      close (fd);
1258
 
  }
 
1283
                XdmcpWriteARRAY8 (&buffer, &tmparr);
 
1284
                write (fd, (char *) buffer.data, buffer.pointer);
 
1285
                close (fd);
 
1286
        }
1259
1287
}
1260
1288
 
1261
1289
static gboolean
1268
1296
                check = TRUE;
1269
1297
        else
1270
1298
#endif
1271
 
        if ((! have_ipv6) && added_addr != NULL)
1272
 
                check = TRUE;
 
1299
                if ((! have_ipv6) && added_addr != NULL)
 
1300
                        check = TRUE;
1273
1301
 
1274
1302
        if (check) {
1275
1303
                GtkWidget *dialog;
1283
1311
                                       added_host,
1284
1312
                                       ADD_TIMEOUT / 1000);
1285
1313
 
1286
 
                dialog = ve_hig_dialog_new
1287
 
                        (GTK_WINDOW (chooser) /* parent */,
1288
 
                         GTK_DIALOG_MODAL /* flags */,
1289
 
                         GTK_MESSAGE_ERROR,
1290
 
                         GTK_BUTTONS_OK,
1291
 
                         _("Did not receive response from server"),
1292
 
                         msg);
 
1314
                dialog = hig_dialog_new (GTK_WINDOW (chooser) /* parent */,
 
1315
                                         GTK_DIALOG_MODAL /* flags */,
 
1316
                                         GTK_MESSAGE_ERROR,
 
1317
                                         GTK_BUTTONS_OK,
 
1318
                                         _("Did not receive response from server"),
 
1319
                                         msg);
1293
1320
 
1294
1321
                g_free (msg);
1295
1322
 
1339
1366
 
1340
1367
        else
1341
1368
#endif
1342
 
        if (strlen (name) == 8 &&
1343
 
            from_hex (name, (char *) &qa->sin_addr, strlen (name)) == 0) {
1344
 
#ifdef ENABLE_IPV6
1345
 
                if (have_ipv6) {
1346
 
                        char tmpaddr[30];
1347
 
 
1348
 
                        sprintf (tmpaddr, "::ffff:%s", inet_ntoa (qa->sin_addr));
1349
 
                        inet_pton (AF_INET6, tmpaddr, &qa6->sin6_addr);
1350
 
                }
1351
 
#endif
1352
 
        }
1353
 
        else
1354
 
#ifdef ENABLE_IPV6
1355
 
        if (have_ipv6 && inet_pton (AF_INET6, name, &qa6->sin6_addr) > 0) ;
1356
 
        else
1357
 
#endif
1358
 
        if (inet_aton (name, &(qa->sin_addr))) {
1359
 
#ifdef ENABLE_IPV6
1360
 
                if (have_ipv6) {
1361
 
                        char tmpaddr[30];
1362
 
 
1363
 
                        sprintf (tmpaddr, "::ffff:%s", inet_ntoa (qa->sin_addr));
1364
 
                        inet_pton (AF_INET6, tmpaddr, &qa6->sin6_addr);
1365
 
                }
1366
 
#endif
1367
 
        }
1368
 
        else
1369
 
#ifdef ENABLE_IPV6
1370
 
        if (getaddrinfo (name, NULL, &hints, &result) == 0) {
1371
 
                if (result->ai_family == AF_INET6) {
1372
 
                        memcpy (qa6, (struct sockaddr_in6 *)result->ai_addr, result->ai_addrlen);
1373
 
                }
1374
 
                else if (result->ai_family == AF_INET) {
 
1369
                if (strlen (name) == 8 &&
 
1370
                    from_hex (name, (char *) &qa->sin_addr, strlen (name)) == 0) {
 
1371
#ifdef ENABLE_IPV6
1375
1372
                        if (have_ipv6) {
1376
 
                                char tmpaddr [30];
 
1373
                                char tmpaddr[30];
1377
1374
 
1378
 
                                sprintf (tmpaddr, "::ffff:%s",
1379
 
                                  inet_ntoa (((struct sockaddr_in *)result->ai_addr)->sin_addr));
 
1375
                                sprintf (tmpaddr, "::ffff:%s", inet_ntoa (qa->sin_addr));
1380
1376
                                inet_pton (AF_INET6, tmpaddr, &qa6->sin6_addr);
1381
1377
                        }
 
1378
#endif
1382
1379
                }
1383
 
        }
1384
 
        else
1385
 
#endif
1386
 
        if ((hostent = gethostbyname (name)) != NULL &&
1387
 
             hostent->h_addrtype == AF_INET && hostent->h_length == 4) {
1388
 
                memmove (&qa->sin_addr, hostent->h_addr, 4);
1389
 
        } else {
1390
 
                GtkWidget *dialog;
1391
 
                gchar *msg;
1392
 
 
1393
 
                msg = g_strdup_printf (_("Cannot find the host \"%s\". "
1394
 
                                         "Perhaps you have mistyped it."),
1395
 
                                         name);
1396
 
 
1397
 
                dialog = ve_hig_dialog_new
1398
 
                (GTK_WINDOW (chooser) /* parent */,
1399
 
                 GTK_DIALOG_MODAL /* flags */,
1400
 
                 GTK_MESSAGE_ERROR,
1401
 
                 GTK_BUTTONS_OK,
1402
 
                 _("Cannot find host"),
1403
 
                 msg);
1404
 
                 
1405
 
                g_free (msg);
1406
 
 
1407
 
                if (RUNNING_UNDER_GDM)
1408
 
                        gdm_wm_center_window (GTK_WINDOW (dialog));
1409
 
 
1410
 
                gdm_wm_no_login_focus_push ();
1411
 
                gtk_dialog_run (GTK_DIALOG (dialog));
1412
 
                gtk_widget_destroy (dialog);
1413
 
                gdm_wm_no_login_focus_pop ();
1414
 
                g_free (qa);
1415
 
#ifdef ENABLE_IPV6
1416
 
                g_free (qa6);
1417
 
#endif
1418
 
                return; /* not a valid address */
1419
 
        }
 
1380
                else
 
1381
#ifdef ENABLE_IPV6
 
1382
                        if (have_ipv6 && inet_pton (AF_INET6, name, &qa6->sin6_addr) > 0) ;
 
1383
                        else
 
1384
#endif
 
1385
                                if (inet_aton (name, &(qa->sin_addr))) {
 
1386
#ifdef ENABLE_IPV6
 
1387
                                        if (have_ipv6) {
 
1388
                                                char tmpaddr[30];
 
1389
 
 
1390
                                                sprintf (tmpaddr, "::ffff:%s", inet_ntoa (qa->sin_addr));
 
1391
                                                inet_pton (AF_INET6, tmpaddr, &qa6->sin6_addr);
 
1392
                                        }
 
1393
#endif
 
1394
                                }
 
1395
                                else
 
1396
#ifdef ENABLE_IPV6
 
1397
                                        if (getaddrinfo (name, NULL, &hints, &result) == 0) {
 
1398
                                                if (result->ai_family == AF_INET6) {
 
1399
                                                        memcpy (qa6, (struct sockaddr_in6 *)result->ai_addr, result->ai_addrlen);
 
1400
                                                }
 
1401
                                                else if (result->ai_family == AF_INET) {
 
1402
                                                        if (have_ipv6) {
 
1403
                                                                char tmpaddr [30];
 
1404
 
 
1405
                                                                sprintf (tmpaddr, "::ffff:%s",
 
1406
                                                                         inet_ntoa (((struct sockaddr_in *)result->ai_addr)->sin_addr));
 
1407
                                                                inet_pton (AF_INET6, tmpaddr, &qa6->sin6_addr);
 
1408
                                                        }
 
1409
                                                }
 
1410
                                        }
 
1411
                                        else
 
1412
#endif
 
1413
                                                if ((hostent = gethostbyname (name)) != NULL &&
 
1414
                                                    hostent->h_addrtype == AF_INET && hostent->h_length == 4) {
 
1415
                                                        memmove (&qa->sin_addr, hostent->h_addr, 4);
 
1416
                                                } else {
 
1417
                                                        GtkWidget *dialog;
 
1418
                                                        gchar *msg;
 
1419
 
 
1420
                                                        msg = g_strdup_printf (_("Cannot find the host \"%s\". "
 
1421
                                                                                 "Perhaps you have mistyped it."),
 
1422
                                                                               name);
 
1423
 
 
1424
                                                        dialog = hig_dialog_new (GTK_WINDOW (chooser) /* parent */,
 
1425
                                                                                 GTK_DIALOG_MODAL /* flags */,
 
1426
                                                                                 GTK_MESSAGE_ERROR,
 
1427
                                                                                 GTK_BUTTONS_OK,
 
1428
                                                                                 _("Cannot find host"),
 
1429
                                                                                 msg);
 
1430
                                                        g_free (msg);
 
1431
 
 
1432
                                                        if (RUNNING_UNDER_GDM)
 
1433
                                                                gdm_wm_center_window (GTK_WINDOW (dialog));
 
1434
 
 
1435
                                                        gdm_wm_no_login_focus_push ();
 
1436
                                                        gtk_dialog_run (GTK_DIALOG (dialog));
 
1437
                                                        gtk_widget_destroy (dialog);
 
1438
                                                        gdm_wm_no_login_focus_pop ();
 
1439
                                                        g_free (qa);
 
1440
#ifdef ENABLE_IPV6
 
1441
                                                        g_free (qa6);
 
1442
#endif
 
1443
                                                        return; /* not a valid address */
 
1444
                                                }
1420
1445
 
1421
1446
#ifdef ENABLE_IPV6
1422
1447
        if (have_ipv6) {
1435
1460
                        host = gdm_host_known ((char *) &qa6->sin6_addr, AF_INET6);
1436
1461
        } else
1437
1462
#endif
1438
 
        {
1439
 
                memset (&sock, 0, sizeof (struct sockaddr_in));
1440
 
                sock.sin_family = AF_INET;
1441
 
                sock.sin_port = htons (XDM_UDP_PORT);
1442
 
                status = gdm_addr_known ((char *)&qa->sin_addr, AF_INET);
1443
 
                if ( ! status) {
1444
 
                        queryaddr = g_slist_append (queryaddr, qa);
 
1463
                {
 
1464
                        memset (&sock, 0, sizeof (struct sockaddr_in));
 
1465
                        sock.sin_family = AF_INET;
 
1466
                        sock.sin_port = htons (XDM_UDP_PORT);
 
1467
                        status = gdm_addr_known ((char *)&qa->sin_addr, AF_INET);
 
1468
                        if ( ! status) {
 
1469
                                queryaddr = g_slist_append (queryaddr, qa);
 
1470
                        }
 
1471
                        host = gdm_host_known ((char *) &qa->sin_addr, AF_INET);
1445
1472
                }
1446
 
                host = gdm_host_known ((char *) &qa->sin_addr, AF_INET);
1447
 
        }
1448
1473
 
1449
1474
        if (host != NULL) {
1450
1475
                GtkTreeIter iter = {0};
1470
1495
                                        added_addr = (struct in_addr *)&(qa6->sin6_addr.s6_addr[12]);
1471
1496
                        } else
1472
1497
#endif
1473
 
                        {
1474
 
                                sock.sin_addr.s_addr = qa->sin_addr.s_addr;
1475
 
                                XdmcpFlush (sockfd, &querybuf, (XdmcpNetaddr) &sock, (int)sizeof (struct sockaddr_in));
1476
 
                                added_addr = &qa->sin_addr;
1477
 
                        }
 
1498
                                {
 
1499
                                        sock.sin_addr.s_addr = qa->sin_addr.s_addr;
 
1500
                                        XdmcpFlush (sockfd, &querybuf, (XdmcpNetaddr) &sock, (int)sizeof (struct sockaddr_in));
 
1501
                                        added_addr = &qa->sin_addr;
 
1502
                                }
1478
1503
                        g_free (added_host);
1479
1504
                        added_host = g_strdup (name);
1480
1505
 
1503
1528
                XdmcpFlush (sockfd, &querybuf, (XdmcpNetaddr) &sock6, (int)sizeof (struct sockaddr_in6));
1504
1529
        } else
1505
1530
#endif
1506
 
        {
1507
 
                added_addr = &qa->sin_addr;
 
1531
                {
 
1532
                        added_addr = &qa->sin_addr;
1508
1533
 
1509
 
                /* and send out the query */
1510
 
                sock.sin_addr.s_addr = qa->sin_addr.s_addr;
1511
 
                XdmcpFlush (sockfd, &querybuf, (XdmcpNetaddr) &sock, (int)sizeof (struct sockaddr_in));
1512
 
        }
 
1534
                        /* and send out the query */
 
1535
                        sock.sin_addr.s_addr = qa->sin_addr.s_addr;
 
1536
                        XdmcpFlush (sockfd, &querybuf, (XdmcpNetaddr) &sock, (int)sizeof (struct sockaddr_in));
 
1537
                }
1513
1538
        g_free (added_host);
1514
1539
        added_host = g_strdup (name);
1515
1540
        if (add_check_handler > 0)
1536
1561
}
1537
1562
 
1538
1563
void
1539
 
gdm_chooser_cancel (/*void*/)
 
1564
gdm_chooser_cancel (int sig)
1540
1565
{
1541
 
    if (scan_time_handler > 0) {
1542
 
            g_source_remove (scan_time_handler);
1543
 
            scan_time_handler = 0;
1544
 
    }
 
1566
        if (scan_time_handler > 0) {
 
1567
                g_source_remove (scan_time_handler);
 
1568
                scan_time_handler = 0;
 
1569
        }
1545
1570
 
1546
 
    closelog ();
1547
 
    /* exit rather gtk_main_quit, it's just safer this way we don't
1548
 
       have to worry about random whackiness happening */
1549
 
    exit (EXIT_SUCCESS);
 
1571
        /* exit rather gtk_main_quit, it's just safer this way we don't
 
1572
           have to worry about random whackiness happening */
 
1573
        exit (EXIT_SUCCESS);
1550
1574
}
1551
1575
 
1552
1576
 
1553
1577
void
1554
1578
gdm_chooser_manage (GtkButton *button, gpointer data)
1555
1579
{
1556
 
    if (scan_time_handler > 0) {
1557
 
            g_source_remove (scan_time_handler);
1558
 
            scan_time_handler = 0;
1559
 
    }
1560
 
 
1561
 
    if (curhost)
1562
 
      gdm_chooser_choose_host (curhost->name);
1563
 
   
1564
 
    closelog ();
1565
 
 
1566
 
    /* exit rather gtk_main_quit, it's just safer this way we don't
1567
 
       have to worry about random whackiness happening */
1568
 
    exit (EXIT_SUCCESS);
 
1580
        if (scan_time_handler > 0) {
 
1581
                g_source_remove (scan_time_handler);
 
1582
                scan_time_handler = 0;
 
1583
        }
 
1584
 
 
1585
        if (curhost)
 
1586
                gdm_chooser_choose_host (curhost->name);
 
1587
 
 
1588
        /* exit rather gtk_main_quit, it's just safer this way we don't
 
1589
           have to worry about random whackiness happening */
 
1590
        exit (EXIT_SUCCESS);
1569
1591
}
1570
1592
 
1571
1593
static void
1622
1644
        gdm_wm_no_login_focus_pop ();
1623
1645
}
1624
1646
 
1625
 
static void 
 
1647
static void
1626
1648
gdm_chooser_gui_init (void)
1627
1649
{
1628
1650
        GtkTreeSelection *selection;
1631
1653
        int width;
1632
1654
        int height;
1633
1655
 
1634
 
        glade_helper_add_glade_directory (GDM_GLADE_DIR);
1635
 
        glade_helper_search_gnome_dirs (FALSE);
1636
 
 
1637
 
    /* Enable theme */
1638
 
    if (RUNNING_UNDER_GDM) {
1639
 
        const char *theme_name;
1640
 
 
1641
 
        if ( ! ve_string_empty (gdm_config_get_string (GDM_KEY_GTKRC)))
1642
 
                gtk_rc_parse (gdm_config_get_string (GDM_KEY_GTKRC));
1643
 
 
1644
 
        theme_name = g_getenv ("GDM_GTK_THEME");
1645
 
        if (ve_string_empty (theme_name))
1646
 
                theme_name = gdm_config_get_string (GDM_KEY_GTK_THEME);
1647
 
 
1648
 
        if ( ! ve_string_empty (theme_name)) {
1649
 
                gdm_set_theme (theme_name);
1650
 
        }
1651
 
    }
1652
 
 
1653
 
    defaulthosticon = gdm_config_get_string (GDM_KEY_DEFAULT_HOST_IMG);
1654
 
 
1655
 
    /* Load default host image */
1656
 
    if (g_access (defaulthosticon, R_OK) != 0) {
1657
 
        gdm_common_error ("Could not open default host icon: %s", defaulthosticon);
1658
 
        /* bogus image */
1659
 
        defhostimg = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
1660
 
                                     FALSE /* has_alpha */,
1661
 
                                     8 /* bits_per_sample */,
1662
 
                                     48 /* width */,
1663
 
                                     48 /* height */);
1664
 
    } else {
1665
 
        defhostimg = gdk_pixbuf_new_from_file (defaulthosticon, NULL);
1666
 
    }
1667
 
 
1668
 
    /* Main window */
1669
 
    chooser_app = glade_helper_load ("gdmchooser.glade",
 
1656
        /* Enable theme */
 
1657
        if (RUNNING_UNDER_GDM) {
 
1658
                const char *theme_name;
 
1659
 
 
1660
                if ( ! ve_string_empty (gdm_config_get_string (GDM_KEY_GTKRC)))
 
1661
                        gtk_rc_parse (gdm_config_get_string (GDM_KEY_GTKRC));
 
1662
 
 
1663
                theme_name = g_getenv ("GDM_GTK_THEME");
 
1664
                if (ve_string_empty (theme_name))
 
1665
                        theme_name = gdm_config_get_string (GDM_KEY_GTK_THEME);
 
1666
 
 
1667
                if ( ! ve_string_empty (theme_name)) {
 
1668
                        gdm_set_theme (theme_name);
 
1669
                }
 
1670
        }
 
1671
 
 
1672
        defaulthosticon = gdm_config_get_string (GDM_KEY_DEFAULT_HOST_IMG);
 
1673
 
 
1674
        /* Load default host image */
 
1675
        if (g_access (defaulthosticon, R_OK) != 0) {
 
1676
                gdm_common_error ("Could not open default host icon: %s", defaulthosticon);
 
1677
                /* bogus image */
 
1678
                defhostimg = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
 
1679
                                             FALSE /* has_alpha */,
 
1680
                                             8 /* bits_per_sample */,
 
1681
                                             48 /* width */,
 
1682
                                             48 /* height */);
 
1683
        } else {
 
1684
                defhostimg = gdk_pixbuf_new_from_file (defaulthosticon, NULL);
 
1685
        }
 
1686
 
 
1687
        /* Main window */
 
1688
        chooser_app = glade_xml_new (GDM_GLADE_DIR "/gdmchooser.glade",
1670
1689
                                     "gdmchooser_main",
1671
 
                                     GTK_TYPE_DIALOG,
1672
 
                                     FALSE /* dump_on_destroy */);
1673
 
    glade_xml_signal_autoconnect (chooser_app);
1674
 
   
1675
 
    chooser = glade_helper_get (chooser_app, "gdmchooser_main",
1676
 
                                GTK_TYPE_DIALOG);
1677
 
    manage = glade_helper_get (chooser_app, "connect_button",
1678
 
                               GTK_TYPE_BUTTON);
1679
 
    rescan = glade_helper_get (chooser_app, "rescan_button",
1680
 
                               GTK_TYPE_BUTTON);
1681
 
    cancel = glade_helper_get (chooser_app, "quit_button",
1682
 
                               GTK_TYPE_BUTTON);
1683
 
    status_label = glade_helper_get (chooser_app, "status_label",
1684
 
                                     GTK_TYPE_LABEL);
1685
 
    add_entry = glade_helper_get (chooser_app, "add_entry",
1686
 
                                  GTK_TYPE_ENTRY);
1687
 
    add_button = glade_helper_get (chooser_app, "add_button",
1688
 
                                   GTK_TYPE_BUTTON);
1689
 
 
1690
 
    browser = glade_helper_get (chooser_app, "chooser_iconlist",
1691
 
                                GTK_TYPE_TREE_VIEW);
1692
 
 
1693
 
    gtk_dialog_set_has_separator (GTK_DIALOG (chooser), FALSE);
1694
 
 
1695
 
    gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (browser), TRUE);
1696
 
 
1697
 
    selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (browser));
1698
 
    gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
1699
 
 
1700
 
    g_signal_connect (selection, "changed",
1701
 
                      G_CALLBACK (host_selected),
1702
 
                      NULL);
1703
 
    g_signal_connect (browser, "row_activated",
1704
 
                      G_CALLBACK (row_activated),
1705
 
                      NULL);
1706
 
 
1707
 
    browser_model = (GtkTreeModel *)gtk_list_store_new (3,
1708
 
                                                        GDK_TYPE_PIXBUF,
1709
 
                                                        G_TYPE_STRING,
1710
 
                                                        G_TYPE_POINTER);
1711
 
    gtk_tree_view_set_model (GTK_TREE_VIEW (browser), browser_model);
1712
 
    column = gtk_tree_view_column_new_with_attributes
1713
 
            ("Icon",
1714
 
             gtk_cell_renderer_pixbuf_new (),
1715
 
             "pixbuf", CHOOSER_LIST_ICON_COLUMN,
1716
 
             NULL);
1717
 
    gtk_tree_view_append_column (GTK_TREE_VIEW (browser), column);
1718
 
 
1719
 
    column = gtk_tree_view_column_new_with_attributes
1720
 
            ("Hostname",
1721
 
             gtk_cell_renderer_text_new (),
1722
 
             "markup", CHOOSER_LIST_LABEL_COLUMN,
1723
 
             NULL);
1724
 
    gtk_tree_view_append_column (GTK_TREE_VIEW (browser), column);
1725
 
 
1726
 
    gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (browser_model),
1727
 
                                          CHOOSER_LIST_LABEL_COLUMN,
1728
 
                                          GTK_SORT_ASCENDING);
1729
 
 
1730
 
 
1731
 
    if ( ! gdm_config_get_bool (GDM_KEY_ALLOW_ADD)) {
1732
 
            GtkWidget *w = glade_helper_get (chooser_app, "add_hbox",
1733
 
                                             GTK_TYPE_HBOX);
1734
 
            gtk_widget_hide (w);
1735
 
    }
1736
 
 
1737
 
    gtk_window_get_size (GTK_WINDOW (chooser),
1738
 
                         &width, &height);
1739
 
    if (RUNNING_UNDER_GDM) {
1740
 
            if (width > gdm_wm_screen.width)
1741
 
                    width = gdm_wm_screen.width;
1742
 
            if (height > gdm_wm_screen.height)
1743
 
                    height = gdm_wm_screen.height;
1744
 
    } else {
1745
 
            if (width > gdk_screen_width ())
1746
 
                    width = gdk_screen_width ();
1747
 
            if (height > gdk_screen_height ())
1748
 
                    height = gdk_screen_height ();
1749
 
    }
1750
 
    gtk_widget_set_size_request (GTK_WIDGET (chooser), 
1751
 
                                 width, height);
1752
 
    gtk_window_set_default_size (GTK_WINDOW (chooser), 
1753
 
                                 width, height);
1754
 
    gtk_window_resize (GTK_WINDOW (chooser), 
1755
 
                       width, height);
1756
 
 
1757
 
 
1758
 
    /* cursor blinking is evil on remote displays, don't do it forever */
1759
 
    gdm_common_setup_blinking ();
1760
 
    gdm_common_setup_blinking_entry (add_entry);
1761
 
 
1762
 
    if (RUNNING_UNDER_GDM) {
1763
 
            gtk_widget_show_now (chooser);
1764
 
            gdm_wm_center_window (GTK_WINDOW (chooser));
1765
 
    }
 
1690
                                     NULL);
 
1691
        glade_xml_signal_autoconnect (chooser_app);
 
1692
        chooser = glade_xml_get_widget (chooser_app, "gdmchooser_main");
 
1693
        manage = glade_xml_get_widget (chooser_app, "connect_button");
 
1694
        rescan = glade_xml_get_widget (chooser_app, "rescan_button");
 
1695
        cancel = glade_xml_get_widget (chooser_app, "quit_button");
 
1696
        status_label = glade_xml_get_widget (chooser_app, "status_label");
 
1697
        add_entry = glade_xml_get_widget (chooser_app, "add_entry");
 
1698
        add_button = glade_xml_get_widget (chooser_app, "add_button");
 
1699
        browser = glade_xml_get_widget (chooser_app, "chooser_iconlist");
 
1700
 
 
1701
        gtk_dialog_set_has_separator (GTK_DIALOG (chooser), FALSE);
 
1702
 
 
1703
        gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (browser), TRUE);
 
1704
 
 
1705
        selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (browser));
 
1706
        gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
 
1707
 
 
1708
        g_signal_connect (selection, "changed",
 
1709
                          G_CALLBACK (host_selected),
 
1710
                          NULL);
 
1711
        g_signal_connect (browser, "row_activated",
 
1712
                          G_CALLBACK (row_activated),
 
1713
                          NULL);
 
1714
 
 
1715
        browser_model = (GtkTreeModel *)gtk_list_store_new (3,
 
1716
                                                            GDK_TYPE_PIXBUF,
 
1717
                                                            G_TYPE_STRING,
 
1718
                                                            G_TYPE_POINTER);
 
1719
        gtk_tree_view_set_model (GTK_TREE_VIEW (browser), browser_model);
 
1720
        column = gtk_tree_view_column_new_with_attributes ("Icon",
 
1721
                                                           gtk_cell_renderer_pixbuf_new (),
 
1722
                                                           "pixbuf", CHOOSER_LIST_ICON_COLUMN,
 
1723
                                                           NULL);
 
1724
        gtk_tree_view_append_column (GTK_TREE_VIEW (browser), column);
 
1725
 
 
1726
        column = gtk_tree_view_column_new_with_attributes ("Hostname",
 
1727
                                                           gtk_cell_renderer_text_new (),
 
1728
                                                           "markup", CHOOSER_LIST_LABEL_COLUMN,
 
1729
                                                           NULL);
 
1730
        gtk_tree_view_append_column (GTK_TREE_VIEW (browser), column);
 
1731
 
 
1732
        gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (browser_model),
 
1733
                                              CHOOSER_LIST_LABEL_COLUMN,
 
1734
                                              GTK_SORT_ASCENDING);
 
1735
 
 
1736
 
 
1737
        if ( ! gdm_config_get_bool (GDM_KEY_ALLOW_ADD)) {
 
1738
                GtkWidget *w = glade_xml_get_widget (chooser_app, "add_hbox");
 
1739
                gtk_widget_hide (w);
 
1740
        }
 
1741
 
 
1742
        gtk_window_get_size (GTK_WINDOW (chooser),
 
1743
                             &width, &height);
 
1744
        if (RUNNING_UNDER_GDM) {
 
1745
                if (width > gdm_wm_screen.width)
 
1746
                        width = gdm_wm_screen.width;
 
1747
                if (height > gdm_wm_screen.height)
 
1748
                        height = gdm_wm_screen.height;
 
1749
        } else {
 
1750
                if (width > gdk_screen_width ())
 
1751
                        width = gdk_screen_width ();
 
1752
                if (height > gdk_screen_height ())
 
1753
                        height = gdk_screen_height ();
 
1754
        }
 
1755
        gtk_widget_set_size_request (GTK_WIDGET (chooser),
 
1756
                                     width, height);
 
1757
        gtk_window_set_default_size (GTK_WINDOW (chooser),
 
1758
                                     width, height);
 
1759
        gtk_window_resize (GTK_WINDOW (chooser),
 
1760
                           width, height);
 
1761
 
 
1762
 
 
1763
        /* cursor blinking is evil on remote displays, don't do it forever */
 
1764
        gdm_common_setup_blinking ();
 
1765
        gdm_common_setup_blinking_entry (add_entry);
 
1766
 
 
1767
        if (RUNNING_UNDER_GDM) {
 
1768
                gtk_widget_show_now (chooser);
 
1769
                gdm_wm_center_window (GTK_WINDOW (chooser));
 
1770
        }
1766
1771
}
1767
1772
 
1768
1773
/* 
1775
1780
        /* Read config data in bulk */
1776
1781
        gdmcomm_comm_bulk_start ();
1777
1782
 
1778
 
        gdmcomm_set_debug (gdm_config_get_bool (GDM_KEY_DEBUG));
1779
 
 
1780
1783
        /*
1781
1784
         * Read all the keys at once and close sockets connection so we do
1782
1785
         * not have to keep the socket open.  
1798
1801
        gdm_config_get_bool   (GDM_KEY_MULTICAST);
1799
1802
 
1800
1803
        gdmcomm_comm_bulk_stop ();
 
1804
 
 
1805
        return FALSE;
1801
1806
}
1802
1807
 
1803
1808
static gboolean
1808
1813
        /* Read config data in bulk */
1809
1814
        gdmcomm_comm_bulk_start ();
1810
1815
 
1811
 
        if (gdm_config_reload_bool (GDM_KEY_DEBUG))
1812
 
                gdmcomm_set_debug (gdm_config_get_bool (GDM_KEY_DEBUG));
1813
 
 
1814
1816
        /* FIXME: The following is evil, we should update on the fly rather
1815
1817
         * then just restarting */
1816
1818
        /* Also we may not need to check ALL those keys but just a few */
1846
1848
 
1847
1849
                if (gdm_config_get_int (GDM_KEY_BACKGROUND_TYPE) != GDM_BACKGROUND_NONE) {
1848
1850
                        gdm_common_setup_background_color (gdm_config_get_string
1849
 
                                (GDM_KEY_BACKGROUND_COLOR));
 
1851
                                                           (GDM_KEY_BACKGROUND_COLOR));
1850
1852
                }
1851
1853
        }
1852
1854
 
1859
1861
static void
1860
1862
gdm_chooser_signals_init (void)
1861
1863
{
1862
 
    struct sigaction hup;
1863
 
    struct sigaction term;
1864
 
    sigset_t mask;
1865
 
 
1866
 
    ve_signal_add (SIGHUP, gdm_reread_config, NULL);
1867
 
 
1868
 
    hup.sa_handler = ve_signal_notify;
1869
 
    hup.sa_flags = 0;
1870
 
    sigemptyset (&hup.sa_mask);
1871
 
    sigaddset (&hup.sa_mask, SIGCHLD);
1872
 
 
1873
 
    term.sa_handler = gdm_chooser_cancel;
1874
 
    term.sa_flags = 0;
1875
 
    sigemptyset (&term.sa_mask);
1876
 
 
1877
 
    if (sigaction (SIGHUP, &hup, NULL) < 0) {
1878
 
        gdm_common_fail_exit ("%s: Error setting up %s signal handler: %s",
1879
 
            "gdm_signals_init", "HUP", strerror (errno));
1880
 
    }
1881
 
 
1882
 
    if (sigaction (SIGINT, &term, NULL) < 0) {
1883
 
        gdm_common_fail_exit ("%s: Error setting up %s signal handler: %s",
1884
 
           "gdm_signals_init", "INT", strerror (errno));
1885
 
    }
1886
 
 
1887
 
    if (sigaction (SIGTERM, &term, NULL) < 0) {
1888
 
        gdm_common_fail_exit ("%s: Error setting up %s signal handler: %s",
1889
 
           "gdm_signals_init", "TERM", strerror (errno));
1890
 
    }
1891
 
 
1892
 
    sigfillset (&mask);
1893
 
    sigdelset (&mask, SIGTERM);
1894
 
    sigdelset (&mask, SIGHUP);
1895
 
    sigdelset (&mask, SIGINT);
 
1864
        struct sigaction hup;
 
1865
        struct sigaction term;
 
1866
        sigset_t mask;
 
1867
 
 
1868
        ve_signal_add (SIGHUP, gdm_reread_config, NULL);
 
1869
 
 
1870
        hup.sa_handler = ve_signal_notify;
 
1871
        hup.sa_flags = 0;
 
1872
        sigemptyset (&hup.sa_mask);
 
1873
        sigaddset (&hup.sa_mask, SIGCHLD);
 
1874
 
 
1875
        term.sa_handler = gdm_chooser_cancel;
 
1876
        term.sa_flags = 0;
 
1877
        sigemptyset (&term.sa_mask);
 
1878
 
 
1879
        if (sigaction (SIGHUP, &hup, NULL) < 0) {
 
1880
                gdm_common_fail_exit ("%s: Error setting up %s signal handler: %s",
 
1881
                                      "gdm_signals_init", "HUP", strerror (errno));
 
1882
        }
 
1883
 
 
1884
        if (sigaction (SIGINT, &term, NULL) < 0) {
 
1885
                gdm_common_fail_exit ("%s: Error setting up %s signal handler: %s",
 
1886
                                      "gdm_signals_init", "INT", strerror (errno));
 
1887
        }
 
1888
 
 
1889
        if (sigaction (SIGTERM, &term, NULL) < 0) {
 
1890
                gdm_common_fail_exit ("%s: Error setting up %s signal handler: %s",
 
1891
                                      "gdm_signals_init", "TERM", strerror (errno));
 
1892
        }
 
1893
 
 
1894
        sigfillset (&mask);
 
1895
        sigdelset (&mask, SIGTERM);
 
1896
        sigdelset (&mask, SIGHUP);
 
1897
        sigdelset (&mask, SIGINT);
1896
1898
    
1897
 
    if (sigprocmask (SIG_SETMASK, &mask, NULL) == -1) 
1898
 
        gdm_common_fail_exit ("Could not set signal mask!");
 
1899
        if (sigprocmask (SIG_SETMASK, &mask, NULL) == -1) 
 
1900
                gdm_common_fail_exit ("Could not set signal mask!");
1899
1901
}
1900
1902
 
1901
1903
GOptionEntry chooser_options [] = {
1902
 
       { "xdmaddress", '\0', 0, G_OPTION_ARG_STRING, &xdm_address,
 
1904
        { "xdmaddress", '\0', 0, G_OPTION_ARG_STRING, &xdm_address,
1903
1905
          N_("Socket for xdm communication"), N_("SOCKET") },
1904
 
       { "clientaddress", '\0', 0, G_OPTION_ARG_STRING, &client_address,
 
1906
        { "clientaddress", '\0', 0, G_OPTION_ARG_STRING, &client_address,
1905
1907
          N_("Client address to return in response to xdm"), N_("ADDRESS") },
1906
 
       { "connectionType", '\0', 0, G_OPTION_ARG_INT, &connection_type,
 
1908
        { "connectionType", '\0', 0, G_OPTION_ARG_INT, &connection_type,
1907
1909
          N_("Connection type to return in response to xdm"), N_("TYPE") },
1908
 
       { G_OPTION_REMAINING, NULL, 0, G_OPTION_ARG_STRING_ARRAY, &chooser_hosts,
 
1910
        { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &chooser_hosts,
1909
1911
          NULL, NULL },
1910
 
       { NULL }
1911
 
 };
 
1912
        { NULL }
 
1913
};
1912
1914
 
1913
1915
static gboolean
1914
1916
gdm_event (GSignalInvocationHint *ihint,
1924
1926
         * to a left mouse click */
1925
1927
        if (n_param_values != 2 ||
1926
1928
            !G_VALUE_HOLDS (&param_values[1], GDK_TYPE_EVENT))
1927
 
          return FALSE;
 
1929
                return FALSE;
1928
1930
        
1929
1931
        event = g_value_get_boxed (&param_values[1]);
1930
1932
        if ((event->type == GDK_BUTTON_PRESS ||
1940
1942
int 
1941
1943
main (int argc, char *argv[])
1942
1944
{
1943
 
    gchar *GdmHosts;
1944
 
    gchar **hosts_opt = NULL;
1945
 
    GOptionContext *ctx;
1946
 
    const char *gdm_version;
1947
 
    int i;
1948
 
    guint sid;
1949
 
 
1950
 
    stored_argv = g_new0 (char *, argc + 1);
1951
 
    for (i = 0; i < argc; i++)
1952
 
            stored_argv[i] = g_strdup (argv[i]);
1953
 
    stored_argv[i] = NULL;
1954
 
    stored_argc = argc;
1955
 
 
1956
 
    if (g_getenv ("RUNNING_UNDER_GDM") != NULL)
1957
 
            RUNNING_UNDER_GDM = TRUE;
1958
 
 
1959
 
    gdm_common_openlog ("gdmchooser", LOG_PID, LOG_DAEMON);
1960
 
 
1961
 
    bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR);
1962
 
    bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
1963
 
    textdomain (GETTEXT_PACKAGE);
1964
 
 
1965
 
    gtk_init (&argc, &argv);
1966
 
 
1967
 
    ctx = g_option_context_new (_("- gdm login chooser")); 
1968
 
    g_option_context_add_main_entries(ctx, chooser_options, _("main options"));
1969
 
    g_option_context_parse(ctx, &argc, &argv, NULL);
1970
 
    g_option_context_free(ctx);
1971
 
 
1972
 
    glade_init ();
1973
 
 
1974
 
    /* Read all configuration at once, so the values get cached */
1975
 
    gdm_read_config ();
1976
 
 
1977
 
    GdmHosts = g_strdup (gdm_config_get_string (GDM_KEY_HOSTS));
1978
 
 
1979
 
    /* if broadcasting, then append BROADCAST to hosts */
1980
 
    if (gdm_config_get_bool (GDM_KEY_BROADCAST)) {
1981
 
            gchar *tmp;
1982
 
            if (ve_string_empty (GdmHosts)) {
1983
 
                    tmp = "BROADCAST";
1984
 
            } else {
1985
 
                    tmp = g_strconcat (GdmHosts, ",BROADCAST", NULL);
1986
 
            }
1987
 
            g_free (GdmHosts);
1988
 
            GdmHosts = tmp;
1989
 
    }
 
1945
        gchar *GdmHosts;
 
1946
        gchar **hosts_opt = NULL;
 
1947
        GOptionContext *ctx;
 
1948
        const char *gdm_version;
 
1949
        int i;
 
1950
        guint sid;
 
1951
 
 
1952
        stored_argv = g_new0 (char *, argc + 1);
 
1953
        for (i = 0; i < argc; i++)
 
1954
                stored_argv[i] = g_strdup (argv[i]);
 
1955
        stored_argv[i] = NULL;
 
1956
        stored_argc = argc;
 
1957
 
 
1958
        if (g_getenv ("RUNNING_UNDER_GDM") != NULL)
 
1959
                RUNNING_UNDER_GDM = TRUE;
 
1960
 
 
1961
        bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR);
 
1962
        bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
 
1963
        textdomain (GETTEXT_PACKAGE);
 
1964
 
 
1965
        /*
 
1966
         * gdm_common_atspi_launch () needs gdk initialized.
 
1967
         * We cannot start gtk before the registry is running
 
1968
         * because the atk-bridge will crash.
 
1969
         */
 
1970
        gdk_init (&argc, &argv);
 
1971
        gdm_common_atspi_launch ();
 
1972
 
 
1973
        gtk_init (&argc, &argv);
 
1974
 
 
1975
        ctx = g_option_context_new (_("- gdm login chooser")); 
 
1976
        g_option_context_add_main_entries(ctx, chooser_options, _("main options"));
 
1977
        g_option_context_parse(ctx, &argc, &argv, NULL);
 
1978
        g_option_context_free(ctx);
 
1979
 
 
1980
        glade_init ();
 
1981
 
 
1982
        gdm_common_log_init ();
 
1983
        gdm_common_log_set_debug (gdm_config_get_bool (GDM_KEY_DEBUG));
 
1984
 
 
1985
        gdm_common_setup_builtin_icons ();
 
1986
 
 
1987
        /* Read all configuration at once, so the values get cached */
 
1988
        gdm_read_config ();
 
1989
 
 
1990
        GdmHosts = g_strdup (gdm_config_get_string (GDM_KEY_HOSTS));
 
1991
 
 
1992
        /* if broadcasting, then append BROADCAST to hosts */
 
1993
        if (gdm_config_get_bool (GDM_KEY_BROADCAST)) {
 
1994
                gchar *tmp;
 
1995
                if (ve_string_empty (GdmHosts)) {
 
1996
                        tmp = "BROADCAST";
 
1997
                } else {
 
1998
                        tmp = g_strconcat (GdmHosts, ",BROADCAST", NULL);
 
1999
                }
 
2000
                g_free (GdmHosts);
 
2001
                GdmHosts = tmp;
 
2002
        }
1990
2003
 
1991
2004
#ifdef ENABLE_IPV6
1992
 
    if (gdm_config_get_bool (GDM_KEY_MULTICAST)) {
1993
 
            gchar *tmp;
1994
 
            if (ve_string_empty (GdmHosts)) {
1995
 
                    tmp = "MULTICAST";
1996
 
            } else {
1997
 
                    tmp = g_strconcat (GdmHosts, ",MULTICAST", NULL);
1998
 
            }
1999
 
            g_free (GdmHosts);
2000
 
            GdmHosts = tmp;
2001
 
    }
 
2005
        if (gdm_config_get_bool (GDM_KEY_MULTICAST)) {
 
2006
                gchar *tmp;
 
2007
                if (ve_string_empty (GdmHosts)) {
 
2008
                        tmp = "MULTICAST";
 
2009
                } else {
 
2010
                        tmp = g_strconcat (GdmHosts, ",MULTICAST", NULL);
 
2011
                }
 
2012
                g_free (GdmHosts);
 
2013
                GdmHosts = tmp;
 
2014
        }
2002
2015
#endif
2003
2016
 
2004
 
    if (RUNNING_UNDER_GDM)
2005
 
            gdm_wm_screen_init (gdm_config_get_int (GDM_KEY_XINERAMA_SCREEN));
2006
 
 
2007
 
    gdm_version = g_getenv ("GDM_VERSION");
2008
 
 
2009
 
    /* Load the background as early as possible so GDM does not leave  */
2010
 
    /* the background unfilled.   The cursor should be a watch already */
2011
 
    /* but just in case */
2012
 
    if (RUNNING_UNDER_GDM) {
2013
 
        if (gdm_config_get_int (GDM_KEY_BACKGROUND_TYPE) != GDM_BACKGROUND_NONE)
2014
 
                gdm_common_setup_background_color (gdm_config_get_string (GDM_KEY_BACKGROUND_COLOR));
2015
 
 
2016
 
        gdm_common_setup_cursor (GDK_WATCH);
2017
 
    }
2018
 
 
2019
 
    if (RUNNING_UNDER_GDM &&
2020
 
        gdm_version != NULL &&
2021
 
        strcmp (gdm_version, VERSION) != 0) {
2022
 
            GtkWidget *dialog;
2023
 
            gchar *msg;
2024
 
 
2025
 
            gdm_wm_init (0);
2026
 
 
2027
 
            gdm_wm_focus_new_windows (TRUE);
2028
 
 
2029
 
            msg = g_strdup_printf (_("The chooser version (%s) does not match the daemon "
2030
 
                                     "version (%s).  "
2031
 
                                     "You have probably just upgraded GDM.  "
2032
 
                                     "Please restart the GDM daemon or the computer."),
2033
 
                                   VERSION, gdm_version);
2034
 
 
2035
 
            dialog = ve_hig_dialog_new (NULL /* parent */,
2036
 
                                        GTK_DIALOG_MODAL /* flags */,
2037
 
                                        GTK_MESSAGE_ERROR,
2038
 
                                        GTK_BUTTONS_OK,
2039
 
                                        _("Cannot run chooser"),
2040
 
                                        msg);
2041
 
            g_free (msg);
2042
 
            
2043
 
            gtk_widget_show_all (dialog);
2044
 
            gdm_wm_center_window (GTK_WINDOW (dialog));
2045
 
 
2046
 
            gdm_common_setup_cursor (GDK_LEFT_PTR);
2047
 
 
2048
 
            gtk_dialog_run (GTK_DIALOG (dialog));
2049
 
 
2050
 
            return EXIT_SUCCESS;
2051
 
    }
 
2017
        if (RUNNING_UNDER_GDM)
 
2018
                gdm_wm_screen_init (gdm_config_get_int (GDM_KEY_XINERAMA_SCREEN));
 
2019
 
 
2020
        gdm_version = g_getenv ("GDM_VERSION");
 
2021
 
 
2022
        /* Load the background as early as possible so GDM does not leave  */
 
2023
        /* the background unfilled.   The cursor should be a watch already */
 
2024
        /* but just in case */
 
2025
        if (RUNNING_UNDER_GDM) {
 
2026
                if (gdm_config_get_int (GDM_KEY_BACKGROUND_TYPE) != GDM_BACKGROUND_NONE)
 
2027
                        gdm_common_setup_background_color (gdm_config_get_string (GDM_KEY_BACKGROUND_COLOR));
 
2028
 
 
2029
                gdm_common_setup_cursor (GDK_WATCH);
 
2030
        }
 
2031
 
 
2032
        if (RUNNING_UNDER_GDM &&
 
2033
            gdm_version != NULL &&
 
2034
            strcmp (gdm_version, VERSION) != 0) {
 
2035
                GtkWidget *dialog;
 
2036
                gchar *msg;
 
2037
 
 
2038
                gdm_wm_init (0);
 
2039
 
 
2040
                gdm_wm_focus_new_windows (TRUE);
 
2041
 
 
2042
                msg = g_strdup_printf (_("The chooser version (%s) does not match the daemon "
 
2043
                                         "version (%s).  "
 
2044
                                         "You have probably just upgraded GDM.  "
 
2045
                                         "Please restart the GDM daemon or the computer."),
 
2046
                                       VERSION, gdm_version);
 
2047
 
 
2048
                dialog = hig_dialog_new (NULL /* parent */,
 
2049
                                         GTK_DIALOG_MODAL /* flags */,
 
2050
                                         GTK_MESSAGE_ERROR,
 
2051
                                         GTK_BUTTONS_OK,
 
2052
                                         _("Cannot run chooser"),
 
2053
                                         msg);
 
2054
                g_free (msg);
 
2055
 
 
2056
                gtk_widget_show_all (dialog);
 
2057
                gdm_wm_center_window (GTK_WINDOW (dialog));
 
2058
 
 
2059
                gdm_common_setup_cursor (GDK_LEFT_PTR);
 
2060
 
 
2061
                gtk_dialog_run (GTK_DIALOG (dialog));
 
2062
 
 
2063
                return EXIT_SUCCESS;
 
2064
        }
2052
2065
    
2053
 
    gtk_window_set_default_icon_from_file (DATADIR"/pixmaps/gdm-xnest.png", NULL);
2054
 
 
2055
 
    gdm_chooser_gui_init ();
2056
 
    gdm_chooser_signals_init ();
2057
 
 
2058
 
    /* when no hosts on the command line, take them from the config */
2059
 
    if (hosts_opt == NULL ||
2060
 
        hosts_opt[0] == NULL) {
2061
 
            int i;
2062
 
            hosts_opt = g_strsplit (GdmHosts, ",", -1);
2063
 
            for (i = 0; hosts_opt != NULL && hosts_opt[i] != NULL; i++) {
2064
 
                    g_strstrip (hosts_opt[i]);
2065
 
            }
2066
 
    }
2067
 
    gdm_chooser_xdmcp_init (hosts_opt);
2068
 
    g_strfreev (chooser_hosts);
2069
 
 
2070
 
    sid = g_signal_lookup ("event",
2071
 
                                 GTK_TYPE_WIDGET);
2072
 
    g_signal_add_emission_hook (sid,
2073
 
                                0 /* detail */,
2074
 
                                gdm_event,
2075
 
                                NULL /* data */,
2076
 
                                NULL /* destroy_notify */);
2077
 
 
2078
 
    gtk_widget_queue_resize (chooser);
2079
 
    gtk_widget_show_now (chooser);
2080
 
 
2081
 
    if (RUNNING_UNDER_GDM)
2082
 
            gdm_wm_center_window (GTK_WINDOW (chooser));
2083
 
 
2084
 
    if (RUNNING_UNDER_GDM &&
2085
 
        /* can it ever happen that it'd be NULL here ??? */
2086
 
        chooser->window != NULL) {
2087
 
            gdm_wm_init (GDK_WINDOW_XWINDOW (chooser->window));
2088
 
 
2089
 
            /* Run the focus, note that this will work no matter what
2090
 
             * since gdm_wm_init will set the display to the gdk one
2091
 
             * if it fails */
2092
 
            gdm_wm_focus_window (GDK_WINDOW_XWINDOW (chooser->window));
2093
 
    }
2094
 
 
2095
 
    if (gdm_config_get_bool (GDM_KEY_ALLOW_ADD))
2096
 
            gtk_widget_grab_focus (add_entry);
2097
 
 
2098
 
    gdm_chooser_add_entry_changed ();
2099
 
 
2100
 
    if (RUNNING_UNDER_GDM) {
2101
 
            gdm_wm_restore_wm_order ();
2102
 
            gdm_common_setup_cursor (GDK_LEFT_PTR);
2103
 
    }
2104
 
 
2105
 
    gtk_main ();
2106
 
 
2107
 
    exit (EXIT_SUCCESS);
 
2066
        gtk_window_set_default_icon_name ("gdm-xnest");
 
2067
 
 
2068
        gdm_chooser_gui_init ();
 
2069
        gdm_chooser_signals_init ();
 
2070
 
 
2071
        /* when no hosts on the command line, take them from the config */
 
2072
        if (hosts_opt == NULL ||
 
2073
            hosts_opt[0] == NULL) {
 
2074
                int i;
 
2075
                hosts_opt = g_strsplit (GdmHosts, ",", -1);
 
2076
                for (i = 0; hosts_opt != NULL && hosts_opt[i] != NULL; i++) {
 
2077
                        g_strstrip (hosts_opt[i]);
 
2078
                }
 
2079
        }
 
2080
        gdm_chooser_xdmcp_init (hosts_opt);
 
2081
        g_strfreev (hosts_opt);
 
2082
 
 
2083
        sid = g_signal_lookup ("event",
 
2084
                               GTK_TYPE_WIDGET);
 
2085
        g_signal_add_emission_hook (sid,
 
2086
                                    0 /* detail */,
 
2087
                                    gdm_event,
 
2088
                                    NULL /* data */,
 
2089
                                    NULL /* destroy_notify */);
 
2090
 
 
2091
        gtk_widget_queue_resize (chooser);
 
2092
        gtk_widget_show_now (chooser);
 
2093
 
 
2094
        if (RUNNING_UNDER_GDM)
 
2095
                gdm_wm_center_window (GTK_WINDOW (chooser));
 
2096
 
 
2097
        if (RUNNING_UNDER_GDM &&
 
2098
            /* can it ever happen that it'd be NULL here ??? */
 
2099
            chooser->window != NULL) {
 
2100
                gdm_wm_init (GDK_WINDOW_XWINDOW (chooser->window));
 
2101
 
 
2102
                /* Run the focus, note that this will work no matter what
 
2103
                 * since gdm_wm_init will set the display to the gdk one
 
2104
                 * if it fails */
 
2105
                gdm_wm_focus_window (GDK_WINDOW_XWINDOW (chooser->window));
 
2106
        }
 
2107
 
 
2108
        if (gdm_config_get_bool (GDM_KEY_ALLOW_ADD))
 
2109
                gtk_widget_grab_focus (add_entry);
 
2110
 
 
2111
        gdm_chooser_add_entry_changed ();
 
2112
 
 
2113
        if (RUNNING_UNDER_GDM) {
 
2114
                gdm_wm_restore_wm_order ();
 
2115
                gdm_common_setup_cursor (GDK_LEFT_PTR);
 
2116
        }
 
2117
 
 
2118
        gtk_main ();
 
2119
 
 
2120
        exit (EXIT_SUCCESS);
2108
2121
}
2109
 
 
2110
2122
/* EOF */