00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef RUBY_IO_H
00013 #define RUBY_IO_H 1
00014
00015 #if defined(__cplusplus)
00016 extern "C" {
00017 #if 0
00018 }
00019 #endif
00020 #endif
00021
00022 #include <stdio.h>
00023 #include <errno.h>
00024 #include "ruby/encoding.h"
00025
00026 #if defined(HAVE_STDIO_EXT_H)
00027 #include <stdio_ext.h>
00028 #endif
00029
00030 #include "ruby/config.h"
00031 #if defined(HAVE_POLL)
00032 # ifdef _AIX
00033 # define reqevents events
00034 # define rtnevents revents
00035 # endif
00036 # include <poll.h>
00037 # ifdef _AIX
00038 # undef reqevents
00039 # undef rtnevents
00040 # undef events
00041 # undef revents
00042 # endif
00043 # define RB_WAITFD_IN POLLIN
00044 # define RB_WAITFD_PRI POLLPRI
00045 # define RB_WAITFD_OUT POLLOUT
00046 #else
00047 # define RB_WAITFD_IN 0x001
00048 # define RB_WAITFD_PRI 0x002
00049 # define RB_WAITFD_OUT 0x004
00050 #endif
00051
00052 #if defined __GNUC__ && __GNUC__ >= 4
00053 #pragma GCC visibility push(default)
00054 #endif
00055
00056 typedef struct {
00057 char *ptr;
00058 int off;
00059 int len;
00060 int capa;
00061 } rb_io_buffer_t;
00062
00063 typedef struct rb_io_t {
00064 int fd;
00065 FILE *stdio_file;
00066 int mode;
00067 rb_pid_t pid;
00068 int lineno;
00069 VALUE pathv;
00070 void (*finalize)(struct rb_io_t*,int);
00071
00072 rb_io_buffer_t wbuf, rbuf;
00073
00074 VALUE tied_io_for_writing;
00075
00076
00077
00078
00079
00080
00081
00082 struct rb_io_enc_t {
00083 rb_encoding *enc;
00084 rb_encoding *enc2;
00085 int ecflags;
00086 VALUE ecopts;
00087 } encs;
00088
00089 rb_econv_t *readconv;
00090 rb_io_buffer_t cbuf;
00091
00092 rb_econv_t *writeconv;
00093 VALUE writeconv_asciicompat;
00094 int writeconv_pre_ecflags;
00095 VALUE writeconv_pre_ecopts;
00096 int writeconv_initialized;
00097
00098 VALUE write_lock;
00099 } rb_io_t;
00100
00101 #define HAVE_RB_IO_T 1
00102
00103 #define FMODE_READABLE 0x00000001
00104 #define FMODE_WRITABLE 0x00000002
00105 #define FMODE_READWRITE (FMODE_READABLE|FMODE_WRITABLE)
00106 #define FMODE_BINMODE 0x00000004
00107 #define FMODE_SYNC 0x00000008
00108 #define FMODE_TTY 0x00000010
00109 #define FMODE_DUPLEX 0x00000020
00110 #define FMODE_APPEND 0x00000040
00111 #define FMODE_CREATE 0x00000080
00112
00113 #define FMODE_WSPLIT 0x00000200
00114 #define FMODE_WSPLIT_INITIALIZED 0x00000400
00115 #define FMODE_TRUNC 0x00000800
00116 #define FMODE_TEXTMODE 0x00001000
00117
00118 #define FMODE_SETENC_BY_BOM 0x00100000
00119
00120 #define GetOpenFile(obj,fp) rb_io_check_closed((fp) = RFILE(rb_io_taint_check(obj))->fptr)
00121
00122 #define RB_IO_BUFFER_INIT(buf) do {\
00123 (buf).ptr = NULL;\
00124 (buf).off = 0;\
00125 (buf).len = 0;\
00126 (buf).capa = 0;\
00127 } while (0)
00128
00129 #define MakeOpenFile(obj, fp) do {\
00130 if (RFILE(obj)->fptr) {\
00131 rb_io_close(obj);\
00132 rb_io_fptr_finalize(RFILE(obj)->fptr);\
00133 RFILE(obj)->fptr = 0;\
00134 }\
00135 (fp) = 0;\
00136 RB_IO_FPTR_NEW(fp);\
00137 RFILE(obj)->fptr = (fp);\
00138 } while (0)
00139
00140 #define RB_IO_FPTR_NEW(fp) do {\
00141 (fp) = ALLOC(rb_io_t);\
00142 (fp)->fd = -1;\
00143 (fp)->stdio_file = NULL;\
00144 (fp)->mode = 0;\
00145 (fp)->pid = 0;\
00146 (fp)->lineno = 0;\
00147 (fp)->pathv = Qnil;\
00148 (fp)->finalize = 0;\
00149 RB_IO_BUFFER_INIT((fp)->wbuf);\
00150 RB_IO_BUFFER_INIT((fp)->rbuf);\
00151 RB_IO_BUFFER_INIT((fp)->cbuf);\
00152 (fp)->readconv = NULL;\
00153 (fp)->writeconv = NULL;\
00154 (fp)->writeconv_asciicompat = Qnil;\
00155 (fp)->writeconv_pre_ecflags = 0;\
00156 (fp)->writeconv_pre_ecopts = Qnil;\
00157 (fp)->writeconv_initialized = 0;\
00158 (fp)->tied_io_for_writing = 0;\
00159 (fp)->encs.enc = NULL;\
00160 (fp)->encs.enc2 = NULL;\
00161 (fp)->encs.ecflags = 0;\
00162 (fp)->encs.ecopts = Qnil;\
00163 (fp)->write_lock = 0;\
00164 } while (0)
00165
00166 FILE *rb_io_stdio_file(rb_io_t *fptr);
00167
00168 FILE *rb_fdopen(int, const char*);
00169 int rb_io_modestr_fmode(const char *modestr);
00170 int rb_io_modestr_oflags(const char *modestr);
00171 int rb_io_oflags_fmode(int oflags);
00172 void rb_io_check_writable(rb_io_t*);
00173 void rb_io_check_readable(rb_io_t*);
00174 void rb_io_check_char_readable(rb_io_t *fptr);
00175 void rb_io_check_byte_readable(rb_io_t *fptr);
00176 int rb_io_fptr_finalize(rb_io_t*);
00177 void rb_io_synchronized(rb_io_t*);
00178 void rb_io_check_initialized(rb_io_t*);
00179 void rb_io_check_closed(rb_io_t*);
00180 VALUE rb_io_get_io(VALUE io);
00181 VALUE rb_io_check_io(VALUE io);
00182 VALUE rb_io_get_write_io(VALUE io);
00183 VALUE rb_io_set_write_io(VALUE io, VALUE w);
00184 int rb_io_wait_readable(int);
00185 int rb_io_wait_writable(int);
00186 int rb_wait_for_single_fd(int fd, int events, struct timeval *tv);
00187 void rb_io_set_nonblock(rb_io_t *fptr);
00188 int rb_io_extract_encoding_option(VALUE opt, rb_encoding **enc_p, rb_encoding **enc2_p, int *fmode_p);
00189 ssize_t rb_io_bufwrite(VALUE io, const void *buf, size_t size);
00190
00191
00192 #define rb_io_mode_flags(modestr) rb_io_modestr_fmode(modestr)
00193 #define rb_io_modenum_flags(oflags) rb_io_oflags_fmode(oflags)
00194
00195 VALUE rb_io_taint_check(VALUE);
00196 NORETURN(void rb_eof_error(void));
00197
00198 void rb_io_read_check(rb_io_t*);
00199 int rb_io_read_pending(rb_io_t*);
00200 DEPRECATED(void rb_read_check(FILE*));
00201
00202 #if defined __GNUC__ && __GNUC__ >= 4
00203 #pragma GCC visibility pop
00204 #endif
00205
00206 #if defined(__cplusplus)
00207 #if 0
00208 {
00209 #endif
00210 }
00211 #endif
00212
00213 #endif
00214