1 /*
2 ** io.h - IO class
3 */
4 
5 #ifndef MRUBY_IO_H
6 #define MRUBY_IO_H
7 
8 #include <mruby.h>
9 
10 #ifdef MRB_DISABLE_STDIO
11 # error IO and File conflicts 'MRB_DISABLE_STDIO' configuration in your 'build_config.rb'
12 #endif
13 
14 #if defined(__cplusplus)
15 extern "C" {
16 #endif
17 
18 #if defined(MRB_WITHOUT_IO_PREAD_PWRITE)
19 # undef MRB_WITH_IO_PREAD_PWRITE
20 #elif !defined(MRB_WITH_IO_PREAD_PWRITE)
21 # if defined(__unix__) || defined(__MACH__)
22 #  define MRB_WITH_IO_PREAD_PWRITE
23 # endif
24 #endif
25 
26 struct mrb_io {
27   int fd;   /* file descriptor, or -1 */
28   int fd2;  /* file descriptor to write if it's different from fd, or -1 */
29   int pid;  /* child's pid (for pipes)  */
30   unsigned int readable:1,
31                writable:1,
32                sync:1,
33                is_socket:1;
34 };
35 
36 #define MRB_O_RDONLY            0x0000
37 #define MRB_O_WRONLY            0x0001
38 #define MRB_O_RDWR              0x0002
39 #define MRB_O_ACCMODE           (MRB_O_RDONLY | MRB_O_WRONLY | MRB_O_RDWR)
40 #define MRB_O_NONBLOCK          0x0004
41 #define MRB_O_APPEND            0x0008
42 #define MRB_O_SYNC              0x0010
43 #define MRB_O_NOFOLLOW          0x0020
44 #define MRB_O_CREAT             0x0040
45 #define MRB_O_TRUNC             0x0080
46 #define MRB_O_EXCL              0x0100
47 #define MRB_O_NOCTTY            0x0200
48 #define MRB_O_DIRECT            0x0400
49 #define MRB_O_BINARY            0x0800
50 #define MRB_O_SHARE_DELETE      0x1000
51 #define MRB_O_TMPFILE           0x2000
52 #define MRB_O_NOATIME           0x4000
53 #define MRB_O_DSYNC             0x00008000
54 #define MRB_O_RSYNC             0x00010000
55 
56 #define MRB_O_RDONLY_P(f)       ((mrb_bool)(((f) & MRB_O_ACCMODE) == MRB_O_RDONLY))
57 #define MRB_O_WRONLY_P(f)       ((mrb_bool)(((f) & MRB_O_ACCMODE) == MRB_O_WRONLY))
58 #define MRB_O_RDWR_P(f)         ((mrb_bool)(((f) & MRB_O_ACCMODE) == MRB_O_RDWR))
59 #define MRB_O_READABLE_P(f)     ((mrb_bool)((((f) & MRB_O_ACCMODE) | 2) == 2))
60 #define MRB_O_WRITABLE_P(f)     ((mrb_bool)(((((f) & MRB_O_ACCMODE) + 1) & 2) == 2))
61 
62 #define E_IO_ERROR                 (mrb_class_get(mrb, "IOError"))
63 #define E_EOF_ERROR                (mrb_class_get(mrb, "EOFError"))
64 
65 int mrb_io_fileno(mrb_state *mrb, mrb_value io);
66 
67 #if defined(__cplusplus)
68 } /* extern "C" { */
69 #endif
70 #endif /* MRUBY_IO_H */
71