ext2_io.h revision 2e8ca9a26b0bd7dae546a3f9a98df67b043fe3be
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) 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 109