Commit 78d211b3 authored by Alexandre Julliard's avatar Alexandre Julliard

server: Move the functions to extend file to mapping.c since it's the only user.

parent ddaf2384
......@@ -641,48 +641,6 @@ struct file *grab_file_unless_removable( struct file *file )
return (struct file *)grab_object( file );
}
/* extend a file beyond the current end of file */
static int extend_file( struct file *file, file_pos_t new_size )
{
static const char zero;
int unix_fd = get_file_unix_fd( file );
off_t size = new_size;
if (unix_fd == -1) return 0;
if (sizeof(new_size) > sizeof(size) && size != new_size)
{
set_error( STATUS_INVALID_PARAMETER );
return 0;
}
/* extend the file one byte beyond the requested size and then truncate it */
/* this should work around ftruncate implementations that can't extend files */
if (pwrite( unix_fd, &zero, 1, size ) != -1)
{
ftruncate( unix_fd, size );
return 1;
}
file_set_error();
return 0;
}
/* try to grow the file to the specified size */
int grow_file( struct file *file, file_pos_t size )
{
struct stat st;
int unix_fd = get_file_unix_fd( file );
if (unix_fd == -1) return 0;
if (fstat( unix_fd, &st ) == -1)
{
file_set_error();
return 0;
}
if (st.st_size >= size) return 1; /* already large enough */
return extend_file( file, size );
}
/* create a file */
DECL_HANDLER(create_file)
{
......
......@@ -110,7 +110,6 @@ extern struct file *get_file_obj( struct process *process, obj_handle_t handle,
extern int get_file_unix_fd( struct file *file );
extern int is_same_file( struct file *file1, struct file *file2 );
extern struct file *grab_file_unless_removable( struct file *file );
extern int grow_file( struct file *file, file_pos_t size );
extern struct file *create_temp_file( int access );
extern void file_set_error(void);
extern struct security_descriptor *mode_to_sd( mode_t mode, const SID *user, const SID *group );
......
......@@ -126,6 +126,48 @@ static void init_page_size(void)
#define ROUND_SIZE(size) (((size) + page_mask) & ~page_mask)
/* extend a file beyond the current end of file */
static int extend_file( struct file *file, file_pos_t new_size )
{
static const char zero;
int unix_fd = get_file_unix_fd( file );
off_t size = new_size;
if (unix_fd == -1) return 0;
if (sizeof(new_size) > sizeof(size) && size != new_size)
{
set_error( STATUS_INVALID_PARAMETER );
return 0;
}
/* extend the file one byte beyond the requested size and then truncate it */
/* this should work around ftruncate implementations that can't extend files */
if (pwrite( unix_fd, &zero, 1, size ) != -1)
{
ftruncate( unix_fd, size );
return 1;
}
file_set_error();
return 0;
}
/* try to grow the file to the specified size */
static int grow_file( struct file *file, file_pos_t size )
{
struct stat st;
int unix_fd = get_file_unix_fd( file );
if (unix_fd == -1) return 0;
if (fstat( unix_fd, &st ) == -1)
{
file_set_error();
return 0;
}
if (st.st_size >= size) return 1; /* already large enough */
return extend_file( file, size );
}
/* find the shared PE mapping for a given mapping */
static struct file *get_shared_file( struct mapping *mapping )
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment