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 |
| 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 19 | */ |
| 20 | |
| 21 | #ifndef __WINE_SERVER_FILE_H |
| 22 | #define __WINE_SERVER_FILE_H |
| 23 | |
| 24 | #include "object.h" |
| 25 | |
| 26 | struct fd; |
| 27 | |
Alexandre Julliard | ce61349 | 2003-03-18 05:04:33 +0000 | [diff] [blame] | 28 | typedef unsigned __int64 file_pos_t; |
| 29 | |
Alexandre Julliard | 863637b | 2003-01-30 00:26:44 +0000 | [diff] [blame] | 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 */ |
Mike McCormack | ef8b946 | 2003-05-15 04:22:45 +0000 | [diff] [blame] | 38 | int (*flush)(struct fd *, struct event **); |
Alexandre Julliard | 863637b | 2003-01-30 00:26:44 +0000 | [diff] [blame] | 39 | /* get file information */ |
Alexandre Julliard | 6a27b48 | 2004-08-18 00:04:58 +0000 | [diff] [blame] | 40 | int (*get_file_info)(struct fd *); |
Eric Pouech | 4634447 | 2005-01-14 19:54:38 +0000 | [diff] [blame] | 41 | /* queue an async operation */ |
| 42 | void (*queue_async)(struct fd *, void* apc, void* user, void* io_sb, int type, int count); |
| 43 | /* cancel an async operation */ |
| 44 | void (*cancel_async)(struct fd *); |
Alexandre Julliard | 863637b | 2003-01-30 00:26:44 +0000 | [diff] [blame] | 45 | }; |
| 46 | |
Alexandre Julliard | cf27a7f | 2003-02-14 20:27:09 +0000 | [diff] [blame] | 47 | /* file descriptor functions */ |
| 48 | |
Alexandre Julliard | 580da24 | 2003-03-12 22:38:14 +0000 | [diff] [blame] | 49 | extern struct fd *alloc_fd( const struct fd_ops *fd_user_ops, struct object *user ); |
Alexandre Julliard | 67505c0 | 2005-12-12 14:27:45 +0100 | [diff] [blame] | 50 | extern struct fd *alloc_pseudo_fd( const struct fd_ops *fd_user_ops, struct object *user ); |
Alexandre Julliard | 74bd1e4 | 2004-03-27 20:48:42 +0000 | [diff] [blame] | 51 | extern struct fd *open_fd( struct fd *fd, const char *name, int flags, mode_t *mode, |
Alexandre Julliard | 684b65c | 2004-04-16 04:31:35 +0000 | [diff] [blame] | 52 | unsigned int access, unsigned int sharing, unsigned int options ); |
Alexandre Julliard | 580da24 | 2003-03-12 22:38:14 +0000 | [diff] [blame] | 53 | extern struct fd *create_anonymous_fd( const struct fd_ops *fd_user_ops, |
| 54 | int unix_fd, struct object *user ); |
Alexandre Julliard | cf27a7f | 2003-02-14 20:27:09 +0000 | [diff] [blame] | 55 | extern void *get_fd_user( struct fd *fd ); |
| 56 | extern int get_unix_fd( struct fd *fd ); |
Alexandre Julliard | 74bd1e4 | 2004-03-27 20:48:42 +0000 | [diff] [blame] | 57 | extern int is_same_file_fd( struct fd *fd1, struct fd *fd2 ); |
Alexandre Julliard | e66207e | 2003-02-19 00:33:32 +0000 | [diff] [blame] | 58 | extern void fd_poll_event( struct fd *fd, int event ); |
Alexandre Julliard | cf27a7f | 2003-02-14 20:27:09 +0000 | [diff] [blame] | 59 | extern int check_fd_events( struct fd *fd, int events ); |
Alexandre Julliard | e66207e | 2003-02-19 00:33:32 +0000 | [diff] [blame] | 60 | extern void set_fd_events( struct fd *fd, int events ); |
Alexandre Julliard | ce61349 | 2003-03-18 05:04:33 +0000 | [diff] [blame] | 61 | extern obj_handle_t lock_fd( struct fd *fd, file_pos_t offset, file_pos_t count, int shared, int wait ); |
| 62 | extern void unlock_fd( struct fd *fd, file_pos_t offset, file_pos_t count ); |
Alexandre Julliard | 863637b | 2003-01-30 00:26:44 +0000 | [diff] [blame] | 63 | |
| 64 | extern int default_fd_add_queue( struct object *obj, struct wait_queue_entry *entry ); |
| 65 | extern void default_fd_remove_queue( struct object *obj, struct wait_queue_entry *entry ); |
| 66 | extern int default_fd_signaled( struct object *obj, struct thread *thread ); |
Robert Shearman | d6a4e34 | 2005-06-07 20:09:01 +0000 | [diff] [blame] | 67 | extern int default_fd_get_poll_events( struct fd *fd ); |
Alexandre Julliard | cf27a7f | 2003-02-14 20:27:09 +0000 | [diff] [blame] | 68 | extern void default_poll_event( struct fd *fd, int event ); |
Robert Shearman | 37773dd | 2005-07-14 12:18:05 +0000 | [diff] [blame] | 69 | extern void fd_queue_async_timeout( struct fd *fd, void *apc, void *user, void *io_sb, int type, int count, int *timeout ); |
Robert Shearman | d6a4e34 | 2005-06-07 20:09:01 +0000 | [diff] [blame] | 70 | extern void default_fd_queue_async( struct fd *fd, void *apc, void *user, void *io_sb, int type, int count ); |
| 71 | extern void default_fd_cancel_async( struct fd *fd ); |
Mike McCormack | ef8b946 | 2003-05-15 04:22:45 +0000 | [diff] [blame] | 72 | extern int no_flush( struct fd *fd, struct event **event ); |
Alexandre Julliard | 6a27b48 | 2004-08-18 00:04:58 +0000 | [diff] [blame] | 73 | extern int no_get_file_info( struct fd *fd ); |
Eric Pouech | 4634447 | 2005-01-14 19:54:38 +0000 | [diff] [blame] | 74 | extern void no_queue_async( struct fd *fd, void* apc, void* user, void* io_sb, int type, int count); |
| 75 | extern void no_cancel_async( struct fd *fd ); |
Alexandre Julliard | e66207e | 2003-02-19 00:33:32 +0000 | [diff] [blame] | 76 | extern void main_loop(void); |
Mike McCormack | cdcb203 | 2005-06-14 11:40:40 +0000 | [diff] [blame] | 77 | extern void remove_process_locks( struct process *process ); |
Alexandre Julliard | cf27a7f | 2003-02-14 20:27:09 +0000 | [diff] [blame] | 78 | |
| 79 | inline static struct fd *get_obj_fd( struct object *obj ) { return obj->ops->get_fd( obj ); } |
| 80 | |
Alexandre Julliard | e66207e | 2003-02-19 00:33:32 +0000 | [diff] [blame] | 81 | /* timeout functions */ |
| 82 | |
| 83 | struct timeout_user; |
| 84 | |
| 85 | typedef void (*timeout_callback)( void *private ); |
| 86 | |
Eric Pouech | 7001d6e | 2005-03-29 11:40:10 +0000 | [diff] [blame] | 87 | extern struct timeout_user *add_timeout_user( const struct timeval *when, |
Alexandre Julliard | e66207e | 2003-02-19 00:33:32 +0000 | [diff] [blame] | 88 | timeout_callback func, void *private ); |
| 89 | extern void remove_timeout_user( struct timeout_user *user ); |
| 90 | extern void add_timeout( struct timeval *when, int timeout ); |
| 91 | /* return 1 if t1 is before t2 */ |
Eric Pouech | 7001d6e | 2005-03-29 11:40:10 +0000 | [diff] [blame] | 92 | static inline int time_before( const struct timeval *t1, const struct timeval *t2 ) |
Alexandre Julliard | e66207e | 2003-02-19 00:33:32 +0000 | [diff] [blame] | 93 | { |
| 94 | return ((t1->tv_sec < t2->tv_sec) || |
| 95 | ((t1->tv_sec == t2->tv_sec) && (t1->tv_usec < t2->tv_usec))); |
| 96 | } |
| 97 | |
Alexandre Julliard | cf27a7f | 2003-02-14 20:27:09 +0000 | [diff] [blame] | 98 | /* file functions */ |
| 99 | |
| 100 | extern struct file *get_file_obj( struct process *process, obj_handle_t handle, |
| 101 | unsigned int access ); |
| 102 | extern int get_file_unix_fd( struct file *file ); |
| 103 | extern int is_same_file( struct file *file1, struct file *file2 ); |
Alexandre Julliard | a4334a6 | 2005-04-19 11:59:13 +0000 | [diff] [blame] | 104 | extern int grow_file( struct file *file, file_pos_t size ); |
Alexandre Julliard | cf27a7f | 2003-02-14 20:27:09 +0000 | [diff] [blame] | 105 | extern struct file *create_temp_file( int access ); |
| 106 | extern void file_set_error(void); |
Alexandre Julliard | 863637b | 2003-01-30 00:26:44 +0000 | [diff] [blame] | 107 | |
Alexandre Julliard | 3e588e3 | 2003-03-26 23:41:43 +0000 | [diff] [blame] | 108 | /* change notification functions */ |
| 109 | |
| 110 | extern void do_change_notify( int unix_fd ); |
| 111 | extern void sigio_callback(void); |
| 112 | |
Alexandre Julliard | adc0610 | 2004-03-18 04:08:48 +0000 | [diff] [blame] | 113 | /* serial port functions */ |
| 114 | |
| 115 | extern int is_serial_fd( struct fd *fd ); |
| 116 | extern struct object *create_serial( struct fd *fd, unsigned int options ); |
| 117 | |
Eric Pouech | 4634447 | 2005-01-14 19:54:38 +0000 | [diff] [blame] | 118 | /* async I/O functions */ |
Eric Pouech | 7001d6e | 2005-03-29 11:40:10 +0000 | [diff] [blame] | 119 | extern struct async *create_async( struct thread *thread, int* timeout, |
Alexandre Julliard | dd81ac5 | 2005-02-24 17:06:31 +0000 | [diff] [blame] | 120 | struct list *queue, void *, void *, void *); |
| 121 | extern void async_terminate_head( struct list *queue, int status ); |
Eric Pouech | 4634447 | 2005-01-14 19:54:38 +0000 | [diff] [blame] | 122 | |
Alexandre Julliard | dd81ac5 | 2005-02-24 17:06:31 +0000 | [diff] [blame] | 123 | static inline void async_terminate_queue( struct list *queue, int status ) |
Eric Pouech | 4634447 | 2005-01-14 19:54:38 +0000 | [diff] [blame] | 124 | { |
Alexandre Julliard | dd81ac5 | 2005-02-24 17:06:31 +0000 | [diff] [blame] | 125 | while (!list_empty( queue )) async_terminate_head( queue, status ); |
Eric Pouech | 4634447 | 2005-01-14 19:54:38 +0000 | [diff] [blame] | 126 | } |
| 127 | |
Alexandre Julliard | a510a7e | 2005-12-12 16:46:17 +0100 | [diff] [blame] | 128 | /* access rights that require Unix read permission */ |
| 129 | #define FILE_UNIX_READ_ACCESS (FILE_READ_DATA|FILE_READ_ATTRIBUTES|FILE_READ_EA) |
| 130 | |
| 131 | /* access rights that require Unix write permission */ |
| 132 | #define FILE_UNIX_WRITE_ACCESS (FILE_WRITE_DATA|FILE_WRITE_ATTRIBUTES|FILE_WRITE_EA) |
| 133 | |
Alexandre Julliard | 863637b | 2003-01-30 00:26:44 +0000 | [diff] [blame] | 134 | #endif /* __WINE_SERVER_FILE_H */ |