1 | /* |
---|
2 | * General purpose communication channel for RTEMS to allow UNIX/POSIX |
---|
3 | * system call behavior on top of RTEMS IO devices. |
---|
4 | * |
---|
5 | * TODO |
---|
6 | * stat(2) |
---|
7 | * unlink(2) |
---|
8 | * rename(2) |
---|
9 | * |
---|
10 | * $Id$ |
---|
11 | */ |
---|
12 | |
---|
13 | #ifndef _RTEMS_LIBIO_H |
---|
14 | #define _RTEMS_LIBIO_H |
---|
15 | |
---|
16 | #include <sys/stat.h> |
---|
17 | |
---|
18 | typedef unsigned32 rtems_libio_offset_t; |
---|
19 | |
---|
20 | /* |
---|
21 | * An open file data structure, indexed by 'fd' |
---|
22 | * TODO: |
---|
23 | * should really have a separate per/file data structure that this |
---|
24 | * points to (eg: size, offset, driver, pathname should be in that) |
---|
25 | */ |
---|
26 | |
---|
27 | typedef struct { |
---|
28 | rtems_driver_name_t *driver; |
---|
29 | rtems_libio_offset_t size; /* size of file */ |
---|
30 | rtems_libio_offset_t offset; /* current offset into the file */ |
---|
31 | unsigned32 flags; |
---|
32 | char *pathname; /* opened pathname */ |
---|
33 | Objects_Id sem; |
---|
34 | unsigned32 data0; /* private to "driver" */ |
---|
35 | unsigned32 data1; /* ... */ |
---|
36 | } rtems_libio_t; |
---|
37 | |
---|
38 | |
---|
39 | /* |
---|
40 | * param block for read/write |
---|
41 | * Note: it must include 'offset' instead of using iop's offset since |
---|
42 | * we can have multiple outstanding i/o's on a device. |
---|
43 | */ |
---|
44 | |
---|
45 | typedef struct { |
---|
46 | rtems_libio_t *iop; |
---|
47 | rtems_libio_offset_t offset; |
---|
48 | unsigned8 *buffer; |
---|
49 | unsigned32 count; |
---|
50 | unsigned32 flags; |
---|
51 | unsigned32 bytes_moved; |
---|
52 | } rtems_libio_rw_args_t; |
---|
53 | |
---|
54 | /* |
---|
55 | * param block for open/close |
---|
56 | */ |
---|
57 | |
---|
58 | typedef struct { |
---|
59 | rtems_libio_t *iop; |
---|
60 | unsigned32 flags; |
---|
61 | unsigned32 mode; |
---|
62 | } rtems_libio_open_close_args_t; |
---|
63 | |
---|
64 | /* |
---|
65 | * param block for ioctl |
---|
66 | */ |
---|
67 | |
---|
68 | typedef struct { |
---|
69 | rtems_libio_t *iop; |
---|
70 | unsigned32 command; |
---|
71 | void *buffer; |
---|
72 | unsigned32 ioctl_return; |
---|
73 | } rtems_libio_ioctl_args_t; |
---|
74 | |
---|
75 | |
---|
76 | /* |
---|
77 | * Values for 'flag' |
---|
78 | */ |
---|
79 | |
---|
80 | #define LIBIO_FLAGS_NO_DELAY 0x0001 /* return immediately if no data */ |
---|
81 | #define LIBIO_FLAGS_READ 0x0002 /* reading */ |
---|
82 | #define LIBIO_FLAGS_WRITE 0x0004 /* writing */ |
---|
83 | #define LIBIO_FLAGS_LINE_BUFFERED 0x0008 /* line buffered io (^h, ^u, etc) */ |
---|
84 | #define LIBIO_FLAGS_OPEN 0x0100 /* device is open */ |
---|
85 | #define LIBIO_FLAGS_APPEND 0x0200 /* all writes append */ |
---|
86 | #define LIBIO_FLAGS_CREATE 0x0400 /* create file */ |
---|
87 | |
---|
88 | #define LIBIO_FLAGS_READ_WRITE (LIBIO_FLAGS_READ | LIBIO_FLAGS_WRITE) |
---|
89 | |
---|
90 | void rtems_libio_config(rtems_configuration_table *config, unsigned32 max_fds); |
---|
91 | void rtems_libio_init(void); |
---|
92 | |
---|
93 | int __rtems_open(const char *pathname, unsigned32 flag, unsigned32 mode); |
---|
94 | int __rtems_close(int fd); |
---|
95 | int __rtems_read(int fd, void *buffer, unsigned32 count); |
---|
96 | int __rtems_write(int fd, const void *buffer, unsigned32 count); |
---|
97 | int __rtems_ioctl(int fd, unsigned32 command, void *buffer); |
---|
98 | int __rtems_lseek(int fd, rtems_libio_offset_t offset, int whence); |
---|
99 | int __rtems_fstat(int _fd, struct stat* _sbuf); |
---|
100 | int __rtems_isatty(int _fd); |
---|
101 | |
---|
102 | /* |
---|
103 | * External I/O handlers |
---|
104 | */ |
---|
105 | typedef struct { |
---|
106 | int (*open)(const char *pathname, unsigned32 flag, unsigned32 mode); |
---|
107 | int (*close)(int fd); |
---|
108 | int (*read)(int fd, void *buffer, unsigned32 count); |
---|
109 | int (*write)(int fd, const void *buffer, unsigned32 count); |
---|
110 | int (*ioctl)(int fd, unsigned32 command, void *buffer); |
---|
111 | int (*lseek)(int fd, rtems_libio_offset_t offset, int whence); |
---|
112 | } rtems_libio_handler_t; |
---|
113 | |
---|
114 | void rtems_register_libio_handler(int handler_flag, |
---|
115 | const rtems_libio_handler_t *handler); |
---|
116 | |
---|
117 | #define RTEMS_FILE_DESCRIPTOR_TYPE_FILE 0x0000 |
---|
118 | #define RTEMS_FILE_DESCRIPTOR_TYPE_SOCKET 0x1000 |
---|
119 | #define rtems_make_file_descriptor(fd,flags) ((fd)|(flags)) |
---|
120 | #define rtems_file_descriptor_base(fd) ((fd) & 0x0FFF) |
---|
121 | #define rtems_file_descriptor_type(fd) ((fd) & 0xF000) |
---|
122 | #define rtems_file_descriptor_type_index(fd) ((((fd) & 0xF000) >> 12) - 1) |
---|
123 | |
---|
124 | #endif /* _RTEMS_LIBIO_H */ |
---|