/** * mdm_config_get_xserver_details * * Calls daemon to get details for an xserver config. */ static gchar * mdm_config_get_xserver_details (const gchar *xserver, const gchar *key) { gchar *command = NULL; gchar *result = NULL; gchar *temp; command = g_strdup_printf ("GET_SERVER_DETAILS %s %s", xserver, key); result = mdmcomm_call_mdm (command, NULL /* auth cookie */, "1.0.0.0", comm_tries); g_free (command); if (! result || ve_string_empty (result) || strncmp (result, "OK ", 3) != 0) { mdm_common_error ("Could not access xserver configuration"); if (result) g_free (result); return NULL; } /* skip the "OK " */ temp = g_strdup (result + 3); g_free (result); return temp; }
int main (int argc, char *argv[]) { GtkWidget *dialog; char *command; char *version; char *ret; const char *message; GOptionContext *ctx; bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); /* Option parsing */ ctx = g_option_context_new ("- New mdm login"); g_option_context_add_main_entries (ctx, options, _("main options")); g_option_context_parse (ctx, &argc, &argv, NULL); g_option_context_free (ctx); if (monte_carlo_pi) { calc_pi (); return 0; } mdm_log_init (); mdm_log_set_debug (debug_in); if (args_remaining != NULL && args_remaining[0] != NULL) server = args_remaining[0]; if (send_command != NULL) { if ( ! mdmcomm_check (FALSE)) { mdm_common_error (_("Error: MDM (MDM Display Manager) is not running.")); mdm_common_error (_("You might be using a different display manager.")); return 1; } } else { /* * The --command argument does not display anything, so avoid * running gtk_init until it finishes. Sometimes the * --command argument is used when there is no display so it * will fail and cause the program to exit, complaining about * "no display". */ gtk_init (&argc, &argv); if ( ! mdmcomm_check (TRUE)) { return 1; } } /* Start reading config data in bulk */ mdmcomm_comm_bulk_start (); /* Process --command option */ g_type_init (); if (send_command != NULL) { /* gdk_init is needed for cookie code to get display */ gdk_init (&argc, &argv); if (authenticate) auth_cookie = mdmcomm_get_auth_cookie (); /* * If asking for a translatable config value, then try to get * the translated value first. If this fails, then go ahead * and call the normal sockets command. */ if (strncmp (send_command, MDM_SUP_GET_CONFIG " ", strlen (MDM_SUP_GET_CONFIG " ")) == 0) { gchar *value = NULL; const char *key = &send_command[strlen (MDM_SUP_GET_CONFIG " ")]; if (is_key (MDM_KEY_WELCOME, key) || is_key (MDM_KEY_REMOTE_WELCOME, key)) { value = mdm_config_get_translated_string ((gchar *)key); if (value != NULL) { ret = g_strdup_printf ("OK %s", value); } } /* * If the above didn't return a value, then must be a * different key, so call mdmcomm_call_mdm. */ if (value == NULL) ret = mdmcomm_call_mdm (send_command, auth_cookie, "1.0.0.0", 5); } else { ret = mdmcomm_call_mdm (send_command, auth_cookie, "1.0.0.0", 5); } /* At this point we are done using the socket, so close it */ mdmcomm_comm_bulk_stop (); if (ret != NULL) { g_print ("%s\n", ret); return 0; } else { dialog = hig_dialog_new (NULL /* parent */, GTK_DIALOG_MODAL /* flags */, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Cannot communicate with MDM " "(The MDM Display Manager)"), _("Perhaps you have an old version " "of MDM running.")); gtk_widget_show_all (dialog); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); return 1; } } /* * Now process what mdmflexiserver is more frequently used to * do, start VT (Virtual Terminal) sesions - at least on * systems where it is supported. On systems where it is not * supporteed VT stands for "Very Tight" and will mess up your * display if you use it. Tight! So do not use it. * * I would accept a patch to disable it on such systems, but it * is easy to avoid not using it as long as your distro does not * put the menu choice in the application launch button on the * panel (don't ship the desktop file). */ /* * Always attempt to get cookie and authenticate. On remote * servers */ auth_cookie = mdmcomm_get_auth_cookie (); if (use_xnest) { char *cookie = mdmcomm_get_a_cookie (FALSE /* binary */); if (cookie == NULL) { /* At this point we are done using the socket, so close it */ mdmcomm_comm_bulk_stop (); dialog = hig_dialog_new (NULL /* parent */, GTK_DIALOG_MODAL /* flags */, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("You do not seem to have the " "authentication needed for this " "operation"), _("Perhaps your .Xauthority " "file is not set up correctly.")); gtk_widget_show_all (dialog); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); return 1; } command = g_strdup_printf (MDM_SUP_FLEXI_XNEST " %s %d %s %s", mdmcomm_get_display (), (int)getuid (), cookie, XauFileName ()); g_free (cookie); version = "1.0.0.0"; auth_cookie = NULL; } else { /* check for other displays/logged in users */ check_for_users (); if (auth_cookie == NULL) { /* At this point we are done using the socket, so close it */ mdmcomm_comm_bulk_stop (); dialog = hig_dialog_new (NULL /* parent */, GTK_DIALOG_MODAL /* flags */, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("You do not seem to be logged in on the " "console"), _("Starting a new login only " "works correctly on the console.")); gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE); gtk_widget_show_all (dialog); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); return 1; } read_servers (); server = choose_server (); if (server == NULL) command = g_strdup (MDM_SUP_FLEXI_XSERVER); else command = g_strdup_printf (MDM_SUP_FLEXI_XSERVER " %s", server); version = "1.0.0.0"; } ret = mdmcomm_call_mdm (command, auth_cookie, version, 5); g_free (command); g_free (auth_cookie); g_strfreev (args_remaining); /* At this point we are done using the socket, so close it */ mdmcomm_comm_bulk_stop (); if (ret != NULL && strncmp (ret, "OK ", 3) == 0) { /* if we switched to a different screen as a result of this, * lock the current screen */ if ( ! no_lock && ! use_xnest) { maybe_lock_screen (); } /* all fine and dandy */ g_free (ret); return 0; } message = mdmcomm_get_error_message (ret, use_xnest); dialog = hig_dialog_new (NULL /* parent */, GTK_DIALOG_MODAL /* flags */, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Cannot start new display"), message); gtk_widget_show_all (dialog); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); g_free (ret); return 1; }
/** * mdm_config_get_bool * * Gets int configuration value from daemon via GET_CONFIG * socket command. It stores the value in a hash so subsequent * access is faster. */ static gboolean _mdm_config_get_bool (const gchar *key, gboolean reload, gboolean *changed) { gboolean *hashretval = NULL; gchar *result; gboolean temp; if (bool_hash == NULL) bool_hash = g_hash_table_new (g_str_hash, g_str_equal); hashretval = mdm_config_hash_lookup (bool_hash, key); if (reload == FALSE && hashretval != NULL) return *hashretval; result = mdm_config_get_result (key); if ( ! result || ve_string_empty (result) || strncmp (result, "OK ", 3) != 0) { gchar *getdefault; mdm_common_error ("Could not access configuration key <%s>", key); /* Return the compiled in value associated with the key, if available. */ getdefault = strchr (key, '='); if (getdefault != NULL) getdefault++; /* Same logic as used in ve_config_get_bool */ if (getdefault != NULL && (getdefault[0] == 'T' || getdefault[0] == 't' || getdefault[0] == 'Y' || getdefault[0] == 'y' || atoi (getdefault) != 0)) { temp = TRUE; mdm_common_error ("Using compiled in value <TRUE> for <%s>", key); } else { temp = FALSE; mdm_common_error ("Using compiled in value <FALSE> for <%s>", key); } } else { /* skip the "OK " */ if (strcmp (ve_sure_string (result + 3), "true") == 0) temp = TRUE; else temp = FALSE; } if (result) g_free (result); if (hashretval == NULL) { gboolean *boolval = g_new0 (gboolean, 1); *boolval = temp; mdm_config_add_hash (bool_hash, key, boolval); if (changed != NULL) *changed = TRUE; return *boolval; } else { if (changed != NULL) { if (*hashretval != temp) *changed = TRUE; else *changed = FALSE; } *hashretval = temp; return *hashretval; } }
/** * mdm_config_get_int * * Gets int configuration value from daemon via GET_CONFIG * socket command. It stores the value in a hash so subsequent * access is faster. */ static gint _mdm_config_get_int (const gchar *key, gboolean reload, gboolean *changed) { gint *hashretval = NULL; gchar *result = NULL; gint temp; if (int_hash == NULL) int_hash = g_hash_table_new (g_str_hash, g_str_equal); hashretval = mdm_config_hash_lookup (int_hash, key); if (reload == FALSE && hashretval != NULL) return *hashretval; result = mdm_config_get_result (key); if ( ! result || ve_string_empty (result) || strncmp (result, "OK ", 3) != 0) { gchar *getdefault; mdm_common_error ("Could not access configuration key <%s>", key); /* Return the compiled in value associated with the key, if available. */ getdefault = strchr (key, '='); if (getdefault != NULL) getdefault++; temp = atoi (getdefault); mdm_common_error ("Using compiled in value <%d> for <%s>", temp, key); } else { /* skip the "OK " */ temp = atoi (result + 3); } if (result) g_free (result); if (hashretval == NULL) { gint *intval = g_new0 (gint, 1); *intval = temp; mdm_config_add_hash (int_hash, key, intval); if (changed != NULL) *changed = TRUE; return *intval; } else { if (changed != NULL) { if (*hashretval != temp) *changed = TRUE; else *changed = FALSE; } *hashretval = temp; return *hashretval; } }
/** * mdm_config_get_string * * Gets string configuration value from daemon via GET_CONFIG * socket command. It stores the value in a hash so subsequent * access is faster. */ static gchar * _mdm_config_get_string (const gchar *key, gboolean reload, gboolean *changed, gboolean doing_translated) { gchar *hashretval = NULL; gchar *result = NULL; gchar *temp; if (string_hash == NULL) string_hash = g_hash_table_new (g_str_hash, g_str_equal); hashretval = mdm_config_hash_lookup (string_hash, key); if (reload == FALSE && hashretval != NULL) return hashretval; result = mdm_config_get_result (key); if ( ! result || ve_string_empty (result) || strncmp (result, "OK ", 3) != 0) { gchar *getdefault; /* * If looking for a translated string, and not found, just return * NULL. */ if (doing_translated) { if (result) g_free (result); return NULL; } mdm_common_error ("Could not access configuration key <%s>", key); /* Return the compiled in value associated with the key, if available. */ getdefault = strchr (key, '='); if (getdefault != NULL) getdefault++; temp = g_strdup (getdefault); mdm_common_error ("Using compiled in value <%s> for <%s>", temp, key); } else { /* skip the "OK " */ temp = g_strdup (result + 3); } if (result) g_free (result); if (hashretval == NULL) { if (changed != NULL) *changed = TRUE; mdm_config_add_hash (string_hash, key, temp); } else { if (changed != NULL) { if (strcmp (ve_sure_string (hashretval), temp) != 0) *changed = TRUE; else *changed = FALSE; } g_hash_table_replace (string_hash, (void *)key, temp); } return temp; }
/** * mdm_config_get_xservers * * Calls daemon to get xserver config. */ GSList * mdm_config_get_xservers (gboolean flexible) { GSList *xservers = NULL; gchar **splitstr, **sec; gchar *command = NULL; gchar *result = NULL; gchar *temp; command = g_strdup_printf ("GET_SERVER_LIST"); result = mdmcomm_call_mdm (command, NULL /* auth cookie */, "1.0.0.0", comm_tries); g_free (command); if (! result || ve_string_empty (result) || strncmp (result, "OK ", 3) != 0) { mdm_common_error ("Could not access xserver configuration"); if (result) g_free (result); return NULL; } /* skip the "OK " */ splitstr = g_strsplit (result + 3, ";", 0); sec = splitstr; g_free (result); while (sec != NULL && *sec != NULL) { MdmXserver *svr = g_new0 (MdmXserver, 1); temp = mdm_config_get_xserver_details (*sec, "ID"); if (temp == NULL) { g_free (svr); continue; } svr->id = temp; temp = mdm_config_get_xserver_details (*sec, "NAME"); if (temp == NULL) { g_free (svr); continue; } svr->name = temp; temp = mdm_config_get_xserver_details (*sec, "COMMAND"); if (temp == NULL) { g_free (svr); continue; } svr->command = temp; temp = mdm_config_get_xserver_details (*sec, "FLEXIBLE"); if (temp == NULL) { g_free (svr); continue; } else if (g_strncasecmp (ve_sure_string (temp), "true", 4) == 0) svr->flexible = TRUE; else svr->flexible = FALSE; g_free (temp); temp = mdm_config_get_xserver_details (*sec, "CHOOSABLE"); if (temp == NULL) { g_free (svr); continue; } else if (g_strncasecmp (temp, "true", 4) == 0) svr->choosable = TRUE; else svr->choosable = FALSE; g_free (temp); temp = mdm_config_get_xserver_details (*sec, "HANDLED"); if (temp == NULL) { g_free (svr); continue; } else if (g_strncasecmp (temp, "true", 4) == 0) svr->handled = TRUE; else svr->handled = FALSE; g_free (temp); temp = mdm_config_get_xserver_details (*sec, "CHOOSER"); if (temp == NULL) { g_free (svr); continue; } else if (g_strncasecmp (temp, "true", 4) == 0) svr->chooser = TRUE; else svr->chooser = FALSE; g_free (temp); temp = mdm_config_get_xserver_details (*sec, "PRIORITY"); if (temp == NULL) { g_free (svr); continue; } else { svr->priority = atoi (temp); } g_free (temp); sec++; /* If only flexible was requested, then skip if not flexible */ if (flexible && !svr->flexible) { g_free (svr); continue; } xservers = g_slist_append (xservers, svr); } g_strfreev (splitstr); return xservers; }
int main (int argc, char *argv[]) { GtkWidget *dialog; char *ret; const char *message; GOptionContext *ctx; bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); /* Option parsing */ ctx = g_option_context_new ("- New mdm login"); g_option_context_add_main_entries (ctx, options, _("main options")); g_option_context_parse (ctx, &argc, &argv, NULL); g_option_context_free (ctx); mdm_log_init (); mdm_log_set_debug (debug_in); if (send_command != NULL) { if ( ! mdmcomm_is_daemon_running (FALSE)) { mdm_common_error (_("Error: MDM (MDM Display Manager) is not running.")); mdm_common_error (_("You might be using a different display manager.")); return 1; } } else { /* * The --command argument does not display anything, so avoid * running gtk_init until it finishes. Sometimes the * --command argument is used when there is no display so it * will fail and cause the program to exit, complaining about * "no display". */ gtk_init (&argc, &argv); if ( ! mdmcomm_is_daemon_running (TRUE)) { return 1; } } mdmcomm_open_connection_to_daemon (); /* Process --command option */ g_type_init (); if (send_command != NULL) { /* gdk_init is needed for cookie code to get display */ gdk_init (&argc, &argv); if (authenticate) auth_cookie = mdmcomm_get_auth_cookie (); /* * If asking for a translatable config value, then try to get * the translated value first. If this fails, then go ahead * and call the normal sockets command. */ if (strncmp (send_command, MDM_SUP_GET_CONFIG " ", strlen (MDM_SUP_GET_CONFIG " ")) == 0) { gchar *value = NULL; const char *key = &send_command[strlen (MDM_SUP_GET_CONFIG " ")]; if (is_key (MDM_KEY_WELCOME, key)) { value = mdm_config_get_translated_string ((gchar *)key); if (value != NULL) { ret = g_strdup_printf ("OK %s", value); } } /* * If the above didn't return a value, then must be a * different key, so call the daemon. */ if (value == NULL) ret = mdmcomm_send_cmd_to_daemon_with_args (send_command, auth_cookie, 5); } else { ret = mdmcomm_send_cmd_to_daemon_with_args (send_command, auth_cookie, 5); } /* At this point we are done using the socket, so close it */ mdmcomm_close_connection_to_daemon (); if (ret != NULL) { g_print ("%s\n", ret); return 0; } else { dialog = hig_dialog_new (NULL /* parent */, GTK_DIALOG_MODAL /* flags */, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Cannot communicate with MDM " "(The MDM Display Manager)"), _("Perhaps you have an old version " "of MDM running.")); gtk_widget_show_all (dialog); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); return 1; } } /* * Always attempt to get cookie and authenticate. On remote * servers */ auth_cookie = mdmcomm_get_auth_cookie (); /* check for other displays/logged in users */ check_for_users (); if (auth_cookie == NULL) { /* At this point we are done using the socket, so close it */ mdmcomm_close_connection_to_daemon (); dialog = hig_dialog_new (NULL /* parent */, GTK_DIALOG_MODAL /* flags */, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("You do not seem to be logged in on the " "console"), _("Starting a new login only " "works correctly on the console.")); gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE); gtk_widget_show_all (dialog); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); return 1; } ret = mdmcomm_send_cmd_to_daemon_with_args (MDM_SUP_FLEXI_XSERVER, auth_cookie, 5); g_free (auth_cookie); g_strfreev (args_remaining); /* At this point we are done using the socket, so close it */ mdmcomm_close_connection_to_daemon (); if (ret != NULL && strncmp (ret, "OK ", 3) == 0) { /* if we switched to a different screen as a result of this, * lock the current screen */ if ( ! no_lock ) { maybe_lock_screen (); } /* all fine and dandy */ g_free (ret); return 0; } message = mdmcomm_get_error_message (ret); dialog = hig_dialog_new (NULL /* parent */, GTK_DIALOG_MODAL /* flags */, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Cannot start new display"), message); gtk_widget_show_all (dialog); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); g_free (ret); return 1; }