...
This commit is contained in:
parent
3886f0ecac
commit
2830c9d748
9 changed files with 489 additions and 290 deletions
|
@ -8,8 +8,12 @@ msm_SOURCES= \
|
||||||
gui.h \
|
gui.h \
|
||||||
main.c \
|
main.c \
|
||||||
main.h \
|
main.h \
|
||||||
|
props.c \
|
||||||
|
props.h \
|
||||||
server.c \
|
server.c \
|
||||||
server.h \
|
server.h \
|
||||||
|
session.c \
|
||||||
|
session.h \
|
||||||
util.c \
|
util.c \
|
||||||
util.h
|
util.h
|
||||||
|
|
||||||
|
|
231
src/msm/client.c
231
src/msm/client.c
|
@ -20,6 +20,11 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "client.h"
|
#include "client.h"
|
||||||
|
#include "props.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
struct _MsmClient
|
struct _MsmClient
|
||||||
{
|
{
|
||||||
|
@ -33,35 +38,6 @@ struct _MsmClient
|
||||||
GList *properties;
|
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
|
#define DEFAULT_RESTART_STYLE SmRestartIfRunning
|
||||||
|
|
||||||
MsmClient*
|
MsmClient*
|
||||||
|
@ -168,7 +144,7 @@ msm_client_register (MsmClient *client,
|
||||||
|
|
||||||
SmsRegisterClientReply (client->cnxn, client->id);
|
SmsRegisterClientReply (client->cnxn, client->id);
|
||||||
|
|
||||||
p = SmsClientHostName (smsConn);
|
p = SmsClientHostName (client->cnxn);
|
||||||
client->hostname = g_strdup (p);
|
client->hostname = g_strdup (p);
|
||||||
free (p);
|
free (p);
|
||||||
}
|
}
|
||||||
|
@ -191,8 +167,6 @@ msm_client_interact_request (MsmClient *client)
|
||||||
void
|
void
|
||||||
msm_client_begin_interact (MsmClient *client)
|
msm_client_begin_interact (MsmClient *client)
|
||||||
{
|
{
|
||||||
g_return_if_fail (client->interact_requested);
|
|
||||||
|
|
||||||
SmsInteract (client->cnxn);
|
SmsInteract (client->cnxn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -234,7 +208,7 @@ msm_client_initial_save (MsmClient *client)
|
||||||
/* This is the save on client registration in the spec under
|
/* This is the save on client registration in the spec under
|
||||||
* RegisterClientReply
|
* RegisterClientReply
|
||||||
*/
|
*/
|
||||||
internal_save (client, SmSaveLocal, allow_interaction, shut_down);
|
internal_save (client, SmSaveLocal, FALSE, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -322,7 +296,7 @@ msm_client_set_property_taking_ownership (MsmClient *client,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
list = find_property_link_by_name (prop->name);
|
list = proplist_find_link_by_name (client->properties, prop->name);
|
||||||
if (list)
|
if (list)
|
||||||
{
|
{
|
||||||
SmFreeProperty (list->data);
|
SmFreeProperty (list->data);
|
||||||
|
@ -338,7 +312,7 @@ msm_client_set_property_taking_ownership (MsmClient *client,
|
||||||
if (strcmp (prop->name, "SmRestartStyleHint") == 0)
|
if (strcmp (prop->name, "SmRestartStyleHint") == 0)
|
||||||
{
|
{
|
||||||
int hint;
|
int hint;
|
||||||
if (get_card8_value (prop, &hint))
|
if (smprop_get_card8 (prop, &hint))
|
||||||
client->restart_style = hint;
|
client->restart_style = hint;
|
||||||
else
|
else
|
||||||
client->restart_style = DEFAULT_RESTART_STYLE;
|
client->restart_style = DEFAULT_RESTART_STYLE;
|
||||||
|
@ -351,7 +325,7 @@ msm_client_unset_property (MsmClient *client,
|
||||||
{
|
{
|
||||||
GList *list;
|
GList *list;
|
||||||
|
|
||||||
list = find_property_link_by_name (prop->name);
|
list = proplist_find_link_by_name (client->properties, name);
|
||||||
if (list)
|
if (list)
|
||||||
{
|
{
|
||||||
SmFreeProperty (list->data);
|
SmFreeProperty (list->data);
|
||||||
|
@ -375,7 +349,7 @@ msm_client_send_properties (MsmClient *client)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
n_props = g_list_length (client->properties);
|
n_props = g_list_length (client->properties);
|
||||||
props = g_new (SmProp, n_props);
|
props = g_new (SmProp*, n_props);
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
tmp = client->properties;
|
tmp = client->properties;
|
||||||
|
@ -391,186 +365,3 @@ msm_client_send_properties (MsmClient *client)
|
||||||
|
|
||||||
g_free (props);
|
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;
|
|
||||||
}
|
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "server.h"
|
#include "server.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
210
src/msm/props.c
Normal file
210
src/msm/props.c
Normal file
|
@ -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 <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
/* 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
55
src/msm/props.h
Normal file
55
src/msm/props.h
Normal file
|
@ -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 <glib.h>
|
||||||
|
#include <X11/ICE/ICElib.h>
|
||||||
|
#include <X11/SM/SMlib.h>
|
||||||
|
|
||||||
|
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
|
||||||
|
|
162
src/msm/server.c
162
src/msm/server.c
|
@ -41,8 +41,22 @@
|
||||||
* authorization from The Open Group.
|
* authorization from The Open Group.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <X11/ICE/ICEutil.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
|
||||||
#include "server.h"
|
#include "server.h"
|
||||||
#include "session.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
|
/* FIXME we need to time out anytime we're waiting for a client
|
||||||
* response, such as InteractDone, SaveYourselfDone, ConnectionClosed
|
* response, such as InteractDone, SaveYourselfDone, ConnectionClosed
|
||||||
|
@ -102,8 +116,8 @@ static void get_properties_callback (SmsConn cnxn,
|
||||||
|
|
||||||
static Status new_client_callback (SmsConn cnxn,
|
static Status new_client_callback (SmsConn cnxn,
|
||||||
SmPointer manager_data,
|
SmPointer manager_data,
|
||||||
unsigned long *maskRet,
|
unsigned long *mask_ret,
|
||||||
SmsCallbacks *callbacksRet,
|
SmsCallbacks *callbacks_ret,
|
||||||
char **failure_reason_ret);
|
char **failure_reason_ret);
|
||||||
static Bool host_auth_callback (char *hostname);
|
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 void ice_init (MsmServer *server);
|
||||||
|
|
||||||
static gboolean create_auth_entries (MsmServer *server,
|
static gboolean create_auth_entries (MsmServer *server,
|
||||||
IceListenObject *listen_objs,
|
IceListenObj *listen_objs,
|
||||||
int n_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)
|
msm_server_new_with_session (MsmSession *session)
|
||||||
{
|
{
|
||||||
char errbuf[256];
|
char errbuf[256];
|
||||||
|
@ -150,7 +165,7 @@ msm_server_new (const char *session_name)
|
||||||
{
|
{
|
||||||
MsmSession *session;
|
MsmSession *session;
|
||||||
|
|
||||||
session = msm_session_new (session_name);
|
session = msm_session_get (session_name);
|
||||||
|
|
||||||
return msm_server_new_with_session (session);
|
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.
|
* Whenever previous_id is non-NULL we need to free() it.
|
||||||
* (What an incredibly broken interface...)
|
* (What an incredibly broken interface...)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
MsmClient *client;
|
MsmClient *client;
|
||||||
|
MsmServer *server;
|
||||||
|
|
||||||
client = manager_data;
|
client = manager_data;
|
||||||
|
server = msm_client_get_server (client);
|
||||||
|
|
||||||
if (previous_id == NULL)
|
if (previous_id == NULL)
|
||||||
{
|
{
|
||||||
|
@ -446,7 +462,7 @@ delete_properties_callback (SmsConn cnxn,
|
||||||
i = 0;
|
i = 0;
|
||||||
while (i < numProps)
|
while (i < numProps)
|
||||||
{
|
{
|
||||||
msm_client_unset_property (propNames[i]);
|
msm_client_unset_property (client, propNames[i]);
|
||||||
|
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
|
@ -468,8 +484,8 @@ get_properties_callback (SmsConn cnxn,
|
||||||
static Status
|
static Status
|
||||||
new_client_callback (SmsConn cnxn,
|
new_client_callback (SmsConn cnxn,
|
||||||
SmPointer manager_data,
|
SmPointer manager_data,
|
||||||
unsigned long *maskRet,
|
unsigned long *mask_ret,
|
||||||
SmsCallbacks *callbacksRet,
|
SmsCallbacks *callbacks_ret,
|
||||||
char **failure_reason_ret)
|
char **failure_reason_ret)
|
||||||
{
|
{
|
||||||
MsmClient *client;
|
MsmClient *client;
|
||||||
|
@ -491,47 +507,47 @@ new_client_callback (SmsConn cnxn,
|
||||||
client = msm_client_new (server, cnxn);
|
client = msm_client_new (server, cnxn);
|
||||||
server->clients = g_list_prepend (server->clients, client);
|
server->clients = g_list_prepend (server->clients, client);
|
||||||
|
|
||||||
*maskRet = 0;
|
*mask_ret = 0;
|
||||||
|
|
||||||
*maskRet |= SmsRegisterClientProcMask;
|
*mask_ret |= SmsRegisterClientProcMask;
|
||||||
callbacksRet->register_client.callback = register_client_callback;
|
callbacks_ret->register_client.callback = register_client_callback;
|
||||||
callbacksRet->register_client.manager_data = client;
|
callbacks_ret->register_client.manager_data = client;
|
||||||
|
|
||||||
*maskRet |= SmsInteractRequestProcMask;
|
*mask_ret |= SmsInteractRequestProcMask;
|
||||||
callbacksRet->interact_request.callback = interact_request_callback;
|
callbacks_ret->interact_request.callback = interact_request_callback;
|
||||||
callbacksRet->interact_request.manager_data = client;
|
callbacks_ret->interact_request.manager_data = client;
|
||||||
|
|
||||||
*maskRet |= SmsInteractDoneProcMask;
|
*mask_ret |= SmsInteractDoneProcMask;
|
||||||
callbacksRet->interact_done.callback = interact_done_callback;
|
callbacks_ret->interact_done.callback = interact_done_callback;
|
||||||
callbacksRet->interact_done.manager_data = client;
|
callbacks_ret->interact_done.manager_data = client;
|
||||||
|
|
||||||
*maskRet |= SmsSaveYourselfRequestProcMask;
|
*mask_ret |= SmsSaveYourselfRequestProcMask;
|
||||||
callbacksRet->save_yourself_request.callback = save_yourself_request_callback;
|
callbacks_ret->save_yourself_request.callback = save_yourself_request_callback;
|
||||||
callbacksRet->save_yourself_request.manager_data = client;
|
callbacks_ret->save_yourself_request.manager_data = client;
|
||||||
|
|
||||||
*maskRet |= SmsSaveYourselfP2RequestProcMask;
|
*mask_ret |= SmsSaveYourselfP2RequestProcMask;
|
||||||
callbacksRet->save_yourself_phase2_request.callback = save_yourself_phase2_request_callback;
|
callbacks_ret->save_yourself_phase2_request.callback = save_yourself_phase2_request_callback;
|
||||||
callbacksRet->save_yourself_phase2_request.manager_data = client;
|
callbacks_ret->save_yourself_phase2_request.manager_data = client;
|
||||||
|
|
||||||
*maskRet |= SmsSaveYourselfDoneProcMask;
|
*mask_ret |= SmsSaveYourselfDoneProcMask;
|
||||||
callbacksRet->save_yourself_done.callback = save_yourself_done_callback;
|
callbacks_ret->save_yourself_done.callback = save_yourself_done_callback;
|
||||||
callbacksRet->save_yourself_done.manager_data = client;
|
callbacks_ret->save_yourself_done.manager_data = client;
|
||||||
|
|
||||||
*maskRet |= SmsCloseConnectionProcMask;
|
*mask_ret |= SmsCloseConnectionProcMask;
|
||||||
callbacksRet->close_connection.callback = close_connection_callback;
|
callbacks_ret->close_connection.callback = close_connection_callback;
|
||||||
callbacksRet->close_connection.manager_data = client;
|
callbacks_ret->close_connection.manager_data = client;
|
||||||
|
|
||||||
*maskRet |= SmsSetPropertiesProcMask;
|
*mask_ret |= SmsSetPropertiesProcMask;
|
||||||
callbacksRet->set_properties.callback = set_properties_callback;
|
callbacks_ret->set_properties.callback = set_properties_callback;
|
||||||
callbacksRet->set_properties.manager_data = client;
|
callbacks_ret->set_properties.manager_data = client;
|
||||||
|
|
||||||
*maskRet |= SmsDeletePropertiesProcMask;
|
*mask_ret |= SmsDeletePropertiesProcMask;
|
||||||
callbacksRet->delete_properties.callback = delete_properties_callback;
|
callbacks_ret->delete_properties.callback = delete_properties_callback;
|
||||||
callbacksRet->delete_properties.manager_data = client;
|
callbacks_ret->delete_properties.manager_data = client;
|
||||||
|
|
||||||
*maskRet |= SmsGetPropertiesProcMask;
|
*mask_ret |= SmsGetPropertiesProcMask;
|
||||||
callbacksRet->get_properties.callback = get_properties_callback;
|
callbacks_ret->get_properties.callback = get_properties_callback;
|
||||||
callbacksRet->get_properties.manager_data = client;
|
callbacks_ret->get_properties.manager_data = client;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -723,7 +739,7 @@ msm_server_consider_phase_change (MsmServer *server)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Write to disk. */
|
/* 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,
|
/* 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,
|
static void new_ice_connection (IceConn connection, IcePointer client_data,
|
||||||
Bool opening, IcePointer *watch_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. */
|
/* This is called when data is available on an ICE connection. */
|
||||||
static gboolean
|
static gboolean
|
||||||
process_ice_messages (GIOChannel *channel,
|
process_ice_messages (GIOChannel *channel,
|
||||||
|
@ -920,7 +932,7 @@ accept_connection (GIOChannel *channel,
|
||||||
GIOCondition condition,
|
GIOCondition condition,
|
||||||
gpointer client_data)
|
gpointer client_data)
|
||||||
{
|
{
|
||||||
IceListenObject *listen_obj;
|
IceListenObj listen_obj;
|
||||||
IceAcceptStatus status;
|
IceAcceptStatus status;
|
||||||
IceConnectStatus cstatus;
|
IceConnectStatus cstatus;
|
||||||
IceConn cnxn;
|
IceConn cnxn;
|
||||||
|
@ -1026,7 +1038,7 @@ ice_init (MsmServer *server)
|
||||||
|
|
||||||
g_io_add_watch (channel, G_IO_IN,
|
g_io_add_watch (channel, G_IO_IN,
|
||||||
accept_connection,
|
accept_connection,
|
||||||
&listen_objs[i]);
|
listen_objs[i]);
|
||||||
|
|
||||||
g_io_channel_unref (channel);
|
g_io_channel_unref (channel);
|
||||||
|
|
||||||
|
@ -1035,7 +1047,7 @@ ice_init (MsmServer *server)
|
||||||
|
|
||||||
if (!create_auth_entries (server, listen_objs, n_listen_objs))
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1068,9 +1080,9 @@ run_iceauth_script (const char *filename)
|
||||||
GError *err;
|
GError *err;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
argv[0] = "iceauth";
|
argv[0] = (char*) "iceauth";
|
||||||
argv[1] = "source";
|
argv[1] = (char*) "source";
|
||||||
argv[2] = filename;
|
argv[2] = (char*) filename;
|
||||||
argv[3] = NULL;
|
argv[3] = NULL;
|
||||||
|
|
||||||
err = NULL;
|
err = NULL;
|
||||||
|
@ -1095,9 +1107,37 @@ run_iceauth_script (const char *filename)
|
||||||
return TRUE;
|
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
|
static gboolean
|
||||||
create_auth_entries (MsmServer *server,
|
create_auth_entries (MsmServer *server,
|
||||||
IceListenObject *listen_objs,
|
IceListenObj *listen_objs,
|
||||||
int n_listen_objs)
|
int n_listen_objs)
|
||||||
{
|
{
|
||||||
FILE *addfp = NULL;
|
FILE *addfp = NULL;
|
||||||
|
@ -1122,7 +1162,7 @@ create_auth_entries (MsmServer *server,
|
||||||
msm_fatal (_("Could not create ICE authentication script: %s\n"),
|
msm_fatal (_("Could not create ICE authentication script: %s\n"),
|
||||||
err->message);
|
err->message);
|
||||||
g_assert_not_reached ();
|
g_assert_not_reached ();
|
||||||
return;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
addfp = fdopen (fd, "w");
|
addfp = fdopen (fd, "w");
|
||||||
|
@ -1141,7 +1181,7 @@ create_auth_entries (MsmServer *server,
|
||||||
msm_fatal (_("Could not create ICE authentication script: %s\n"),
|
msm_fatal (_("Could not create ICE authentication script: %s\n"),
|
||||||
err->message);
|
err->message);
|
||||||
g_assert_not_reached ();
|
g_assert_not_reached ();
|
||||||
return;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
removefp = fdopen (fd, "w");
|
removefp = fdopen (fd, "w");
|
||||||
|
@ -1206,15 +1246,15 @@ create_auth_entries (MsmServer *server,
|
||||||
if (removefp)
|
if (removefp)
|
||||||
fclose (removefp);
|
fclose (removefp);
|
||||||
|
|
||||||
if (addAuthFile)
|
if (add_file)
|
||||||
{
|
{
|
||||||
unlink (addAuthFile);
|
unlink (add_file);
|
||||||
free (addAuthFile);
|
free (add_file);
|
||||||
}
|
}
|
||||||
if (remAuthFile)
|
if (remove_file)
|
||||||
{
|
{
|
||||||
unlink (remAuthFile);
|
unlink (remove_file);
|
||||||
free (remAuthFile);
|
free (remove_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
|
@ -20,12 +20,24 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "session.h"
|
#include "session.h"
|
||||||
|
#include "util.h"
|
||||||
|
#include "props.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
typedef struct _MsmSavedClient MsmSavedClient;
|
typedef struct _MsmSavedClient MsmSavedClient;
|
||||||
|
|
||||||
struct _MsmSavedClient
|
struct _MsmSavedClient
|
||||||
{
|
{
|
||||||
char **restart_command;
|
char *id;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -48,6 +60,10 @@ typedef enum
|
||||||
|
|
||||||
static GHashTable *sessions = NULL;
|
static GHashTable *sessions = NULL;
|
||||||
|
|
||||||
|
MsmSavedClient *saved_new (void);
|
||||||
|
void saved_free (MsmSavedClient *saved);
|
||||||
|
|
||||||
|
|
||||||
static MsmSession* recover_failed_session (MsmSession *session,
|
static MsmSession* recover_failed_session (MsmSession *session,
|
||||||
MsmSessionFailureReason reason,
|
MsmSessionFailureReason reason,
|
||||||
const char *details);
|
const char *details);
|
||||||
|
@ -55,6 +71,13 @@ static MsmSession* recover_failed_session (MsmSession *session,
|
||||||
static gboolean parse_session_file (MsmSession *session,
|
static gboolean parse_session_file (MsmSession *session,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
||||||
|
void
|
||||||
|
msm_session_clear (MsmSession *session)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
msm_session_update_client (MsmSession *session,
|
msm_session_update_client (MsmSession *session,
|
||||||
MsmClient *client)
|
MsmClient *client)
|
||||||
|
@ -77,6 +100,7 @@ msm_session_client_id_known (MsmSession *session,
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
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*
|
static const char*
|
||||||
session_dir (void)
|
session_dir (void)
|
||||||
{
|
{
|
||||||
|
@ -109,14 +153,14 @@ set_close_on_exec (int fd)
|
||||||
val = fcntl (fd, F_GETFD, 0);
|
val = fcntl (fd, F_GETFD, 0);
|
||||||
if (val < 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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
val |= FD_CLOEXEC;
|
val |= FD_CLOEXEC;
|
||||||
|
|
||||||
if (fcntl (fd, F_SETFD, val) < 0)
|
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 */
|
/* Your basic Stevens cut-and-paste */
|
||||||
|
@ -146,7 +190,6 @@ msm_session_get_for_filename (const char *name,
|
||||||
int fd = -1;
|
int fd = -1;
|
||||||
GError *dir_error = NULL;
|
GError *dir_error = NULL;
|
||||||
GError *err;
|
GError *err;
|
||||||
gboolean use_global_file;
|
|
||||||
|
|
||||||
session = g_hash_table_lookup (sessions, filename);
|
session = g_hash_table_lookup (sessions, filename);
|
||||||
if (session)
|
if (session)
|
||||||
|
@ -160,7 +203,7 @@ msm_session_get_for_filename (const char *name,
|
||||||
session->lock_fd = -1;
|
session->lock_fd = -1;
|
||||||
|
|
||||||
dir_error = NULL;
|
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 save dir_error for later; if creating the file fails,
|
||||||
* we give dir_error in the reason.
|
* 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,
|
recover_failed_session (MsmSession *session,
|
||||||
MsmSessionFailureReason reason,
|
MsmSessionFailureReason reason,
|
||||||
const char *details)
|
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
|
static gboolean
|
||||||
|
|
|
@ -28,7 +28,9 @@ typedef struct _MsmSession MsmSession;
|
||||||
|
|
||||||
MsmSession* msm_session_get (const char *name);
|
MsmSession* msm_session_get (const char *name);
|
||||||
MsmSession* msm_session_get_failsafe (void);
|
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,
|
void msm_session_update_client (MsmSession *session,
|
||||||
MsmClient *client);
|
MsmClient *client);
|
||||||
void msm_session_remove_client (MsmSession *session,
|
void msm_session_remove_client (MsmSession *session,
|
||||||
|
|
|
@ -21,6 +21,13 @@
|
||||||
|
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
msm_fatal (const char *format, ...)
|
msm_fatal (const char *format, ...)
|
||||||
|
@ -130,7 +137,7 @@ msm_create_dir_and_parents (const char *dir,
|
||||||
const char*
|
const char*
|
||||||
msm_get_work_directory (void)
|
msm_get_work_directory (void)
|
||||||
{
|
{
|
||||||
static char *dir = NULL;
|
static const char *dir = NULL;
|
||||||
|
|
||||||
if (dir == NULL)
|
if (dir == NULL)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue