Fixed captive_file_write() for ntfs.sys of NT-5.1sp1 non-constant data-attrs
authorshort <>
Sat, 26 Apr 2003 10:53:29 +0000 (10:53 +0000)
committershort <>
Sat, 26 Apr 2003 10:53:29 +0000 (10:53 +0000)
 - NTFS needs to pre-set SetEndOfFile behind the write data range request

src/libcaptive/client/file.c

index f6a3d21..a7e8568 100644 (file)
@@ -260,6 +260,9 @@ GnomeVFSResult captive_file_write(CaptiveFileObject *captive_file_object,
 NTSTATUS err;
 IO_STATUS_BLOCK file_IoStatusBlock;
 LARGE_INTEGER file_offset;
+GnomeVFSFileInfo file_info;
+GnomeVFSFileSize endoffile_wanted;
+GnomeVFSResult errvfsresult;
 
        if (CAPTIVE_IS_SANDBOX_PARENT())
                return captive_sandbox_parent_file_write(captive_file_object,buffer,num_bytes,bytes_written_return);
@@ -270,6 +273,16 @@ LARGE_INTEGER file_offset;
        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);
 
+       if ((GnomeVFSFileOffset)(captive_file_object->offset+num_bytes) < captive_file_object->offset)
+               return GNOME_VFS_ERROR_TOO_BIG;
+       endoffile_wanted=captive_file_object->offset+num_bytes;
+       if (GNOME_VFS_OK!=(errvfsresult=captive_file_file_info_get(captive_file_object,&file_info)))
+               return errvfsresult;
+       if (file_info.size<endoffile_wanted) {
+               if (GNOME_VFS_OK!=(errvfsresult=captive_file_truncate(captive_file_object,endoffile_wanted)))
+                       return errvfsresult;
+               }
+
        file_offset.QuadPart=captive_file_object->offset;
        err=NtWriteFile(
                        captive_file_object->file_Handle,       /* FileHandle */