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 | cf27a7f | 2003-02-14 20:27:09 +0000 | [diff] [blame] | 40 | int (*get_file_info)(struct fd *,struct get_file_info_reply *, int *flags); |
Alexandre Julliard | 863637b | 2003-01-30 00:26:44 +0000 | [diff] [blame] | 41 | /* queue an async operation - see register_async handler in async.c*/ |
Alexandre Julliard | cf27a7f | 2003-02-14 20:27:09 +0000 | [diff] [blame] | 42 | void (*queue_async)(struct fd *, void* ptr, unsigned int status, int type, int count); |
Alexandre Julliard | 863637b | 2003-01-30 00:26:44 +0000 | [diff] [blame] | 43 | }; |
| 44 | |
Alexandre Julliard | cf27a7f | 2003-02-14 20:27:09 +0000 | [diff] [blame] | 45 | /* file descriptor functions */ |
| 46 | |
Alexandre Julliard | 580da24 | 2003-03-12 22:38:14 +0000 | [diff] [blame] | 47 | extern struct fd *alloc_fd( const struct fd_ops *fd_user_ops, struct object *user ); |
Gerald Pfeifer | 6dcc1af | 2003-03-18 18:26:44 +0000 | [diff] [blame] | 48 | extern struct fd *open_fd( struct fd *fd, const char *name, int flags, mode_t *mode ); |
Alexandre Julliard | 580da24 | 2003-03-12 22:38:14 +0000 | [diff] [blame] | 49 | extern struct fd *create_anonymous_fd( const struct fd_ops *fd_user_ops, |
| 50 | int unix_fd, struct object *user ); |
Alexandre Julliard | cf27a7f | 2003-02-14 20:27:09 +0000 | [diff] [blame] | 51 | extern void *get_fd_user( struct fd *fd ); |
| 52 | extern int get_unix_fd( struct fd *fd ); |
Alexandre Julliard | e66207e | 2003-02-19 00:33:32 +0000 | [diff] [blame] | 53 | extern void fd_poll_event( struct fd *fd, int event ); |
Alexandre Julliard | cf27a7f | 2003-02-14 20:27:09 +0000 | [diff] [blame] | 54 | extern int check_fd_events( struct fd *fd, int events ); |
Alexandre Julliard | e66207e | 2003-02-19 00:33:32 +0000 | [diff] [blame] | 55 | extern void set_fd_events( struct fd *fd, int events ); |
Alexandre Julliard | ce61349 | 2003-03-18 05:04:33 +0000 | [diff] [blame] | 56 | extern obj_handle_t lock_fd( struct fd *fd, file_pos_t offset, file_pos_t count, int shared, int wait ); |
| 57 | extern void unlock_fd( struct fd *fd, file_pos_t offset, file_pos_t count ); |
Mike McCormack | ef8b946 | 2003-05-15 04:22:45 +0000 | [diff] [blame] | 58 | extern int flush_cached_fd( struct process *process, obj_handle_t handle ); |
Alexandre Julliard | 863637b | 2003-01-30 00:26:44 +0000 | [diff] [blame] | 59 | |
| 60 | extern int default_fd_add_queue( struct object *obj, struct wait_queue_entry *entry ); |
| 61 | extern void default_fd_remove_queue( struct object *obj, struct wait_queue_entry *entry ); |
| 62 | extern int default_fd_signaled( struct object *obj, struct thread *thread ); |
Alexandre Julliard | cf27a7f | 2003-02-14 20:27:09 +0000 | [diff] [blame] | 63 | extern void default_poll_event( struct fd *fd, int event ); |
Mike McCormack | ef8b946 | 2003-05-15 04:22:45 +0000 | [diff] [blame] | 64 | extern int no_flush( struct fd *fd, struct event **event ); |
Alexandre Julliard | cf27a7f | 2003-02-14 20:27:09 +0000 | [diff] [blame] | 65 | extern int no_get_file_info( struct fd *fd, struct get_file_info_reply *info, int *flags ); |
| 66 | extern void no_queue_async( struct fd *fd, void* ptr, unsigned int status, int type, int count ); |
Alexandre Julliard | e66207e | 2003-02-19 00:33:32 +0000 | [diff] [blame] | 67 | extern void main_loop(void); |
Alexandre Julliard | cf27a7f | 2003-02-14 20:27:09 +0000 | [diff] [blame] | 68 | |
| 69 | inline static struct fd *get_obj_fd( struct object *obj ) { return obj->ops->get_fd( obj ); } |
| 70 | |
Alexandre Julliard | e66207e | 2003-02-19 00:33:32 +0000 | [diff] [blame] | 71 | /* timeout functions */ |
| 72 | |
| 73 | struct timeout_user; |
| 74 | |
| 75 | typedef void (*timeout_callback)( void *private ); |
| 76 | |
| 77 | extern struct timeout_user *add_timeout_user( struct timeval *when, |
| 78 | timeout_callback func, void *private ); |
| 79 | extern void remove_timeout_user( struct timeout_user *user ); |
| 80 | extern void add_timeout( struct timeval *when, int timeout ); |
| 81 | /* return 1 if t1 is before t2 */ |
| 82 | static inline int time_before( struct timeval *t1, struct timeval *t2 ) |
| 83 | { |
| 84 | return ((t1->tv_sec < t2->tv_sec) || |
| 85 | ((t1->tv_sec == t2->tv_sec) && (t1->tv_usec < t2->tv_usec))); |
| 86 | } |
| 87 | |
Alexandre Julliard | cf27a7f | 2003-02-14 20:27:09 +0000 | [diff] [blame] | 88 | /* file functions */ |
| 89 | |
| 90 | extern struct file *get_file_obj( struct process *process, obj_handle_t handle, |
| 91 | unsigned int access ); |
| 92 | extern int get_file_unix_fd( struct file *file ); |
| 93 | extern int is_same_file( struct file *file1, struct file *file2 ); |
Alexandre Julliard | af192f8 | 2003-10-08 00:25:32 +0000 | [diff] [blame] | 94 | extern int is_file_removable( struct file *file ); |
Alexandre Julliard | cf27a7f | 2003-02-14 20:27:09 +0000 | [diff] [blame] | 95 | extern int grow_file( struct file *file, int size_high, int size_low ); |
Alexandre Julliard | cf27a7f | 2003-02-14 20:27:09 +0000 | [diff] [blame] | 96 | extern struct file *create_temp_file( int access ); |
| 97 | extern void file_set_error(void); |
Alexandre Julliard | 863637b | 2003-01-30 00:26:44 +0000 | [diff] [blame] | 98 | |
Alexandre Julliard | 3e588e3 | 2003-03-26 23:41:43 +0000 | [diff] [blame] | 99 | /* change notification functions */ |
| 100 | |
| 101 | extern void do_change_notify( int unix_fd ); |
| 102 | extern void sigio_callback(void); |
| 103 | |
Alexandre Julliard | 863637b | 2003-01-30 00:26:44 +0000 | [diff] [blame] | 104 | #endif /* __WINE_SERVER_FILE_H */ |