From fe09adbaf133723a72504d6e3cc58e454a72890a Mon Sep 17 00:00:00 2001 From: short <> Date: Fri, 12 Sep 2003 19:43:34 +0000 Subject: [PATCH] Report all dirty objects corrupted by each sandbox crash. --- src/libcaptive/client/parent-connector.h | 12 +++++++++++- src/libcaptive/client/vfs-parent.c | 18 ++++++++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/libcaptive/client/parent-connector.h b/src/libcaptive/client/parent-connector.h index 7640105..0ffcde3 100644 --- a/src/libcaptive/client/parent-connector.h +++ b/src/libcaptive/client/parent-connector.h @@ -47,6 +47,7 @@ struct _CaptiveParentConnectorIface { GnomeVFSResult (*open)(CaptiveParentConnector *captive_parent_connector); GnomeVFSResult (*close)(CaptiveParentConnector *captive_parent_connector); + G_CONST_RETURN gchar *(*get_pathname)(CaptiveParentConnector *captive_parent_connector); }; typedef enum captive_parent_connector_flag_want { @@ -75,10 +76,18 @@ typedef enum captive_parent_connector_flag_want { CAPTIVE_PARENT_CONNECTOR_FLAG_WANT_ON, /* vfs */ \ CAPTIVE_PARENT_CONNECTOR_FLAG_WANT_OFF, /* corba_object */ \ CAPTIVE_PARENT_CONNECTOR_FLAG_WANT_ON /* dirty */ -#define CAPTIVE_PARENT_CONNECTOR_FLAGS_DISCONNECTED_OR_CLOSED \ +#define CAPTIVE_PARENT_CONNECTOR_FLAGS_CLOSED_DIRTY_OR_OPENED_DIRTY \ + CAPTIVE_PARENT_CONNECTOR_FLAG_WANT_ON, /* vfs */ \ + CAPTIVE_PARENT_CONNECTOR_FLAG_WANT_ANY, /* corba_object */ \ + CAPTIVE_PARENT_CONNECTOR_FLAG_WANT_ON /* dirty */ +#define CAPTIVE_PARENT_CONNECTOR_FLAGS_DISCONNECTED_OR_CLOSED_CLEAN \ CAPTIVE_PARENT_CONNECTOR_FLAG_WANT_ANY, /* vfs */ \ CAPTIVE_PARENT_CONNECTOR_FLAG_WANT_OFF, /* corba_object */ \ CAPTIVE_PARENT_CONNECTOR_FLAG_WANT_OFF /* dirty */ +#define CAPTIVE_PARENT_CONNECTOR_FLAGS_DISCONNECTED_OR_BROKEN_OR_CLOSED \ + CAPTIVE_PARENT_CONNECTOR_FLAG_WANT_ANY, /* vfs */ \ + CAPTIVE_PARENT_CONNECTOR_FLAG_WANT_OFF, /* corba_object */ \ + CAPTIVE_PARENT_CONNECTOR_FLAG_WANT_ANY /* dirty */ #define CAPTIVE_PARENT_CONNECTOR_FLAGS_OPENED \ CAPTIVE_PARENT_CONNECTOR_FLAG_WANT_ON, /* vfs */ \ CAPTIVE_PARENT_CONNECTOR_FLAG_WANT_ON, /* corba_object */ \ @@ -94,6 +103,7 @@ typedef enum captive_parent_connector_flag_want { void captive_parent_connector_init(CaptiveParentConnector *captive_parent_connector, CORBA_Object *corba_objectp,CaptiveVfsParentObject *captive_vfs_parent_object); +gboolean captive_parent_connector_dispose(CaptiveParentConnector *captive_parent_connector); void captive_parent_connector_finalize(CaptiveParentConnector *captive_parent_connector); GnomeVFSResult captive_parent_connector_connect(CaptiveParentConnector *captive_parent_connector); GnomeVFSResult captive_parent_connector_open(CaptiveParentConnector *captive_parent_connector); diff --git a/src/libcaptive/client/vfs-parent.c b/src/libcaptive/client/vfs-parent.c index 734295d..8d6412d 100644 --- a/src/libcaptive/client/vfs-parent.c +++ b/src/libcaptive/client/vfs-parent.c @@ -32,6 +32,7 @@ static gpointer captive_vfs_parent_object_parent_class=NULL; static GnomeVFSResult captive_vfs_parent_init(CaptiveVfsObject *captive_vfs_object); +static void captive_vfs_parent_object_dispose(CaptiveVfsParentObject *captive_vfs_parent_object); static void captive_vfs_parent_object_handler_detach(CaptiveVfsParentObject *captive_vfs_parent_object); static void captive_vfs_parent_object_handler_cease(CaptiveVfsParentObject *captive_vfs_parent_object); static void captive_vfs_parent_object_handler_abort(CaptiveVfsParentObject *captive_vfs_parent_object); @@ -41,12 +42,24 @@ static GnomeVFSResult captive_vfs_parent_volume_info_get (CaptiveVfsObject *captive_vfs_object,CaptiveVfsVolumeInfo *volume_info); -static void captive_vfs_parent_object_finalize(CaptiveVfsParentObject *captive_vfs_parent_object) +/* We need to close the filesystem during custom 'dispose' + * as the default GObject g_object_real_dispose() destroys all the signals + * first and we would not notify our Connectors during captive_vfs_parent_object_finalize(). + */ +static void captive_vfs_parent_object_dispose(CaptiveVfsParentObject *captive_vfs_parent_object) { g_return_if_fail(captive_vfs_parent_object!=NULL); captive_vfs_parent_close(CAPTIVE_VFS_OBJECT(captive_vfs_parent_object)); /* errors ignored */ + G_OBJECT_CLASS(captive_vfs_parent_object_parent_class)->dispose((GObject *)captive_vfs_parent_object); +} + + +static void captive_vfs_parent_object_finalize(CaptiveVfsParentObject *captive_vfs_parent_object) +{ + g_return_if_fail(captive_vfs_parent_object!=NULL); + G_OBJECT_CLASS(captive_vfs_parent_object_parent_class)->finalize((GObject *)captive_vfs_parent_object); } @@ -57,6 +70,7 @@ GObjectClass *gobject_class=G_OBJECT_CLASS(class); CaptiveVfsObjectClass *captive_vfs_object_class=CAPTIVE_VFS_OBJECT_CLASS(class); captive_vfs_parent_object_parent_class=g_type_class_ref(g_type_parent(G_TYPE_FROM_CLASS(class))); + gobject_class->dispose=(void (*)(GObject *object))captive_vfs_parent_object_dispose; gobject_class->finalize=(void (*)(GObject *object))captive_vfs_parent_object_finalize; captive_vfs_object_class->init=captive_vfs_parent_init; @@ -168,7 +182,7 @@ GnomeVFSResult r; captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(captive_vfs_object); if (captive_vfs_parent_object->corba_Vfs_object!=CORBA_OBJECT_NIL) { - r=captive_sandbox_parent_vfs_close(captive_vfs_parent_object); + r=captive_vfs_parent_object_disconnect(captive_vfs_parent_object); g_assert(captive_vfs_parent_object->corba_Vfs_object==CORBA_OBJECT_NIL); } else -- 1.8.3.1