blob: e17886c857a394a060802f3b17614cde476f2e2d [file] [log] [blame]
Mike Frysinger1fd98e02005-05-09 22:10:42 +00001/*
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)
19typedef long long ext2_loff_t;
20#else
21typedef long ext2_loff_t;
22#endif
23
24/* llseek.c */
25ext2_loff_t ext2fs_llseek (int, ext2_loff_t, int);
26
27typedef struct struct_io_manager *io_manager;
28typedef struct struct_io_channel *io_channel;
29
30#define CHANNEL_FLAGS_WRITETHROUGH 0x01
31
32struct 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
58struct 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 errcode_t (*set_option)(io_channel channel, const char *option,
72 const char *arg);
73 int reserved[14];
74};
75
76#define IO_FLAG_RW 1
77
78/*
79 * Convenience functions....
80 */
81#define io_channel_close(c) ((c)->manager->close((c)))
82#define io_channel_set_blksize(c,s) ((c)->manager->set_blksize((c),s))
83#define io_channel_read_blk(c,b,n,d) ((c)->manager->read_blk((c),b,n,d))
84#define io_channel_write_blk(c,b,n,d) ((c)->manager->write_blk((c),b,n,d))
85#define io_channel_flush(c) ((c)->manager->flush((c)))
86#define io_channel_bumpcount(c) ((c)->refcount++)
87
88/* io_manager.c */
89extern errcode_t io_channel_set_options(io_channel channel,
90 const char *options);
91extern errcode_t io_channel_write_byte(io_channel channel,
92 unsigned long offset,
93 int count, const void *data);
94
95/* unix_io.c */
96extern io_manager unix_io_manager;
97
98/* test_io.c */
99extern io_manager test_io_manager, test_io_backing_manager;
100extern void (*test_io_cb_read_blk)
101 (unsigned long block, int count, errcode_t err);
102extern void (*test_io_cb_write_blk)
103 (unsigned long block, int count, errcode_t err);
104extern void (*test_io_cb_set_blksize)
105 (int blksize, errcode_t err);
106
107#endif /* _EXT2FS_EXT2_IO_H */
108