From 2830c9d74862700fdecd19675e8e5d4432afac38 Mon Sep 17 00:00:00 2001 From: Havoc Pennington Date: Sat, 15 Sep 2001 02:37:02 +0000 Subject: [PATCH] ... --- src/msm/Makefile.am | 4 + src/msm/client.c | 233 +++----------------------------------------- src/msm/main.c | 1 + src/msm/props.c | 210 +++++++++++++++++++++++++++++++++++++++ src/msm/props.h | 55 +++++++++++ src/msm/server.c | 162 ++++++++++++++++++------------ src/msm/session.c | 101 +++++++++++++++++-- src/msm/session.h | 4 +- src/msm/util.c | 9 +- 9 files changed, 489 insertions(+), 290 deletions(-) create mode 100644 src/msm/props.c create mode 100644 src/msm/props.h diff --git a/src/msm/Makefile.am b/src/msm/Makefile.am index 7d9a7cf99..8d4437c68 100644 --- a/src/msm/Makefile.am +++ b/src/msm/Makefile.am @@ -8,8 +8,12 @@ msm_SOURCES= \ gui.h \ main.c \ main.h \ + props.c \ + props.h \ server.c \ server.h \ + session.c \ + session.h \ util.c \ util.h diff --git a/src/msm/client.c b/src/msm/client.c index bcc831fd2..f6a17ed64 100644 --- a/src/msm/client.c +++ b/src/msm/client.c @@ -20,6 +20,11 @@ */ #include "client.h" +#include "props.h" +#include "util.h" + +#include +#include struct _MsmClient { @@ -33,35 +38,6 @@ struct _MsmClient GList *properties; }; -static GList* find_property_link_by_name (MsmClient *client, - const char *name); - -static SmProp* find_property_by_name (MsmClient *client, - const char *name); - -static gboolean find_card8_property (MsmClient *client, - const char *name, - int *result) - -static gboolean find_string_property (MsmClient *client, - const char *name, - char **result); - -static gboolean find_vector_property (MsmClient *client, - const char *name, - int *argcp, - char ***argvp); - -static gboolean get_card8_value (SmProp *prop, - int *result); -static gboolean get_string_value (SmProp *prop, - char **result); -static gboolean get_vector_value (SmProp *prop, - int *argcp, - char ***argvp); - -static SmProp* copy_property (SmProp *prop); - #define DEFAULT_RESTART_STYLE SmRestartIfRunning MsmClient* @@ -168,7 +144,7 @@ msm_client_register (MsmClient *client, SmsRegisterClientReply (client->cnxn, client->id); - p = SmsClientHostName (smsConn); + p = SmsClientHostName (client->cnxn); client->hostname = g_strdup (p); free (p); } @@ -190,9 +166,7 @@ msm_client_interact_request (MsmClient *client) void msm_client_begin_interact (MsmClient *client) -{ - g_return_if_fail (client->interact_requested); - +{ SmsInteract (client->cnxn); } @@ -234,7 +208,7 @@ msm_client_initial_save (MsmClient *client) /* This is the save on client registration in the spec under * RegisterClientReply */ - internal_save (client, SmSaveLocal, allow_interaction, shut_down); + internal_save (client, SmSaveLocal, FALSE, FALSE); } void @@ -322,7 +296,7 @@ msm_client_set_property_taking_ownership (MsmClient *client, return; } - list = find_property_link_by_name (prop->name); + list = proplist_find_link_by_name (client->properties, prop->name); if (list) { SmFreeProperty (list->data); @@ -338,7 +312,7 @@ msm_client_set_property_taking_ownership (MsmClient *client, if (strcmp (prop->name, "SmRestartStyleHint") == 0) { int hint; - if (get_card8_value (prop, &hint)) + if (smprop_get_card8 (prop, &hint)) client->restart_style = hint; else client->restart_style = DEFAULT_RESTART_STYLE; @@ -351,7 +325,7 @@ msm_client_unset_property (MsmClient *client, { GList *list; - list = find_property_link_by_name (prop->name); + list = proplist_find_link_by_name (client->properties, name); if (list) { SmFreeProperty (list->data); @@ -375,7 +349,7 @@ msm_client_send_properties (MsmClient *client) int i; n_props = g_list_length (client->properties); - props = g_new (SmProp, n_props); + props = g_new (SmProp*, n_props); i = 0; tmp = client->properties; @@ -391,186 +365,3 @@ msm_client_send_properties (MsmClient *client) g_free (props); } - -/* Property functions stolen from gnome-session */ - -static GList* -find_property_link_by_name (MsmClient *client, - const char *name) -{ - GList *list; - - for (list = client->properties; list; list = list->next) - { - SmProp *prop = (SmProp *) list->data; - if (strcmp (prop->name, name) == 0) - return list; - } - - return NULL; -} - - -SmProp* -find_property_by_name (MsmClient *client, const char *name) -{ - GList *list; - - list = find_property_link_by_name (client, name); - - return list ? list->data : NULL; -} - -gboolean -find_card8_property (MsmClient *client, const char *name, - int *result) -{ - SmProp *prop; - - g_return_val_if_fail (result != NULL, FALSE); - - prop = find_property_by_name (client, name); - if (prop == NULL) - return FALSE; - else - return get_card8_value (prop, result); -} - -gboolean -find_string_property (MsmClient *client, const char *name, - char **result) -{ - SmProp *prop; - - g_return_val_if_fail (result != NULL, FALSE); - - prop = find_property_by_name (client, name); - if (prop == NULL) - return FALSE; - else - return get_string_value (prop, result); -} - -gboolean -find_vector_property (MsmClient *client, const char *name, - int *argcp, char ***argvp) -{ - SmProp *prop; - - g_return_val_if_fail (argcp != NULL, FALSE); - g_return_val_if_fail (argvp != NULL, FALSE); - - prop = find_property_by_name (client, name); - if (prop == NULL) - return FALSE; - else - return get_vector_value (prop, argcp, argvp); -} - -static gboolean -get_card8_value (SmProp *prop, - int *result) -{ - g_return_val_if_fail (result != NULL, FALSE); - - if (strcmp (prop->type, SmCARD8) == 0) - { - char *p; - p = prop->vals[0].value; - *result = *p; - return TRUE; - } - else - return FALSE -} - -static gboolean -get_string_value (SmProp *prop, - char **result) -{ - g_return_val_if_fail (result != NULL, FALSE); - - if (strcmp (prop->type, SmARRAY8) == 0) - { - *result = g_malloc (prop->vals[0].length + 1); - memcpy (*result, prop->vals[0].value, prop->vals[0].length); - (*result)[prop->vals[0].length] = '\0'; - return TRUE; - } - else - return FALSE; -} - -static gboolean -get_vector_value (SmProp *prop, - int *argcp, - char ***argvp) -{ - g_return_val_if_fail (argcp != NULL, FALSE); - g_return_val_if_fail (argvp != NULL, FALSE); - - if (strcmp (prop->type, SmLISTofARRAY8) == 0) - { - int i; - - *argcp = prop->num_vals; - *argvp = g_new0 (char *, *argcp + 1); - for (i = 0; i < *argcp; ++i) - { - (*argvp)[i] = g_malloc (prop->vals[i].length + 1); - memcpy ((*argvp)[i], prop->vals[i].value, prop->vals[i].length); - (*argvp)[i][prop->vals[i].length] = '\0'; - } - - return TRUE; - } - else - return FALSE; -} - -static SmProp* -copy_property (SmProp *prop) -{ - int i; - SmProp *copy; - - /* This all uses malloc so we can use SmFreeProperty() */ - - copy = msm_non_glib_malloc (sizeof (SmProp)); - - if (prop->name) - copy->name = msm_non_glib_strdup (prop->name); - else - copy->name = NULL; - - if (prop->type) - copy->type = msm_non_glib_strdup (prop->type); - else - copy->type = NULL; - - copy->num_vals = prop->num_vals; - copy->vals = NULL; - - if (copy->num_vals > 0 && prop->vals) - { - copy->vals = msm_non_glib_malloc (sizeof (SmPropValue) * copy->num_vals); - - for (i = 0; i < copy->num_vals; i++) - { - if (prop->vals[i].value) - { - copy->vals[i].length = prop->vals[i].length; - copy->vals[i].value = msm_non_glib_malloc (copy->vals[i].length); - memcpy (copy->vals[i].value, prop->vals[i].value, - copy->vals[i].length); - } - else - { - copy->vals[i].length = 0; - copy->vals[i].value = NULL; - } - } - } - - return copy; -} diff --git a/src/msm/main.c b/src/msm/main.c index 4b87b2ac3..0280a3794 100644 --- a/src/msm/main.c +++ b/src/msm/main.c @@ -24,6 +24,7 @@ #include #include #include +#include #include "server.h" #include "util.h" diff --git a/src/msm/props.c b/src/msm/props.c new file mode 100644 index 000000000..fd0cf8600 --- /dev/null +++ b/src/msm/props.c @@ -0,0 +1,210 @@ +/* msm SmProp utils */ + +/* + * Copyright (C) 2001 Havoc Pennington + * + * 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., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ + +#include "props.h" +#include "util.h" + +#include +#include + +/* Property functions stolen from gnome-session */ + +GList* +proplist_find_link_by_name (GList *list, + const char *name) +{ + for (; list; list = list->next) + { + SmProp *prop = (SmProp *) list->data; + if (strcmp (prop->name, name) == 0) + return list; + } + + return NULL; +} + + +SmProp* +proplist_find_by_name (GList *list, const char *name) +{ + GList *ret; + + ret = proplist_find_link_by_name (list, name); + + return ret ? ret->data : NULL; +} + +gboolean +proplist_find_card8 (GList *list, const char *name, + int *result) +{ + SmProp *prop; + + g_return_val_if_fail (result != NULL, FALSE); + + prop = proplist_find_by_name (list, name); + if (prop == NULL) + return FALSE; + else + return smprop_get_card8 (prop, result); +} + +gboolean +proplist_find_string (GList *list, const char *name, + char **result) +{ + SmProp *prop; + + g_return_val_if_fail (result != NULL, FALSE); + + prop = proplist_find_by_name (list, name); + if (prop == NULL) + return FALSE; + else + return smprop_get_string (prop, result); +} + +gboolean +proplist_find_vector (GList *list, const char *name, + int *argcp, char ***argvp) +{ + SmProp *prop; + + g_return_val_if_fail (argcp != NULL, FALSE); + g_return_val_if_fail (argvp != NULL, FALSE); + + prop = proplist_find_by_name (list, name); + if (prop == NULL) + return FALSE; + else + return smprop_get_vector (prop, argcp, argvp); +} + +gboolean +smprop_get_card8 (SmProp *prop, + int *result) +{ + g_return_val_if_fail (result != NULL, FALSE); + + if (strcmp (prop->type, SmCARD8) == 0) + { + char *p; + p = prop->vals[0].value; + *result = *p; + return TRUE; + } + else + return FALSE; +} + +gboolean +smprop_get_string (SmProp *prop, + char **result) +{ + g_return_val_if_fail (result != NULL, FALSE); + + if (strcmp (prop->type, SmARRAY8) == 0) + { + *result = g_malloc (prop->vals[0].length + 1); + memcpy (*result, prop->vals[0].value, prop->vals[0].length); + (*result)[prop->vals[0].length] = '\0'; + return TRUE; + } + else + return FALSE; +} + +gboolean +smprop_get_vector (SmProp *prop, + int *argcp, + char ***argvp) +{ + g_return_val_if_fail (argcp != NULL, FALSE); + g_return_val_if_fail (argvp != NULL, FALSE); + + if (strcmp (prop->type, SmLISTofARRAY8) == 0) + { + int i; + + *argcp = prop->num_vals; + *argvp = g_new0 (char *, *argcp + 1); + for (i = 0; i < *argcp; ++i) + { + (*argvp)[i] = g_malloc (prop->vals[i].length + 1); + memcpy ((*argvp)[i], prop->vals[i].value, prop->vals[i].length); + (*argvp)[i][prop->vals[i].length] = '\0'; + } + + return TRUE; + } + else + return FALSE; +} + +SmProp* +smprop_copy (SmProp *prop) +{ + int i; + SmProp *copy; + + /* This all uses malloc so we can use SmFreeProperty() */ + + copy = msm_non_glib_malloc (sizeof (SmProp)); + + if (prop->name) + copy->name = msm_non_glib_strdup (prop->name); + else + copy->name = NULL; + + if (prop->type) + copy->type = msm_non_glib_strdup (prop->type); + else + copy->type = NULL; + + copy->num_vals = prop->num_vals; + copy->vals = NULL; + + if (copy->num_vals > 0 && prop->vals) + { + copy->vals = msm_non_glib_malloc (sizeof (SmPropValue) * copy->num_vals); + + for (i = 0; i < copy->num_vals; i++) + { + if (prop->vals[i].value) + { + copy->vals[i].length = prop->vals[i].length; + copy->vals[i].value = msm_non_glib_malloc (copy->vals[i].length); + memcpy (copy->vals[i].value, prop->vals[i].value, + copy->vals[i].length); + } + else + { + copy->vals[i].length = 0; + copy->vals[i].value = NULL; + } + } + } + + return copy; +} + + + diff --git a/src/msm/props.h b/src/msm/props.h new file mode 100644 index 000000000..92a05f944 --- /dev/null +++ b/src/msm/props.h @@ -0,0 +1,55 @@ +/* msm SmProp utils */ + +/* + * Copyright (C) 2001 Havoc Pennington + * + * 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., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ + +#ifndef MSM_PROPS_H +#define MSM_PROPS_H + +#include +#include +#include + +GList* proplist_find_link_by_name (GList *list, + const char *name); +SmProp* proplist_find_by_name (GList *list, + const char *name); +gboolean proplist_find_card8 (GList *list, + const char *name, + int *result); +gboolean proplist_find_string (GList *list, + const char *name, + char **result); +gboolean proplist_find_vector (GList *list, + const char *name, + int *argcp, + char ***argvp); + +gboolean smprop_get_card8 (SmProp *prop, + int *result); +gboolean smprop_get_string (SmProp *prop, + char **result); +gboolean smprop_get_vector (SmProp *prop, + int *argcp, + char ***argvp); + +SmProp* smprop_copy (SmProp *prop); + +#endif + diff --git a/src/msm/server.c b/src/msm/server.c index cae870825..4a318587e 100644 --- a/src/msm/server.c +++ b/src/msm/server.c @@ -41,8 +41,22 @@ * authorization from The Open Group. */ +#include + +#include +#include +#include +#include +#include +#include +#include + + #include "server.h" #include "session.h" +#include "util.h" + +#define MAGIC_COOKIE_LEN 16 /* FIXME we need to time out anytime we're waiting for a client * response, such as InteractDone, SaveYourselfDone, ConnectionClosed @@ -102,8 +116,8 @@ static void get_properties_callback (SmsConn cnxn, static Status new_client_callback (SmsConn cnxn, SmPointer manager_data, - unsigned long *maskRet, - SmsCallbacks *callbacksRet, + unsigned long *mask_ret, + SmsCallbacks *callbacks_ret, char **failure_reason_ret); static Bool host_auth_callback (char *hostname); @@ -111,11 +125,12 @@ static Bool host_auth_callback (char *hostname); static void ice_init (MsmServer *server); static gboolean create_auth_entries (MsmServer *server, - IceListenObject *listen_objs, + IceListenObj *listen_objs, int n_listen_objs); -static void free_auth_entries (IceAuthDataEntry *entries); +static void free_auth_entries (IceAuthDataEntry *entries, + int n_entries); -static void +static MsmServer* msm_server_new_with_session (MsmSession *session) { char errbuf[256]; @@ -150,7 +165,7 @@ msm_server_new (const char *session_name) { MsmSession *session; - session = msm_session_new (session_name); + session = msm_session_get (session_name); return msm_server_new_with_session (session); } @@ -223,10 +238,11 @@ register_client_callback (SmsConn cnxn, * Whenever previous_id is non-NULL we need to free() it. * (What an incredibly broken interface...) */ - MsmClient *client; + MsmServer *server; client = manager_data; + server = msm_client_get_server (client); if (previous_id == NULL) { @@ -446,7 +462,7 @@ delete_properties_callback (SmsConn cnxn, i = 0; while (i < numProps) { - msm_client_unset_property (propNames[i]); + msm_client_unset_property (client, propNames[i]); ++i; } @@ -468,8 +484,8 @@ get_properties_callback (SmsConn cnxn, static Status new_client_callback (SmsConn cnxn, SmPointer manager_data, - unsigned long *maskRet, - SmsCallbacks *callbacksRet, + unsigned long *mask_ret, + SmsCallbacks *callbacks_ret, char **failure_reason_ret) { MsmClient *client; @@ -491,47 +507,47 @@ new_client_callback (SmsConn cnxn, client = msm_client_new (server, cnxn); server->clients = g_list_prepend (server->clients, client); - *maskRet = 0; + *mask_ret = 0; - *maskRet |= SmsRegisterClientProcMask; - callbacksRet->register_client.callback = register_client_callback; - callbacksRet->register_client.manager_data = client; + *mask_ret |= SmsRegisterClientProcMask; + callbacks_ret->register_client.callback = register_client_callback; + callbacks_ret->register_client.manager_data = client; - *maskRet |= SmsInteractRequestProcMask; - callbacksRet->interact_request.callback = interact_request_callback; - callbacksRet->interact_request.manager_data = client; + *mask_ret |= SmsInteractRequestProcMask; + callbacks_ret->interact_request.callback = interact_request_callback; + callbacks_ret->interact_request.manager_data = client; - *maskRet |= SmsInteractDoneProcMask; - callbacksRet->interact_done.callback = interact_done_callback; - callbacksRet->interact_done.manager_data = client; + *mask_ret |= SmsInteractDoneProcMask; + callbacks_ret->interact_done.callback = interact_done_callback; + callbacks_ret->interact_done.manager_data = client; - *maskRet |= SmsSaveYourselfRequestProcMask; - callbacksRet->save_yourself_request.callback = save_yourself_request_callback; - callbacksRet->save_yourself_request.manager_data = client; + *mask_ret |= SmsSaveYourselfRequestProcMask; + callbacks_ret->save_yourself_request.callback = save_yourself_request_callback; + callbacks_ret->save_yourself_request.manager_data = client; - *maskRet |= SmsSaveYourselfP2RequestProcMask; - callbacksRet->save_yourself_phase2_request.callback = save_yourself_phase2_request_callback; - callbacksRet->save_yourself_phase2_request.manager_data = client; + *mask_ret |= SmsSaveYourselfP2RequestProcMask; + callbacks_ret->save_yourself_phase2_request.callback = save_yourself_phase2_request_callback; + callbacks_ret->save_yourself_phase2_request.manager_data = client; - *maskRet |= SmsSaveYourselfDoneProcMask; - callbacksRet->save_yourself_done.callback = save_yourself_done_callback; - callbacksRet->save_yourself_done.manager_data = client; + *mask_ret |= SmsSaveYourselfDoneProcMask; + callbacks_ret->save_yourself_done.callback = save_yourself_done_callback; + callbacks_ret->save_yourself_done.manager_data = client; - *maskRet |= SmsCloseConnectionProcMask; - callbacksRet->close_connection.callback = close_connection_callback; - callbacksRet->close_connection.manager_data = client; + *mask_ret |= SmsCloseConnectionProcMask; + callbacks_ret->close_connection.callback = close_connection_callback; + callbacks_ret->close_connection.manager_data = client; - *maskRet |= SmsSetPropertiesProcMask; - callbacksRet->set_properties.callback = set_properties_callback; - callbacksRet->set_properties.manager_data = client; + *mask_ret |= SmsSetPropertiesProcMask; + callbacks_ret->set_properties.callback = set_properties_callback; + callbacks_ret->set_properties.manager_data = client; - *maskRet |= SmsDeletePropertiesProcMask; - callbacksRet->delete_properties.callback = delete_properties_callback; - callbacksRet->delete_properties.manager_data = client; + *mask_ret |= SmsDeletePropertiesProcMask; + callbacks_ret->delete_properties.callback = delete_properties_callback; + callbacks_ret->delete_properties.manager_data = client; - *maskRet |= SmsGetPropertiesProcMask; - callbacksRet->get_properties.callback = get_properties_callback; - callbacksRet->get_properties.manager_data = client; + *mask_ret |= SmsGetPropertiesProcMask; + callbacks_ret->get_properties.callback = get_properties_callback; + callbacks_ret->get_properties.manager_data = client; return TRUE; } @@ -723,7 +739,7 @@ msm_server_consider_phase_change (MsmServer *server) } /* Write to disk. */ - msm_session_save (server->session); + msm_session_save (server->session, server); } /* msm_session_save() may have cancelled any shutdown that was in progress, @@ -845,10 +861,6 @@ static void ice_io_error_handler (IceConn connection); static void new_ice_connection (IceConn connection, IcePointer client_data, Bool opening, IcePointer *watch_data); -static void setup_authentication (MsmServer *server, - IceListenObject *listen_objs, - int n_listen_objs); - /* This is called when data is available on an ICE connection. */ static gboolean process_ice_messages (GIOChannel *channel, @@ -920,7 +932,7 @@ accept_connection (GIOChannel *channel, GIOCondition condition, gpointer client_data) { - IceListenObject *listen_obj; + IceListenObj listen_obj; IceAcceptStatus status; IceConnectStatus cstatus; IceConn cnxn; @@ -1026,7 +1038,7 @@ ice_init (MsmServer *server) g_io_add_watch (channel, G_IO_IN, accept_connection, - &listen_objs[i]); + listen_objs[i]); g_io_channel_unref (channel); @@ -1035,7 +1047,7 @@ ice_init (MsmServer *server) if (!create_auth_entries (server, listen_objs, n_listen_objs)) { - meta_fatal (_("Could not set up authentication")); + msm_fatal (_("Could not set up authentication")); return; } @@ -1068,9 +1080,9 @@ run_iceauth_script (const char *filename) GError *err; int status; - argv[0] = "iceauth"; - argv[1] = "source"; - argv[2] = filename; + argv[0] = (char*) "iceauth"; + argv[1] = (char*) "source"; + argv[2] = (char*) filename; argv[3] = NULL; err = NULL; @@ -1095,9 +1107,37 @@ run_iceauth_script (const char *filename) return TRUE; } +static void +printhex (FILE *fp, const char *data, int len) +{ + int i; + + for (i = 0; i < len; i++) + fprintf (fp, "%02x", data[i]); +} + +static void +write_iceauth (FILE *addfp, FILE *removefp, IceAuthDataEntry *entry) +{ + fprintf (addfp, + "add %s \"\" %s %s ", + entry->protocol_name, + entry->network_id, + entry->auth_name); + + printhex (addfp, entry->auth_data, entry->auth_data_length); + fprintf (addfp, "\n"); + + fprintf (removefp, + "remove protoname=%s protodata=\"\" netid=%s authname=%s\n", + entry->protocol_name, + entry->network_id, + entry->auth_name); +} + static gboolean create_auth_entries (MsmServer *server, - IceListenObject *listen_objs, + IceListenObj *listen_objs, int n_listen_objs) { FILE *addfp = NULL; @@ -1122,7 +1162,7 @@ create_auth_entries (MsmServer *server, msm_fatal (_("Could not create ICE authentication script: %s\n"), err->message); g_assert_not_reached (); - return; + return FALSE; } addfp = fdopen (fd, "w"); @@ -1141,7 +1181,7 @@ create_auth_entries (MsmServer *server, msm_fatal (_("Could not create ICE authentication script: %s\n"), err->message); g_assert_not_reached (); - return; + return FALSE; } removefp = fdopen (fd, "w"); @@ -1206,15 +1246,15 @@ create_auth_entries (MsmServer *server, if (removefp) fclose (removefp); - if (addAuthFile) + if (add_file) { - unlink (addAuthFile); - free (addAuthFile); + unlink (add_file); + free (add_file); } - if (remAuthFile) + if (remove_file) { - unlink (remAuthFile); - free (remAuthFile); + unlink (remove_file); + free (remove_file); } return FALSE; diff --git a/src/msm/session.c b/src/msm/session.c index f204993bf..492d0c30f 100644 --- a/src/msm/session.c +++ b/src/msm/session.c @@ -20,12 +20,24 @@ */ #include "session.h" +#include "util.h" +#include "props.h" + +#include +#include +#include +#include +#include +#include +#include + +#include typedef struct _MsmSavedClient MsmSavedClient; struct _MsmSavedClient { - char **restart_command; + char *id; }; @@ -48,6 +60,10 @@ typedef enum static GHashTable *sessions = NULL; +MsmSavedClient *saved_new (void); +void saved_free (MsmSavedClient *saved); + + static MsmSession* recover_failed_session (MsmSession *session, MsmSessionFailureReason reason, const char *details); @@ -55,6 +71,13 @@ static MsmSession* recover_failed_session (MsmSession *session, static gboolean parse_session_file (MsmSession *session, GError **error); +void +msm_session_clear (MsmSession *session) +{ + + +} + void msm_session_update_client (MsmSession *session, MsmClient *client) @@ -77,6 +100,7 @@ msm_session_client_id_known (MsmSession *session, { + return FALSE; } void @@ -86,6 +110,26 @@ msm_session_launch (MsmSession *session) } +MsmSavedClient* +saved_new (void) +{ + MsmSavedClient *saved; + + saved = g_new (MsmSavedClient, 1); + + saved->id = NULL; + + return saved; +} + +void +saved_free (MsmSavedClient *saved) +{ + g_free (saved->id); + + g_free (saved); +} + static const char* session_dir (void) { @@ -109,14 +153,14 @@ set_close_on_exec (int fd) val = fcntl (fd, F_GETFD, 0); if (val < 0) { - gconf_log (GCL_DEBUG, "couldn't F_GETFD: %s\n", g_strerror (errno)); + msm_warning ("couldn't F_GETFD: %s\n", g_strerror (errno)); return; } val |= FD_CLOEXEC; if (fcntl (fd, F_SETFD, val) < 0) - gconf_log (GCL_DEBUG, "couldn't F_SETFD: %s\n", g_strerror (errno)); + msm_warning ("couldn't F_SETFD: %s\n", g_strerror (errno)); } /* Your basic Stevens cut-and-paste */ @@ -146,7 +190,6 @@ msm_session_get_for_filename (const char *name, int fd = -1; GError *dir_error = NULL; GError *err; - gboolean use_global_file; session = g_hash_table_lookup (sessions, filename); if (session) @@ -160,7 +203,7 @@ msm_session_get_for_filename (const char *name, session->lock_fd = -1; dir_error = NULL; - msm_create_dir_and_parents (session_dir (), &dir_error); + msm_create_dir_and_parents (session_dir (), 0700, &dir_error); /* We save dir_error for later; if creating the file fails, * we give dir_error in the reason. */ @@ -309,13 +352,59 @@ msm_session_save (MsmSession *session, } -static void +static MsmSession* recover_failed_session (MsmSession *session, MsmSessionFailureReason reason, const char *details) { + /* FIXME, actually give option to recover, don't just complain */ + GtkWidget *dialog; + char *message; + message = NULL; + + switch (reason) + { + case MSM_SESSION_FAILURE_OPENING_FILE: + message = g_strdup_printf (_("Could not open the session \"%s.\""), + session->name); + break; + + case MSM_SESSION_FAILURE_LOCKING: + message = g_strdup_printf (_("You are already logged in elsewhere, using the session \"%s.\" You can only use a session from one location at a time."), + session->name); + break; + + case MSM_SESSION_FAILURE_BAD_FILE: + message = g_strdup_printf (_("The session file for session \"%s\" appears to be invalid or corrupted."), + session->name); + break; + + case MSM_SESSION_FAILURE_EMPTY: + message = g_strdup_printf (_("The session \"%s\" contains no applications."), + session->name); + break; + } + + dialog = gtk_message_dialog_new (NULL, + GTK_DIALOG_MODAL, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, + message); + g_free (message); + + gtk_dialog_run (GTK_DIALOG (dialog)); + + gtk_widget_destroy (dialog); + + exit (1); + + /* FIXME instead of exiting, always recover by coming up with some sort + * of session. Also, offer nice recovery options specific to each of the above + * failure modes. + */ + return NULL; } static gboolean diff --git a/src/msm/session.h b/src/msm/session.h index 815474417..8ddb33a84 100644 --- a/src/msm/session.h +++ b/src/msm/session.h @@ -28,7 +28,9 @@ typedef struct _MsmSession MsmSession; MsmSession* msm_session_get (const char *name); MsmSession* msm_session_get_failsafe (void); -void msm_session_save (MsmSession *session); +void msm_session_save (MsmSession *session, + MsmServer *server); +void msm_session_clear (MsmSession *session); void msm_session_update_client (MsmSession *session, MsmClient *client); void msm_session_remove_client (MsmSession *session, diff --git a/src/msm/util.c b/src/msm/util.c index 34144d760..c0ac856de 100644 --- a/src/msm/util.c +++ b/src/msm/util.c @@ -21,6 +21,13 @@ #include "util.h" #include +#include +#include +#include +#include +#include +#include + void msm_fatal (const char *format, ...) @@ -130,7 +137,7 @@ msm_create_dir_and_parents (const char *dir, const char* msm_get_work_directory (void) { - static char *dir = NULL; + static const char *dir = NULL; if (dir == NULL) {