Support read/write device mode
authorshort <>
Mon, 20 Jan 2003 23:25:03 +0000 (23:25 +0000)
committershort <>
Mon, 20 Jan 2003 23:25:03 +0000 (23:25 +0000)
+file create
+file write

src/libcaptive/client/file.c
src/libcaptive/include/captive/client-file.h

index 182b7a0..ebecee8 100644 (file)
@@ -87,8 +87,8 @@ static const GTypeInfo captive_file_object_info={
 }
 
 
-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;
@@ -118,9 +118,9 @@ NTSTATUS err;
                        &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
@@ -134,8 +134,12 @@ NTSTATUS err;
                        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 */
@@ -149,6 +153,32 @@ NTSTATUS err;
 }
 
 
+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;
@@ -169,8 +199,8 @@ HANDLE file_Handle;
 }
 
 
-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;
@@ -212,6 +242,43 @@ LARGE_INTEGER file_offset;
 }
 
 
+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)
 {
index 1125439..f4819d1 100644 (file)
@@ -53,8 +53,12 @@ GType captive_file_object_get_type(void);
 
 GnomeVFSResult captive_file_new_open
                (CaptiveFileObject **captive_file_object_return,const gchar *pathname,GnomeVFSOpenMode mode);
-GnomeVFSResult captive_file_read
-               (CaptiveFileObject *captive_file_object,gpointer buffer,GnomeVFSFileSize num_bytes,GnomeVFSFileSize *bytes_read_return);
+GnomeVFSResult captive_file_new_create
+               (CaptiveFileObject **captive_file_object_return,const gchar *pathname,GnomeVFSOpenMode mode,gboolean exclusive,guint perm);
+GnomeVFSResult captive_file_read(CaptiveFileObject *captive_file_object,
+               gpointer buffer,GnomeVFSFileSize num_bytes,GnomeVFSFileSize *bytes_read_return);
+GnomeVFSResult captive_file_write(CaptiveFileObject *captive_file_object,
+               gconstpointer buffer,GnomeVFSFileSize num_bytes,GnomeVFSFileSize *bytes_written_return);
 GnomeVFSResult captive_file_seek
                (CaptiveFileObject *captive_file_object,GnomeVFSSeekPosition whence,GnomeVFSFileOffset offset);
 GnomeVFSResult captive_file_tell(CaptiveFileObject *captive_file_object,GnomeVFSFileOffset *offset_return);