diff options
Diffstat (limited to 'gui/gdmdynamic.c')
-rw-r--r-- | gui/gdmdynamic.c | 366 |
1 files changed, 0 insertions, 366 deletions
diff --git a/gui/gdmdynamic.c b/gui/gdmdynamic.c deleted file mode 100644 index 43fb97b8..00000000 --- a/gui/gdmdynamic.c +++ /dev/null @@ -1,366 +0,0 @@ -/* - * GDMcommunication routines - * (c)2001 Queen of England, (c)2002,2003 George Lebl - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -#include "config.h" -#include <gdk/gdkx.h> -#include <X11/Xauth.h> - -#include <stdlib.h> -#include <stdio.h> -#include <libgen.h> -#include <unistd.h> -#include <sys/types.h> -#include <signal.h> -#include <sys/socket.h> -#include <sys/stat.h> -#include <sys/un.h> -#include <errno.h> - -#include <glib/gi18n.h> - -#include "gdm.h" -#include "gdmcomm.h" -#include "gdmcommon.h" -#include "gdmconfig.h" - -static char *myname = NULL; /* name of this program */ - -static void -usage () -{ - fprintf (stderr, _("Usage: %s [-b][-v] and one of the following:\n"), myname); - fprintf (stderr, _("\t-a display\n")); - fprintf (stderr, _("\t-r display\n")); - fprintf (stderr, _("\t-d display\n")); - fprintf (stderr, _("\t-l [server_name]\n")); - fprintf (stderr, _("\t-t maximum tries to connect (default 15)\n")); - fprintf (stderr, _("\t-s sleep value (default 8)\n")); -} - -/* - * Note: gdmdynamic does work to deal with the socket being congested - * because it is intended that the an umlimited number of gdmdynamic - * requests could be made at any moment. It is the responsibility of - * gdmdynamic to manage the socket connection to the daemon to make sure - * that it does not starve the socket, especially since the GUI login - * program will also be using the socket on startup. - */ -int -main (int argc, char *argv[]) -{ - gchar *cstr; - gchar *version; - gchar *params = ""; - gchar *command = NULL; - gchar *ret = NULL; - gchar *cookie = NULL; - int optc; - int try_num = 0; - int max_tries = 15; - int sleep_val = 8; - int verbose = 0; - int background = 0; - gboolean error = TRUE; - gboolean conn_failed = FALSE; - - myname = basename (argv[0]); - argv[0] = myname; - version = "2.8.0.0"; - - g_type_init (); - - /* - * It's an error to use more than one of -a, -r, or -d, so turn - * error to FALSE if command is not set, and TRUE if command is - * not NULL. - */ - while ((optc = getopt (argc, argv, "a:d:r:t:s:blv")) != EOF) { - switch (optc) { - case 'a': - if (command == NULL) - error = FALSE; - else - error = TRUE; - command = GDM_SUP_ADD_DYNAMIC_DISPLAY; - params = optarg; - break; - - case 'b': - background = 1; - break; - - case 'd': - if (command == NULL) - error = FALSE; - else - error = TRUE; - command = GDM_SUP_REMOVE_DYNAMIC_DISPLAY; - params = optarg; - break; - - case 'l': - if (command == NULL) - error = FALSE; - else - error = TRUE; - command = GDM_SUP_ATTACHED_SERVERS; - break; - - case 'r': - if (command == NULL) - error = FALSE; - command = GDM_SUP_RELEASE_DYNAMIC_DISPLAYS; - params = optarg; - break; - - case 't': - max_tries = atoi (optarg); - break; - - case 's': - sleep_val = atoi (optarg); - break; - - case 'v': - verbose++; - break; - - case '?': - error = TRUE; - } - } - - if (error) { - usage (); - exit (1); - } - - /* process remaining option arguments for -l */ - if (command != NULL && strcmp (command, GDM_SUP_ATTACHED_SERVERS) == 0) - for (; optind<argc; optind++) - params = argv[optind]; - - /* handle background option by forking and exiting the parent */ - - if (background) { - if ((background = fork ()) != 0) { - if (background < 0) - exit (1); - else - exit (0); - } - } - - gdmcomm_set_debug (verbose); - /* - * If verbose is not on, then set quiet errors to TRUE since - * errors are expected and managed by gdmdynamic, so we want - * errors to be quiet. - */ - gdmcomm_set_quiet_errors (!verbose); - - if (params && strlen (params)) - cstr = g_strdup_printf ("%s %s", command, params); - else - cstr = g_strdup (command); - - /* Seed the random number generator in case we have to sleep. */ - srand (getpid () * time (NULL)); - - /* - * Setting comm_retries to 1 ensures that gdmdynamic will fail if - * it fails the first time to connect. We manage sleeping and - * retrying in gdmdynamic instead of wanting gdmcomm to manage - * this. - */ - gdm_config_set_comm_retries (1); - - /* - * Never cache config data because if it fails to connect, then - * we want it to reload config data over the socket and not - * default to the compiled in value. - */ - gdm_config_never_cache (TRUE); - - /* - * If the connection is so busy that it fails, then we do not - * want gdmdynamic to retry and further congest the connection. - * Instead gdmdynamic will manage backing off and trying again - * after waiting. - */ - do { - conn_failed = FALSE; - try_num++; - - /* - * Verify server is not busy, sleep if it is. No need to do this - * check if doing LIST since this does not much much load on the - * daemon. - */ - if (strcmp (command, GDM_SUP_ATTACHED_SERVERS) != 0) { - ret = gdmcomm_call_gdm (GDM_SUP_SERVER_BUSY, NULL, version, 1); - conn_failed = gdmcomm_did_connection_fail (); - if (ret == NULL) - conn_failed = TRUE; - else if (strncmp (ret, "OK", 2) == 0) { - ret += 2; - if (strlen (ret)) { - ret++; /* skip over space char */ - if (strcmp (ret, "true") == 0) { - conn_failed = TRUE; - if (verbose) - g_print (_("Server busy, will sleep.\n")); - } - } - } - } - - /* Start reading config data in bulk */ - gdmcomm_comm_bulk_start (); - - /* - * All other commands besides LIST need root cookie. Only bother - * getting the cookie if we haven't already gotten it since we do - * this in a loop. - */ - if (conn_failed == FALSE && - (strcmp (command, GDM_SUP_ATTACHED_SERVERS) != 0) && - (cookie == NULL)) { - gchar *GdmServAuthDir = NULL; - char *filename; - FILE *fp; - char buf[BUFSIZ]; - - GdmServAuthDir = gdm_config_get_string (GDM_KEY_SERV_AUTHDIR); - conn_failed = gdmcomm_did_connection_fail (); - - /* - * We can't build a cookie if the auth dir is NULL. - * Since we only connect once, this could happen if - * the daemon closed the connection due to too many - * subconnections, for example. So consider this - * getting a NULL value back a connection failed. - */ - if (ve_string_empty (GdmServAuthDir)) { - conn_failed = TRUE; - } - - if (conn_failed == FALSE) { - - filename = g_build_filename (GdmServAuthDir, ".cookie", NULL); - - VE_IGNORE_EINTR (fp = fopen (filename, "r")); - if (fp != NULL) { - fgets (buf, sizeof (buf), fp); - cookie = g_strdup (buf); - VE_IGNORE_EINTR (fclose (fp)); - } - g_free (filename); - } - } - - if (conn_failed == FALSE) { - /* Allow to fail if connection fails after 1 try */ - ret = gdmcomm_call_gdm (cstr, cookie, version, 1); - - /* Verify the connection did not fail */ - conn_failed = gdmcomm_did_connection_fail (); - - /* - * If the call returned NULL, there must be a failure - * talking to the daemon, consider this a connection - * failure. - */ - if (ret == NULL) { - conn_failed = TRUE; - } - } - - /* Done reading config data */ - gdmcomm_comm_bulk_stop (); - - /* - * If the connection failed, sleep and try again. The sleep time is - * somewhat random to ensure that if multiple calls to gdmdynamic - * all all failing to connect that they do not retry all at the - * same time. - */ - if (conn_failed == TRUE) { - /* Sleep at least 1 second */ - int rand_sleep = 1; - - - /* - * Make the sleep a bit random so if lots of calls hit the - * server at once, they are staggared. - */ - if (sleep_val > 0) - rand_sleep = ((int) ((rand () % 10)/2)) + sleep_val; - - - if (verbose) { - g_print (_("Connection to daemon failed, sleeping for %d seconds. Retry %d of %d\n"), - rand_sleep, try_num, max_tries); - } - - sleep (rand_sleep); - - /* Reset the connection failed flag so it can be tried again */ - gdmcomm_set_allow_sleep (TRUE); - } - } while ((conn_failed == TRUE) && (try_num < max_tries)); - - g_free (cstr); - if (cookie) - g_free (cookie); - - /* - * If we failed to connect to the daemon after trying a certain number of - * times, then return with code 2 to let the caller know that the failure - * was due to connection problems. The caller can decide to perhaps - * sleep a bit an try this command again. - */ - if (conn_failed == TRUE) { - /* This is a serious error, so print a message even if verbose is off */ - fprintf (stderr, _("Failed to connect to server after %d retries\n"), - try_num); - return 2; - } - - if (verbose && ret != NULL) - g_print ("%s\n", ret); - - if (ret != NULL && - strncmp (ret, "OK", 2) == 0) { - - if (strcmp (command, GDM_SUP_ATTACHED_SERVERS) == 0) { - ret += 2; - if (strlen (ret)) { - ret++; /* skip over space char */ - g_print ("%s\n", ret); - } - } - - /* Success! */ - return 0; - } - - return 1; -} |