}
-GnomeVFSResult captive_file_new_open
- (CaptiveFileObject **captive_file_object_return,const gchar *pathname,GnomeVFSOpenMode mode)
+static GnomeVFSResult captive_file_new_internal(CaptiveFileObject **captive_file_object_return,
+ const gchar *pathname,GnomeVFSOpenMode mode,gboolean create,gboolean create_exclusive,guint create_perm)
{
IO_STATUS_BLOCK file_IoStatusBlock;
GnomeVFSResult errvfsresult;
&file_ObjectAttributes, /* ObjectAttributes */
&file_IoStatusBlock, /* IoStatusBlock */
NULL, /* AllocationSize; ignored for open */
- FILE_ATTRIBUTE_NORMAL, /* FileAttributes; ignored for open */
- FILE_SHARE_WRITE, /* ShareAccess; 0 means exclusive */
- FILE_OPEN, /* CreateDisposition */
+ (!create || create_perm&0200 ? FILE_ATTRIBUTE_NORMAL: FILE_ATTRIBUTE_READONLY), /* FileAttributes; ignored for open */
+ (!create || !create_exclusive ? FILE_SHARE_DELETE : 0), /* ShareAccess; 0 means exclusive */
+ (!create ? FILE_OPEN : FILE_CREATE), /* CreateDisposition */
/* FILE_SYNCHRONOUS_IO_{,NON}ALERT: We need to allow W32 filesystem
* any waits to not to let it return STATUS_CANT_WAIT us.
* Alertability should have only effect on asynchronous events
0); /* Options */
g_free(file_ObjectAttributes.ObjectName); /* left from captive_file_uri_parent_init() */
g_return_val_if_fail(NT_SUCCESS(err)==NT_SUCCESS(file_IoStatusBlock.Status),GNOME_VFS_ERROR_GENERIC);
+ if (err==STATUS_OBJECT_NAME_COLLISION)
+ return GNOME_VFS_ERROR_FILE_EXISTS;
g_return_val_if_fail(NT_SUCCESS(err),GNOME_VFS_ERROR_GENERIC);
- g_return_val_if_fail(file_IoStatusBlock.Information==FILE_OPENED,GNOME_VFS_ERROR_GENERIC);
+ g_return_val_if_fail(file_IoStatusBlock.Information
+ ==(!create ? FILE_OPENED : FILE_CREATED),
+ GNOME_VFS_ERROR_GENERIC);
captive_file_object=g_object_new(
CAPTIVE_FILE_TYPE_OBJECT, /* object_type */
}
+GnomeVFSResult captive_file_new_open
+ (CaptiveFileObject **captive_file_object_return,const gchar *pathname,GnomeVFSOpenMode mode)
+{
+ g_return_val_if_fail(captive_file_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
+ g_return_val_if_fail(pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
+
+ return captive_file_new_internal(captive_file_object_return,pathname,mode,
+ FALSE, /* create */
+ FALSE, /* create_exclusive; ignored */
+ 0); /* create_perm; ignored */
+}
+
+
+GnomeVFSResult captive_file_new_create
+ (CaptiveFileObject **captive_file_object_return,const gchar *pathname,GnomeVFSOpenMode mode,gboolean exclusive,guint perm)
+{
+ g_return_val_if_fail(captive_file_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
+ g_return_val_if_fail(pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
+
+ return captive_file_new_internal(captive_file_object_return,pathname,mode,
+ TRUE, /* create */
+ exclusive, /* create_exclusive */
+ perm); /* create_perm */
+}
+
+
static GnomeVFSResult captive_file_close(CaptiveFileObject *captive_file_object)
{
NTSTATUS err;
}
-GnomeVFSResult captive_file_read
- (CaptiveFileObject *captive_file_object,gpointer buffer,GnomeVFSFileSize num_bytes,GnomeVFSFileSize *bytes_read_return)
+GnomeVFSResult captive_file_read(CaptiveFileObject *captive_file_object,
+ gpointer buffer,GnomeVFSFileSize num_bytes,GnomeVFSFileSize *bytes_read_return)
{
NTSTATUS err;
IO_STATUS_BLOCK file_IoStatusBlock;
}
+GnomeVFSResult captive_file_write(CaptiveFileObject *captive_file_object,
+ gconstpointer buffer,GnomeVFSFileSize num_bytes,GnomeVFSFileSize *bytes_written_return)
+{
+NTSTATUS err;
+IO_STATUS_BLOCK file_IoStatusBlock;
+LARGE_INTEGER file_offset;
+
+ if (CAPTIVE_IS_SANDBOX_PARENT())
+ return captive_sandbox_parent_file_write(captive_file_object,buffer,num_bytes,bytes_written_return);
+
+ g_return_val_if_fail(captive_file_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
+ g_return_val_if_fail(captive_file_object->file_Handle!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
+ g_return_val_if_fail(buffer!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
+ g_return_val_if_fail(bytes_written_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
+ g_return_val_if_fail(num_bytes==(ULONG)num_bytes,GNOME_VFS_ERROR_BAD_PARAMETERS);
+
+ file_offset.QuadPart=captive_file_object->offset;
+ err=NtWriteFile(
+ captive_file_object->file_Handle, /* FileHandle */
+ NULL, /* Event; completion signalling; optional */
+ NULL, /* ApcRoutine; optional */
+ NULL, /* ApcContext; optional */
+ &file_IoStatusBlock, /* IoStatusBlock */
+ (gpointer /* de-const */ )buffer, /* Buffer */
+ num_bytes, /* Length */
+ &file_offset, /* ByteOffset */
+ NULL); /* Key; NULL means no file locking key */
+ g_return_val_if_fail(NT_SUCCESS(err)==NT_SUCCESS(file_IoStatusBlock.Status),GNOME_VFS_ERROR_GENERIC);
+ g_return_val_if_fail(NT_SUCCESS(err),GNOME_VFS_ERROR_GENERIC);
+ g_return_val_if_fail(file_IoStatusBlock.Information==num_bytes,GNOME_VFS_ERROR_GENERIC);
+
+ captive_file_object->offset+=file_IoStatusBlock.Information;
+ *bytes_written_return=file_IoStatusBlock.Information;
+ return GNOME_VFS_OK;
+}
+
+
GnomeVFSResult captive_file_seek
(CaptiveFileObject *captive_file_object,GnomeVFSSeekPosition whence,GnomeVFSFileOffset offset)
{