Alexandre Julliard | 863637b | 2003-01-30 00:26:44 +0000 | [diff] [blame] | 1 | /* |
| 2 | * Server-side file definitions |
| 3 | * |
| 4 | * Copyright (C) 2003 Alexandre Julliard |
| 5 | * |
| 6 | * This library is free software; you can redistribute it and/or |
| 7 | * modify it under the terms of the GNU Lesser General Public |
| 8 | * License as published by the Free Software Foundation; either |
| 9 | * version 2.1 of the License, or (at your option) any later version. |
| 10 | * |
| 11 | * This library is distributed in the hope that it will be useful, |
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 14 | * Lesser General Public License for more details. |
| 15 | * |
| 16 | * You should have received a copy of the GNU Lesser General Public |
| 17 | * License along with this library; if not, write to the Free Software |
Jonathan Ernst | 360a3f9 | 2006-05-18 14:49:52 +0200 | [diff] [blame] | 18 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA |
Alexandre Julliard | 863637b | 2003-01-30 00:26:44 +0000 | [diff] [blame] | 19 | */ |
| 20 | |
| 21 | #ifndef __WINE_SERVER_FILE_H |
| 22 | #define __WINE_SERVER_FILE_H |
| 23 | |
| 24 | #include "object.h" |
| 25 | |
| 26 | struct fd; |
Alexandre Julliard | df09ac5 | 2007-04-02 20:09:29 +0200 | [diff] [blame] | 27 | struct async_queue; |
Andrey Turkin | d1a8155 | 2007-09-28 00:03:39 +0400 | [diff] [blame] | 28 | struct completion; |
Alexandre Julliard | 863637b | 2003-01-30 00:26:44 +0000 | [diff] [blame] | 29 | |
| 30 | /* operations valid on file descriptor objects */ |
| 31 | struct fd_ops |
| 32 | { |
| 33 | /* get the events we want to poll() for on this object */ |
Alexandre Julliard | cf27a7f | 2003-02-14 20:27:09 +0000 | [diff] [blame] | 34 | int (*get_poll_events)(struct fd *); |
Francois Gouget | 3ca7612 | 2003-07-15 20:53:39 +0000 | [diff] [blame] | 35 | /* a poll() event occurred */ |
Alexandre Julliard | cf27a7f | 2003-02-14 20:27:09 +0000 | [diff] [blame] | 36 | void (*poll_event)(struct fd *,int event); |
Alexandre Julliard | 863637b | 2003-01-30 00:26:44 +0000 | [diff] [blame] | 37 | /* flush the object buffers */ |
Alexandre Julliard | df65187 | 2007-03-27 16:51:44 +0200 | [diff] [blame] | 38 | void (*flush)(struct fd *, struct event **); |
Alexandre Julliard | 863637b | 2003-01-30 00:26:44 +0000 | [diff] [blame] | 39 | /* get file information */ |
Alexandre Julliard | 7a9363a | 2007-04-10 22:26:23 +0200 | [diff] [blame] | 40 | enum server_fd_type (*get_fd_type)(struct fd *fd); |
Alexandre Julliard | 6357143 | 2007-04-16 14:45:03 +0200 | [diff] [blame] | 41 | /* perform an ioctl on the file */ |
Alexandre Julliard | fd59e15 | 2007-05-03 17:43:18 +0200 | [diff] [blame] | 42 | obj_handle_t (*ioctl)(struct fd *fd, ioctl_code_t code, const async_data_t *async, |
| 43 | const void *data, data_size_t size); |
Eric Pouech | 4634447 | 2005-01-14 19:54:38 +0000 | [diff] [blame] | 44 | /* queue an async operation */ |
Alexandre Julliard | 111610c | 2007-03-20 20:21:12 +0100 | [diff] [blame] | 45 | void (*queue_async)(struct fd *, const async_data_t *data, int type, int count); |
Alexandre Julliard | 72bff2e | 2007-04-10 17:07:27 +0200 | [diff] [blame] | 46 | /* selected events for async i/o need an update */ |
| 47 | void (*reselect_async)( struct fd *, struct async_queue *queue ); |
Eric Pouech | 4634447 | 2005-01-14 19:54:38 +0000 | [diff] [blame] | 48 | /* cancel an async operation */ |
| 49 | void (*cancel_async)(struct fd *); |
Alexandre Julliard | 863637b | 2003-01-30 00:26:44 +0000 | [diff] [blame] | 50 | }; |
| 51 | |
Alexandre Julliard | cf27a7f | 2003-02-14 20:27:09 +0000 | [diff] [blame] | 52 | /* file descriptor functions */ |
| 53 | |
Alexandre Julliard | 017480d | 2007-05-03 16:07:30 +0200 | [diff] [blame] | 54 | extern struct fd *alloc_pseudo_fd( const struct fd_ops *fd_user_ops, struct object *user, |
| 55 | unsigned int options ); |
Alexandre Julliard | f3fbae4 | 2007-04-18 16:05:59 +0200 | [diff] [blame] | 56 | extern void set_no_fd_status( struct fd *fd, unsigned int status ); |
Mike McCormack | 9a7124e | 2006-01-24 13:30:55 +0100 | [diff] [blame] | 57 | extern struct fd *open_fd( const char *name, int flags, mode_t *mode, unsigned int access, |
| 58 | unsigned int sharing, unsigned int options ); |
Alexandre Julliard | 580da24 | 2003-03-12 22:38:14 +0000 | [diff] [blame] | 59 | extern struct fd *create_anonymous_fd( const struct fd_ops *fd_user_ops, |
Alexandre Julliard | f85437c | 2007-04-10 22:25:07 +0200 | [diff] [blame] | 60 | int unix_fd, struct object *user, unsigned int options ); |
Alexandre Julliard | cf27a7f | 2003-02-14 20:27:09 +0000 | [diff] [blame] | 61 | extern void *get_fd_user( struct fd *fd ); |
Mike McCormack | 9a7124e | 2006-01-24 13:30:55 +0100 | [diff] [blame] | 62 | extern void set_fd_user( struct fd *fd, const struct fd_ops *ops, struct object *user ); |
Alexandre Julliard | f85437c | 2007-04-10 22:25:07 +0200 | [diff] [blame] | 63 | extern unsigned int get_fd_options( struct fd *fd ); |
Alexandre Julliard | cf27a7f | 2003-02-14 20:27:09 +0000 | [diff] [blame] | 64 | extern int get_unix_fd( struct fd *fd ); |
Alexandre Julliard | 74bd1e4 | 2004-03-27 20:48:42 +0000 | [diff] [blame] | 65 | extern int is_same_file_fd( struct fd *fd1, struct fd *fd2 ); |
Alexandre Julliard | 5bd5136 | 2007-01-12 14:42:43 +0100 | [diff] [blame] | 66 | extern int is_fd_removable( struct fd *fd ); |
Alexandre Julliard | 715d78e | 2006-11-02 20:52:22 +0100 | [diff] [blame] | 67 | extern int fd_close_handle( struct object *obj, struct process *process, obj_handle_t handle ); |
Alexandre Julliard | cf27a7f | 2003-02-14 20:27:09 +0000 | [diff] [blame] | 68 | extern int check_fd_events( struct fd *fd, int events ); |
Alexandre Julliard | e66207e | 2003-02-19 00:33:32 +0000 | [diff] [blame] | 69 | extern void set_fd_events( struct fd *fd, int events ); |
Alexandre Julliard | ce61349 | 2003-03-18 05:04:33 +0000 | [diff] [blame] | 70 | extern obj_handle_t lock_fd( struct fd *fd, file_pos_t offset, file_pos_t count, int shared, int wait ); |
| 71 | extern void unlock_fd( struct fd *fd, file_pos_t offset, file_pos_t count ); |
Alexandre Julliard | ba896e7 | 2007-04-04 19:39:29 +0200 | [diff] [blame] | 72 | extern void set_fd_signaled( struct fd *fd, int signaled ); |
Alexandre Julliard | 863637b | 2003-01-30 00:26:44 +0000 | [diff] [blame] | 73 | |
Alexandre Julliard | 863637b | 2003-01-30 00:26:44 +0000 | [diff] [blame] | 74 | extern int default_fd_signaled( struct object *obj, struct thread *thread ); |
Alexandre Julliard | 24001e8 | 2007-10-02 14:20:15 +0200 | [diff] [blame] | 75 | extern unsigned int default_fd_map_access( struct object *obj, unsigned int access ); |
Robert Shearman | d6a4e34 | 2005-06-07 20:09:01 +0000 | [diff] [blame] | 76 | extern int default_fd_get_poll_events( struct fd *fd ); |
Alexandre Julliard | cf27a7f | 2003-02-14 20:27:09 +0000 | [diff] [blame] | 77 | extern void default_poll_event( struct fd *fd, int event ); |
Alexandre Julliard | 0aae1ca | 2007-04-02 20:41:59 +0200 | [diff] [blame] | 78 | extern struct async *fd_queue_async( struct fd *fd, const async_data_t *data, int type, int count ); |
Alexandre Julliard | df09ac5 | 2007-04-02 20:09:29 +0200 | [diff] [blame] | 79 | extern void fd_async_wake_up( struct fd *fd, int type, unsigned int status ); |
Alexandre Julliard | 72bff2e | 2007-04-10 17:07:27 +0200 | [diff] [blame] | 80 | extern void fd_reselect_async( struct fd *fd, struct async_queue *queue ); |
Alexandre Julliard | fd59e15 | 2007-05-03 17:43:18 +0200 | [diff] [blame] | 81 | extern obj_handle_t default_fd_ioctl( struct fd *fd, ioctl_code_t code, const async_data_t *async, |
| 82 | const void *data, data_size_t size ); |
Alexandre Julliard | 111610c | 2007-03-20 20:21:12 +0100 | [diff] [blame] | 83 | extern void default_fd_queue_async( struct fd *fd, const async_data_t *data, int type, int count ); |
Alexandre Julliard | 72bff2e | 2007-04-10 17:07:27 +0200 | [diff] [blame] | 84 | extern void default_fd_reselect_async( struct fd *fd, struct async_queue *queue ); |
Robert Shearman | d6a4e34 | 2005-06-07 20:09:01 +0000 | [diff] [blame] | 85 | extern void default_fd_cancel_async( struct fd *fd ); |
Alexandre Julliard | df65187 | 2007-03-27 16:51:44 +0200 | [diff] [blame] | 86 | extern void no_flush( struct fd *fd, struct event **event ); |
Alexandre Julliard | e66207e | 2003-02-19 00:33:32 +0000 | [diff] [blame] | 87 | extern void main_loop(void); |
Mike McCormack | cdcb203 | 2005-06-14 11:40:40 +0000 | [diff] [blame] | 88 | extern void remove_process_locks( struct process *process ); |
Alexandre Julliard | cf27a7f | 2003-02-14 20:27:09 +0000 | [diff] [blame] | 89 | |
Andrew Talbot | b1788c8 | 2007-03-17 10:52:14 +0000 | [diff] [blame] | 90 | static inline struct fd *get_obj_fd( struct object *obj ) { return obj->ops->get_fd( obj ); } |
Alexandre Julliard | cf27a7f | 2003-02-14 20:27:09 +0000 | [diff] [blame] | 91 | |
Alexandre Julliard | e66207e | 2003-02-19 00:33:32 +0000 | [diff] [blame] | 92 | /* timeout functions */ |
| 93 | |
| 94 | struct timeout_user; |
Alexandre Julliard | aaf477f | 2007-04-17 20:08:59 +0200 | [diff] [blame] | 95 | extern timeout_t current_time; |
| 96 | |
| 97 | #define TICKS_PER_SEC 10000000 |
Alexandre Julliard | e66207e | 2003-02-19 00:33:32 +0000 | [diff] [blame] | 98 | |
| 99 | typedef void (*timeout_callback)( void *private ); |
| 100 | |
Alexandre Julliard | aaf477f | 2007-04-17 20:08:59 +0200 | [diff] [blame] | 101 | extern struct timeout_user *add_timeout_user( timeout_t when, timeout_callback func, void *private ); |
Alexandre Julliard | e66207e | 2003-02-19 00:33:32 +0000 | [diff] [blame] | 102 | extern void remove_timeout_user( struct timeout_user *user ); |
Alexandre Julliard | aaf477f | 2007-04-17 20:08:59 +0200 | [diff] [blame] | 103 | extern const char *get_timeout_str( timeout_t timeout ); |
Alexandre Julliard | e66207e | 2003-02-19 00:33:32 +0000 | [diff] [blame] | 104 | |
Alexandre Julliard | cf27a7f | 2003-02-14 20:27:09 +0000 | [diff] [blame] | 105 | /* file functions */ |
| 106 | |
| 107 | extern struct file *get_file_obj( struct process *process, obj_handle_t handle, |
| 108 | unsigned int access ); |
| 109 | extern int get_file_unix_fd( struct file *file ); |
| 110 | extern int is_same_file( struct file *file1, struct file *file2 ); |
Alexandre Julliard | 5bd5136 | 2007-01-12 14:42:43 +0100 | [diff] [blame] | 111 | extern struct file *grab_file_unless_removable( struct file *file ); |
Alexandre Julliard | a4334a6 | 2005-04-19 11:59:13 +0000 | [diff] [blame] | 112 | extern int grow_file( struct file *file, file_pos_t size ); |
Alexandre Julliard | cf27a7f | 2003-02-14 20:27:09 +0000 | [diff] [blame] | 113 | extern struct file *create_temp_file( int access ); |
| 114 | extern void file_set_error(void); |
Alexandre Julliard | 863637b | 2003-01-30 00:26:44 +0000 | [diff] [blame] | 115 | |
Alexandre Julliard | 3e588e3 | 2003-03-26 23:41:43 +0000 | [diff] [blame] | 116 | /* change notification functions */ |
| 117 | |
| 118 | extern void do_change_notify( int unix_fd ); |
| 119 | extern void sigio_callback(void); |
Mike McCormack | 0835107 | 2006-01-27 12:13:56 +0100 | [diff] [blame] | 120 | extern struct object *create_dir_obj( struct fd *fd ); |
Alexandre Julliard | 3e588e3 | 2003-03-26 23:41:43 +0000 | [diff] [blame] | 121 | |
Andrey Turkin | d1a8155 | 2007-09-28 00:03:39 +0400 | [diff] [blame] | 122 | /* completion */ |
| 123 | |
Andrey Turkin | c702a91 | 2007-11-10 01:11:48 +0300 | [diff] [blame] | 124 | extern struct completion *get_completion_obj( struct process *process, obj_handle_t handle, unsigned int access ); |
| 125 | extern void add_completion( struct completion *completion, unsigned long ckey, unsigned long cvalue, unsigned int status, unsigned long information ); |
Andrey Turkin | d1a8155 | 2007-09-28 00:03:39 +0400 | [diff] [blame] | 126 | |
Alexandre Julliard | adc0610 | 2004-03-18 04:08:48 +0000 | [diff] [blame] | 127 | /* serial port functions */ |
| 128 | |
| 129 | extern int is_serial_fd( struct fd *fd ); |
Alexandre Julliard | f85437c | 2007-04-10 22:25:07 +0200 | [diff] [blame] | 130 | extern struct object *create_serial( struct fd *fd ); |
Alexandre Julliard | adc0610 | 2004-03-18 04:08:48 +0000 | [diff] [blame] | 131 | |
Eric Pouech | 4634447 | 2005-01-14 19:54:38 +0000 | [diff] [blame] | 132 | /* async I/O functions */ |
Alexandre Julliard | df09ac5 | 2007-04-02 20:09:29 +0200 | [diff] [blame] | 133 | extern struct async_queue *create_async_queue( struct fd *fd ); |
Alexandre Julliard | b2cba95 | 2007-04-03 19:36:07 +0200 | [diff] [blame] | 134 | extern void free_async_queue( struct async_queue *queue ); |
Alexandre Julliard | 0aae1ca | 2007-04-02 20:41:59 +0200 | [diff] [blame] | 135 | extern struct async *create_async( struct thread *thread, struct async_queue *queue, |
| 136 | const async_data_t *data ); |
Alexandre Julliard | aaf477f | 2007-04-17 20:08:59 +0200 | [diff] [blame] | 137 | extern void async_set_timeout( struct async *async, timeout_t timeout, unsigned int status ); |
Andrey Turkin | 7a9210f | 2007-11-10 01:12:16 +0300 | [diff] [blame] | 138 | extern void async_set_result( struct object *obj, unsigned int status, unsigned long total ); |
Alexandre Julliard | df09ac5 | 2007-04-02 20:09:29 +0200 | [diff] [blame] | 139 | extern int async_waiting( struct async_queue *queue ); |
Alexandre Julliard | 61e08b3 | 2007-05-08 20:37:21 +0200 | [diff] [blame] | 140 | extern void async_terminate( struct async *async, unsigned int status ); |
Alexandre Julliard | df09ac5 | 2007-04-02 20:09:29 +0200 | [diff] [blame] | 141 | extern void async_wake_up( struct async_queue *queue, unsigned int status ); |
Andrey Turkin | 3afbee5 | 2007-12-17 22:06:17 +0300 | [diff] [blame] | 142 | extern void fd_assign_completion( struct fd *fd, struct completion **p_port, unsigned long *p_key ); |
Eric Pouech | 4634447 | 2005-01-14 19:54:38 +0000 | [diff] [blame] | 143 | |
Alexandre Julliard | a510a7e | 2005-12-12 16:46:17 +0100 | [diff] [blame] | 144 | /* access rights that require Unix read permission */ |
| 145 | #define FILE_UNIX_READ_ACCESS (FILE_READ_DATA|FILE_READ_ATTRIBUTES|FILE_READ_EA) |
| 146 | |
| 147 | /* access rights that require Unix write permission */ |
| 148 | #define FILE_UNIX_WRITE_ACCESS (FILE_WRITE_DATA|FILE_WRITE_ATTRIBUTES|FILE_WRITE_EA) |
| 149 | |
Alexandre Julliard | 863637b | 2003-01-30 00:26:44 +0000 | [diff] [blame] | 150 | #endif /* __WINE_SERVER_FILE_H */ |