server: Add a default access mapping function for files, and use it for devices too.

This commit is contained in:
Alexandre Julliard 2007-10-02 14:20:15 +02:00
parent 4a5ba4c732
commit 24001e8ddc
9 changed files with 21 additions and 68 deletions

View File

@ -157,7 +157,6 @@ struct dir
}; };
static struct fd *dir_get_fd( struct object *obj ); static struct fd *dir_get_fd( struct object *obj );
static unsigned int dir_map_access( struct object *obj, unsigned int access );
static void dir_dump( struct object *obj, int verbose ); static void dir_dump( struct object *obj, int verbose );
static void dir_destroy( struct object *obj ); static void dir_destroy( struct object *obj );
@ -171,7 +170,7 @@ static const struct object_ops dir_ops =
no_satisfied, /* satisfied */ no_satisfied, /* satisfied */
no_signal, /* signal */ no_signal, /* signal */
dir_get_fd, /* get_fd */ dir_get_fd, /* get_fd */
dir_map_access, /* map_access */ default_fd_map_access, /* map_access */
no_lookup_name, /* lookup_name */ no_lookup_name, /* lookup_name */
no_open_file, /* open_file */ no_open_file, /* open_file */
fd_close_handle, /* close_handle */ fd_close_handle, /* close_handle */
@ -289,15 +288,6 @@ static struct fd *dir_get_fd( struct object *obj )
return (struct fd *)grab_object( dir->fd ); return (struct fd *)grab_object( dir->fd );
} }
static unsigned int dir_map_access( struct object *obj, unsigned int access )
{
if (access & GENERIC_READ) access |= FILE_GENERIC_READ;
if (access & GENERIC_WRITE) access |= FILE_GENERIC_WRITE;
if (access & GENERIC_EXECUTE) access |= FILE_GENERIC_EXECUTE;
if (access & GENERIC_ALL) access |= FILE_ALL_ACCESS;
return access & ~(GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL);
}
static struct change_record *get_first_change_record( struct dir *dir ) static struct change_record *get_first_change_record( struct dir *dir )
{ {
struct list *ptr = list_head( &dir->change_records ); struct list *ptr = list_head( &dir->change_records );

View File

@ -130,7 +130,7 @@ static const struct object_ops device_ops =
no_satisfied, /* satisfied */ no_satisfied, /* satisfied */
no_signal, /* signal */ no_signal, /* signal */
device_get_fd, /* get_fd */ device_get_fd, /* get_fd */
no_map_access, /* map_access */ default_fd_map_access, /* map_access */
no_lookup_name, /* lookup_name */ no_lookup_name, /* lookup_name */
device_open_file, /* open_file */ device_open_file, /* open_file */
no_close_handle, /* close_handle */ no_close_handle, /* close_handle */

View File

@ -36,7 +36,7 @@
#include "handle.h" #include "handle.h"
#include "request.h" #include "request.h"
#include "process.h" #include "process.h"
#include "object.h" #include "file.h"
#include "unicode.h" #include "unicode.h"
#define HASH_SIZE 7 /* default hash size */ #define HASH_SIZE 7 /* default hash size */
@ -48,7 +48,6 @@ struct directory
}; };
static void directory_dump( struct object *obj, int verbose ); static void directory_dump( struct object *obj, int verbose );
static unsigned int directory_map_access( struct object *obj, unsigned int access );
static struct object *directory_lookup_name( struct object *obj, struct unicode_str *name, static struct object *directory_lookup_name( struct object *obj, struct unicode_str *name,
unsigned int attr ); unsigned int attr );
static void directory_destroy( struct object *obj ); static void directory_destroy( struct object *obj );
@ -63,7 +62,7 @@ static const struct object_ops directory_ops =
NULL, /* satisfied */ NULL, /* satisfied */
no_signal, /* signal */ no_signal, /* signal */
no_get_fd, /* get_fd */ no_get_fd, /* get_fd */
directory_map_access, /* map_access */ default_fd_map_access, /* map_access */
directory_lookup_name, /* lookup_name */ directory_lookup_name, /* lookup_name */
no_open_file, /* open_file */ no_open_file, /* open_file */
no_close_handle, /* close_handle */ no_close_handle, /* close_handle */
@ -123,15 +122,6 @@ static struct object *directory_lookup_name( struct object *obj, struct unicode_
return NULL; return NULL;
} }
static unsigned int directory_map_access( struct object *obj, unsigned int access )
{
if (access & GENERIC_READ) access |= FILE_GENERIC_READ;
if (access & GENERIC_WRITE) access |= FILE_GENERIC_WRITE;
if (access & GENERIC_EXECUTE) access |= FILE_GENERIC_EXECUTE;
if (access & GENERIC_ALL) access |= FILE_ALL_ACCESS;
return access & ~(GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL);
}
static void directory_destroy( struct object *obj ) static void directory_destroy( struct object *obj )
{ {
struct directory *dir = (struct directory *)obj; struct directory *dir = (struct directory *)obj;

View File

@ -1710,6 +1710,16 @@ int default_fd_signaled( struct object *obj, struct thread *thread )
return ret; return ret;
} }
/* default map_access() routine for objects that behave like an fd */
unsigned int default_fd_map_access( struct object *obj, unsigned int access )
{
if (access & GENERIC_READ) access |= FILE_GENERIC_READ;
if (access & GENERIC_WRITE) access |= FILE_GENERIC_WRITE;
if (access & GENERIC_EXECUTE) access |= FILE_GENERIC_EXECUTE;
if (access & GENERIC_ALL) access |= FILE_ALL_ACCESS;
return access & ~(GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL);
}
int default_fd_get_poll_events( struct fd *fd ) int default_fd_get_poll_events( struct fd *fd )
{ {
int events = 0; int events = 0;

View File

@ -65,7 +65,6 @@ static unsigned int generic_file_map_access( unsigned int access );
static void file_dump( struct object *obj, int verbose ); static void file_dump( struct object *obj, int verbose );
static struct fd *file_get_fd( struct object *obj ); static struct fd *file_get_fd( struct object *obj );
static unsigned int file_map_access( struct object *obj, unsigned int access );
static void file_destroy( struct object *obj ); static void file_destroy( struct object *obj );
static int file_get_poll_events( struct fd *fd ); static int file_get_poll_events( struct fd *fd );
@ -82,7 +81,7 @@ static const struct object_ops file_ops =
no_satisfied, /* satisfied */ no_satisfied, /* satisfied */
no_signal, /* signal */ no_signal, /* signal */
file_get_fd, /* get_fd */ file_get_fd, /* get_fd */
file_map_access, /* map_access */ default_fd_map_access, /* map_access */
no_lookup_name, /* lookup_name */ no_lookup_name, /* lookup_name */
no_open_file, /* open_file */ no_open_file, /* open_file */
fd_close_handle, /* close_handle */ fd_close_handle, /* close_handle */
@ -122,7 +121,7 @@ static struct file *create_file_for_fd( int fd, unsigned int access, unsigned in
if ((file = alloc_object( &file_ops ))) if ((file = alloc_object( &file_ops )))
{ {
file->mode = st.st_mode; file->mode = st.st_mode;
file->access = file_map_access( &file->obj, access ); file->access = default_fd_map_access( &file->obj, access );
if (!(file->fd = create_anonymous_fd( &file_fd_ops, fd, &file->obj, if (!(file->fd = create_anonymous_fd( &file_fd_ops, fd, &file->obj,
FILE_SYNCHRONOUS_IO_NONALERT ))) FILE_SYNCHRONOUS_IO_NONALERT )))
{ {
@ -268,11 +267,6 @@ static unsigned int generic_file_map_access( unsigned int access )
return access & ~(GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL); return access & ~(GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL);
} }
static unsigned int file_map_access( struct object *obj, unsigned int access )
{
return generic_file_map_access( access );
}
static void file_destroy( struct object *obj ) static void file_destroy( struct object *obj )
{ {
struct file *file = (struct file *)obj; struct file *file = (struct file *)obj;

View File

@ -75,6 +75,7 @@ extern void unlock_fd( struct fd *fd, file_pos_t offset, file_pos_t count );
extern void set_fd_signaled( struct fd *fd, int signaled ); extern void set_fd_signaled( struct fd *fd, int signaled );
extern int default_fd_signaled( struct object *obj, struct thread *thread ); extern int default_fd_signaled( struct object *obj, struct thread *thread );
extern unsigned int default_fd_map_access( struct object *obj, unsigned int access );
extern int default_fd_get_poll_events( struct fd *fd ); extern int default_fd_get_poll_events( struct fd *fd );
extern void default_poll_event( struct fd *fd, int event ); extern void default_poll_event( struct fd *fd, int event );
extern struct async *fd_queue_async( struct fd *fd, const async_data_t *data, int type, int count ); extern struct async *fd_queue_async( struct fd *fd, const async_data_t *data, int type, int count );

View File

@ -130,9 +130,6 @@ static const struct object_ops named_pipe_ops =
named_pipe_destroy /* destroy */ named_pipe_destroy /* destroy */
}; };
/* functions common to server and client */
static unsigned int pipe_map_access( struct object *obj, unsigned int access );
/* server end functions */ /* server end functions */
static void pipe_server_dump( struct object *obj, int verbose ); static void pipe_server_dump( struct object *obj, int verbose );
static struct fd *pipe_server_get_fd( struct object *obj ); static struct fd *pipe_server_get_fd( struct object *obj );
@ -152,7 +149,7 @@ static const struct object_ops pipe_server_ops =
no_satisfied, /* satisfied */ no_satisfied, /* satisfied */
no_signal, /* signal */ no_signal, /* signal */
pipe_server_get_fd, /* get_fd */ pipe_server_get_fd, /* get_fd */
pipe_map_access, /* map_access */ default_fd_map_access, /* map_access */
no_lookup_name, /* lookup_name */ no_lookup_name, /* lookup_name */
no_open_file, /* open_file */ no_open_file, /* open_file */
fd_close_handle, /* close_handle */ fd_close_handle, /* close_handle */
@ -188,7 +185,7 @@ static const struct object_ops pipe_client_ops =
no_satisfied, /* satisfied */ no_satisfied, /* satisfied */
no_signal, /* signal */ no_signal, /* signal */
pipe_client_get_fd, /* get_fd */ pipe_client_get_fd, /* get_fd */
pipe_map_access, /* map_access */ default_fd_map_access, /* map_access */
no_lookup_name, /* lookup_name */ no_lookup_name, /* lookup_name */
no_open_file, /* open_file */ no_open_file, /* open_file */
fd_close_handle, /* close_handle */ fd_close_handle, /* close_handle */
@ -357,15 +354,6 @@ static void do_disconnect( struct pipe_server *server )
server->fd = NULL; server->fd = NULL;
} }
static unsigned int pipe_map_access( struct object *obj, unsigned int access )
{
if (access & GENERIC_READ) access |= FILE_GENERIC_READ;
if (access & GENERIC_WRITE) access |= FILE_GENERIC_WRITE;
if (access & GENERIC_EXECUTE) access |= FILE_GENERIC_EXECUTE;
if (access & GENERIC_ALL) access |= FILE_ALL_ACCESS;
return access & ~(GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL);
}
static void pipe_server_destroy( struct object *obj) static void pipe_server_destroy( struct object *obj)
{ {
struct pipe_server *server = (struct pipe_server *)obj; struct pipe_server *server = (struct pipe_server *)obj;

View File

@ -58,7 +58,6 @@
static void serial_dump( struct object *obj, int verbose ); static void serial_dump( struct object *obj, int verbose );
static struct fd *serial_get_fd( struct object *obj ); static struct fd *serial_get_fd( struct object *obj );
static unsigned int serial_map_access( struct object *obj, unsigned int access );
static void serial_destroy(struct object *obj); static void serial_destroy(struct object *obj);
static enum server_fd_type serial_get_fd_type( struct fd *fd ); static enum server_fd_type serial_get_fd_type( struct fd *fd );
@ -94,7 +93,7 @@ static const struct object_ops serial_ops =
no_satisfied, /* satisfied */ no_satisfied, /* satisfied */
no_signal, /* signal */ no_signal, /* signal */
serial_get_fd, /* get_fd */ serial_get_fd, /* get_fd */
serial_map_access, /* map_access */ default_fd_map_access, /* map_access */
no_lookup_name, /* lookup_name */ no_lookup_name, /* lookup_name */
no_open_file, /* open_file */ no_open_file, /* open_file */
fd_close_handle, /* close_handle */ fd_close_handle, /* close_handle */
@ -145,15 +144,6 @@ static struct fd *serial_get_fd( struct object *obj )
return (struct fd *)grab_object( serial->fd ); return (struct fd *)grab_object( serial->fd );
} }
static unsigned int serial_map_access( struct object *obj, unsigned int access )
{
if (access & GENERIC_READ) access |= FILE_GENERIC_READ;
if (access & GENERIC_WRITE) access |= FILE_GENERIC_WRITE;
if (access & GENERIC_EXECUTE) access |= FILE_GENERIC_EXECUTE;
if (access & GENERIC_ALL) access |= FILE_ALL_ACCESS;
return access & ~(GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL);
}
static void serial_destroy( struct object *obj) static void serial_destroy( struct object *obj)
{ {
struct serial *serial = (struct serial *)obj; struct serial *serial = (struct serial *)obj;

View File

@ -90,7 +90,6 @@ struct sock
static void sock_dump( struct object *obj, int verbose ); static void sock_dump( struct object *obj, int verbose );
static int sock_signaled( struct object *obj, struct thread *thread ); static int sock_signaled( struct object *obj, struct thread *thread );
static struct fd *sock_get_fd( struct object *obj ); static struct fd *sock_get_fd( struct object *obj );
static unsigned int sock_map_access( struct object *obj, unsigned int access );
static void sock_destroy( struct object *obj ); static void sock_destroy( struct object *obj );
static int sock_get_poll_events( struct fd *fd ); static int sock_get_poll_events( struct fd *fd );
@ -113,7 +112,7 @@ static const struct object_ops sock_ops =
no_satisfied, /* satisfied */ no_satisfied, /* satisfied */
no_signal, /* signal */ no_signal, /* signal */
sock_get_fd, /* get_fd */ sock_get_fd, /* get_fd */
sock_map_access, /* map_access */ default_fd_map_access, /* map_access */
no_lookup_name, /* lookup_name */ no_lookup_name, /* lookup_name */
no_open_file, /* open_file */ no_open_file, /* open_file */
fd_close_handle, /* close_handle */ fd_close_handle, /* close_handle */
@ -459,15 +458,6 @@ static int sock_signaled( struct object *obj, struct thread *thread )
return check_fd_events( sock->fd, sock_get_poll_events( sock->fd ) ) != 0; return check_fd_events( sock->fd, sock_get_poll_events( sock->fd ) ) != 0;
} }
static unsigned int sock_map_access( struct object *obj, unsigned int access )
{
if (access & GENERIC_READ) access |= FILE_GENERIC_READ;
if (access & GENERIC_WRITE) access |= FILE_GENERIC_WRITE;
if (access & GENERIC_EXECUTE) access |= FILE_GENERIC_EXECUTE;
if (access & GENERIC_ALL) access |= FILE_ALL_ACCESS;
return access & ~(GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL);
}
static int sock_get_poll_events( struct fd *fd ) static int sock_get_poll_events( struct fd *fd )
{ {
struct sock *sock = get_fd_user( fd ); struct sock *sock = get_fd_user( fd );