b9ba0b6a240009d923d976a948b5e7b37075464c
[yaboot.git] / include / ext2fs / ext2_io.h
1 /*
2  * io.h --- the I/O manager abstraction
3  * 
4  * Copyright (C) 1993, 1994, 1995, 1996 Theodore Ts'o.
5  *
6  * %Begin-Header%
7  * This file may be redistributed under the terms of the GNU Public
8  * License.
9  * %End-Header%
10  */
11
12 #ifndef _EXT2FS_EXT2_IO_H
13 #define _EXT2FS_EXT2_IO_H
14
15 /*
16  * ext2_loff_t is defined here since unix_io.c needs it.
17  */
18 #if defined(__GNUC__) || defined(HAS_LONG_LONG)
19 typedef long long       ext2_loff_t;
20 #else
21 typedef long            ext2_loff_t;
22 #endif
23
24 /* llseek.c */
25 ext2_loff_t ext2fs_llseek (int, ext2_loff_t, int);
26
27 typedef struct struct_io_manager *io_manager;
28 typedef struct struct_io_channel *io_channel;
29
30 #define CHANNEL_FLAGS_WRITETHROUGH      0x01
31
32 struct struct_io_channel {
33         errcode_t       magic;
34         io_manager      manager;
35         char            *name;
36         int             block_size;
37         errcode_t       (*read_error)(io_channel channel,
38                                       unsigned long block,
39                                       int count,
40                                       void *data,
41                                       size_t size,
42                                       int actual_bytes_read,
43                                       errcode_t error);
44         errcode_t       (*write_error)(io_channel channel,
45                                        unsigned long block,
46                                        int count,
47                                        const void *data,
48                                        size_t size,
49                                        int actual_bytes_written,
50                                        errcode_t error);
51         int             refcount;
52         int             flags;
53         int             reserved[14];
54         void            *private_data;
55         void            *app_data;
56 };
57
58 struct struct_io_manager {
59         errcode_t magic;
60         const char *name;
61         errcode_t (*open)(const char *name, int flags, io_channel *channel);
62         errcode_t (*close)(io_channel channel);
63         errcode_t (*set_blksize)(io_channel channel, int blksize);
64         errcode_t (*read_blk)(io_channel channel, unsigned long block,
65                               int count, void *data);
66         errcode_t (*write_blk)(io_channel channel, unsigned long block,
67                                int count, const void *data);
68         errcode_t (*flush)(io_channel channel);
69         errcode_t (*write_byte)(io_channel channel, unsigned long offset,
70                                 int count, const void *data);
71         int             reserved[15];
72 };
73
74 #define IO_FLAG_RW      1
75
76 /*
77  * Convenience functions....
78  */
79 #define io_channel_close(c)             ((c)->manager->close((c)))
80 #define io_channel_set_blksize(c,s)     ((c)->manager->set_blksize((c),s))
81 #define io_channel_read_blk(c,b,n,d)    ((c)->manager->read_blk((c),b,n,d))
82 #define io_channel_write_blk(c,b,n,d)   ((c)->manager->write_blk((c),b,n,d))
83 #define io_channel_flush(c)             ((c)->manager->flush((c)))
84 #define io_channel_write_byte(c,b,n,d)  ((c)->manager->write_byte((c),b,n,d))
85 #define io_channel_bumpcount(c)         ((c)->refcount++)
86         
87 /* unix_io.c */
88 extern io_manager unix_io_manager;
89
90 /* test_io.c */
91 extern io_manager test_io_manager, test_io_backing_manager;
92 extern void (*test_io_cb_read_blk)
93         (unsigned long block, int count, errcode_t err);
94 extern void (*test_io_cb_write_blk)
95         (unsigned long block, int count, errcode_t err);
96 extern void (*test_io_cb_set_blksize)
97         (int blksize, errcode_t err);
98
99 #endif /* _EXT2FS_EXT2_IO_H */
100