Finished and deployed CORBA sandbox separation
[captive.git] / src / libcaptive / client / directory.c
index 36322c9..7960091 100644 (file)
 #include "reactos/ntos/types.h"        /* for HANDLE */
 #include "reactos/ddk/iotypes.h"       /* for IO_STATUS_BLOCK */
 #include "reactos/ddk/iofuncs.h"       /* for IoCreateFile() */
-#include "captive/sandbox.h"
 #include "result.h"
 #include "captive/leave.h"
 #include "captive/usecount.h"
+#include "vfs.h"
+#include "captive/parent-Directory.h"
 
 
 static gpointer captive_directory_object_parent_class=NULL;
@@ -40,12 +41,9 @@ static GnomeVFSResult captive_directory_close(CaptiveDirectoryObject *captive_di
 
 static void captive_directory_object_finalize(CaptiveDirectoryObject *captive_directory_object)
 {
-GnomeVFSResult errvfsresult;
-
        g_return_if_fail(captive_directory_object!=NULL);
 
-       errvfsresult=captive_directory_close(captive_directory_object);
-       g_assert(errvfsresult==GNOME_VFS_OK);
+       captive_directory_close(captive_directory_object);      /* errors ignored */
 
        G_OBJECT_CLASS(captive_directory_object_parent_class)->finalize((GObject *)captive_directory_object);
 }
@@ -94,22 +92,18 @@ static const GTypeInfo captive_directory_object_info={
 }
 
 
-static GnomeVFSResult captive_directory_new_internal(CaptiveDirectoryObject **captive_directory_object_return,
-               CaptiveVfsObject *captive_vfs_object,const gchar *pathname,gboolean create,guint create_perm)
+static GnomeVFSResult captive_directory_new_internal
+               (CaptiveDirectoryObject *captive_directory_object,const gchar *pathname,gboolean create,guint create_perm)
 {
 GnomeVFSResult errvfsresult;
 OBJECT_ATTRIBUTES dir_ObjectAttributes;
 HANDLE dir_Handle;
 IO_STATUS_BLOCK dir_IoStatusBlock;
 NTSTATUS err;
-CaptiveDirectoryObject *captive_directory_object;
 
-       g_return_val_if_fail(captive_directory_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
-       g_return_val_if_fail(captive_vfs_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
+       g_return_val_if_fail(captive_directory_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
        g_return_val_if_fail(pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
 
-       *captive_directory_object_return=NULL;
-
        errvfsresult=captive_ObjectAttributes_init(pathname,&dir_ObjectAttributes);
        g_return_val_if_fail(errvfsresult==GNOME_VFS_OK,errvfsresult);
        
@@ -145,14 +139,8 @@ CaptiveDirectoryObject *captive_directory_object;
                                        ==(!create ? FILE_OPENED : FILE_CREATED),
                        GNOME_VFS_ERROR_GENERIC);
 
-       captive_directory_object=g_object_new(
-                       CAPTIVE_DIRECTORY_TYPE_OBJECT,  /* object_type */
-                       NULL);  /* first_property_name; FIXME: support properties */
-
-       captive_directory_object->vfs=captive_vfs_object;
        captive_directory_object->dir_Handle=dir_Handle;
 
-       *captive_directory_object_return=captive_directory_object;
        return GNOME_VFS_OK;
 }
 
@@ -161,21 +149,31 @@ GnomeVFSResult captive_directory_new_open(CaptiveDirectoryObject **captive_direc
                CaptiveVfsObject *captive_vfs_object,const gchar *pathname)
 {
 GnomeVFSResult r;
-
-       if (CAPTIVE_IS_SANDBOX_PARENT())
-               return captive_sandbox_parent_directory_new_open(captive_directory_object_return,pathname);
+CaptiveDirectoryObject *captive_directory_object;
 
        g_return_val_if_fail(captive_directory_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
        g_return_val_if_fail(captive_vfs_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
        g_return_val_if_fail(pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
 
-       r=captive_directory_new_internal(captive_directory_object_return,captive_vfs_object,pathname,
+       captive_directory_object=g_object_new(
+                       CAPTIVE_DIRECTORY_TYPE_OBJECT,  /* object_type */
+                       NULL);  /* first_property_name; FIXME: support properties */
+       captive_directory_object->dir_Handle=NULL;
+       captive_directory_object->vfs=captive_vfs_object;
+       *captive_directory_object_return=captive_directory_object;
+
+       if (captive_vfs_object->is_sandbox_parent)
+               return captive_sandbox_parent_directory_new_open(captive_directory_object,pathname);
+
+       r=captive_directory_new_internal(captive_directory_object,pathname,
                        FALSE,  /* create */
                        0);     /* create_perm; ignored */
 
        captive_leave();
        if (r==GNOME_VFS_OK)
                captive_usecount(+1);
+       else
+               g_object_unref(captive_directory_object);
        return r;
 }
 
@@ -184,18 +182,31 @@ GnomeVFSResult captive_directory_new_make(CaptiveDirectoryObject **captive_direc
                CaptiveVfsObject *captive_vfs_object,const gchar *pathname,guint perm)
 {
 GnomeVFSResult r;
+CaptiveDirectoryObject *captive_directory_object;
 
        g_return_val_if_fail(captive_directory_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
        g_return_val_if_fail(captive_vfs_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
        g_return_val_if_fail(pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
 
-       r=captive_directory_new_internal(captive_directory_object_return,captive_vfs_object,pathname,
+       captive_directory_object=g_object_new(
+                       CAPTIVE_DIRECTORY_TYPE_OBJECT,  /* object_type */
+                       NULL);  /* first_property_name; FIXME: support properties */
+       captive_directory_object->dir_Handle=NULL;
+       captive_directory_object->vfs=captive_vfs_object;
+       *captive_directory_object_return=captive_directory_object;
+
+       if (captive_vfs_object->is_sandbox_parent)
+               return captive_sandbox_parent_directory_new_make(captive_directory_object,pathname,perm);
+
+       r=captive_directory_new_internal(captive_directory_object,pathname,
                        TRUE,   /* create */
                        perm);  /* create_perm; ignored */
 
        captive_leave();
        if (r==GNOME_VFS_OK)
                captive_usecount(+1);
+       else
+               g_object_unref(captive_directory_object);
        return r;
 }
 
@@ -348,18 +359,19 @@ static GnomeVFSResult captive_directory_close(CaptiveDirectoryObject *captive_di
 NTSTATUS err;
 HANDLE dir_Handle;
 
-       if (CAPTIVE_IS_SANDBOX_PARENT())
-               return captive_sandbox_parent_directory_close(captive_directory_object);
-
        g_return_val_if_fail(captive_directory_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
-       g_return_val_if_fail(captive_directory_object->dir_Handle!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);        /* already closed */
 
-       captive_usecount(-1);   /* close() errors notwithstanding */
+       if (captive_directory_object->vfs->is_sandbox_parent)
+               return captive_sandbox_parent_directory_close(captive_directory_object);
 
-       dir_Handle=captive_directory_object->dir_Handle;
-       captive_directory_object->dir_Handle=NULL;
-       err=NtClose(dir_Handle);
-       g_return_val_if_fail(NT_SUCCESS(err),GNOME_VFS_ERROR_GENERIC);
+       if (captive_directory_object->dir_Handle!=NULL) {       /* not yet already closed */
+               captive_usecount(-1);   /* close() errors notwithstanding */
+
+               dir_Handle=captive_directory_object->dir_Handle;
+               captive_directory_object->dir_Handle=NULL;
+               err=NtClose(dir_Handle);
+               g_return_val_if_fail(NT_SUCCESS(err),GNOME_VFS_ERROR_GENERIC);
+               }
 
        captive_leave();
        return GNOME_VFS_OK;
@@ -374,12 +386,13 @@ FILE_ID_BOTH_DIR_INFORMATION *FileIdBothDirInformation;
 FILE_BOTH_DIR_INFORMATION *FileBothDirInformation;
 GnomeVFSResult errvfsresult;
 
-       if (CAPTIVE_IS_SANDBOX_PARENT())
+       g_return_val_if_fail(captive_directory_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
+       g_return_val_if_fail(file_info!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
+
+       if (captive_directory_object->vfs->is_sandbox_parent)
                return captive_sandbox_parent_directory_read(captive_directory_object,file_info);
 
-       g_return_val_if_fail(captive_directory_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
        g_return_val_if_fail(captive_directory_object->dir_Handle!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
-       g_return_val_if_fail(file_info!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
 
        FileIdBothDirInformation=(void *)captive_directory_object->QueryDirectory_buf.FileIdBothDirInformation;
 retry:
@@ -468,6 +481,10 @@ IO_STATUS_BLOCK dir_IoStatusBlock;
 GnomeVFSResult errvfsresult;
 
        g_return_val_if_fail(captive_directory_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
+
+       if (captive_directory_object->vfs->is_sandbox_parent)
+               return captive_sandbox_parent_directory_remove(captive_directory_object);
+
        g_return_val_if_fail(captive_directory_object->dir_Handle!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
 
        FileDispositionInformation_struct.DoDeleteFile=TRUE;