Ruby  2.0.0p594(2014-10-27revision48167)
nonblock.c
Go to the documentation of this file.
1 /**********************************************************************
2 
3  io/wait.c -
4 
5  $Author: kosaki $
6  created at: Tue Jul 14 21:53:18 2009
7 
8  All the files in this distribution are covered under the Ruby's
9  license (see the file COPYING).
10 
11 **********************************************************************/
12 
13 #include "ruby.h"
14 #include "ruby/io.h"
15 #ifdef HAVE_UNISTD_H
16 #include <unistd.h>
17 #endif
18 #include <fcntl.h>
19 
20 #ifdef F_GETFL
21 static int
22 io_nonblock_mode(int fd)
23 {
24  int f = fcntl(fd, F_GETFL);
25  if (f == -1) rb_sys_fail(0);
26  return f;
27 }
28 #else
29 #define io_nonblock_mode(fd) ((void)(fd), 0)
30 #endif
31 
32 #ifdef F_GETFL
33 static VALUE
35 {
36  rb_io_t *fptr;
37  GetOpenFile(io, fptr);
38  if (io_nonblock_mode(fptr->fd) & O_NONBLOCK)
39  return Qtrue;
40  return Qfalse;
41 }
42 #else
43 #define rb_io_nonblock_p rb_f_notimplement
44 #endif
45 
46 #ifdef F_SETFL
47 static void
48 io_nonblock_set(int fd, int f, int nb)
49 {
50  if (nb) {
51  if ((f & O_NONBLOCK) != 0)
52  return;
53  f |= O_NONBLOCK;
54  }
55  else {
56  if ((f & O_NONBLOCK) == 0)
57  return;
58  f &= ~O_NONBLOCK;
59  }
60  if (fcntl(fd, F_SETFL, f) == -1)
61  rb_sys_fail(0);
62 }
63 
64 static VALUE
66 {
67  rb_io_t *fptr;
68  GetOpenFile(io, fptr);
69  io_nonblock_set(fptr->fd, io_nonblock_mode(fptr->fd), RTEST(nb));
70  return io;
71 }
72 
73 static VALUE
74 io_nonblock_restore(VALUE arg)
75 {
76  int *restore = (int *)arg;
77  if (fcntl(restore[0], F_SETFL, restore[1]) == -1)
78  rb_sys_fail(0);
79  return Qnil;
80 }
81 
82 static VALUE
84 {
85  int nb = 1;
86  rb_io_t *fptr;
87  int f, restore[2];
88 
89  GetOpenFile(io, fptr);
90  if (argc > 0) {
91  VALUE v;
92  rb_scan_args(argc, argv, "01", &v);
93  nb = RTEST(v);
94  }
95  f = io_nonblock_mode(fptr->fd);
96  restore[0] = fptr->fd;
97  restore[1] = f;
98  io_nonblock_set(fptr->fd, f, nb);
99  return rb_ensure(rb_yield, io, io_nonblock_restore, (VALUE)restore);
100 }
101 #else
102 #define rb_io_nonblock_set rb_f_notimplement
103 #define rb_io_nonblock_block rb_f_notimplement
104 #endif
105 
106 void
108 {
109  VALUE io = rb_cIO;
110 
111  rb_define_method(io, "nonblock?", rb_io_nonblock_p, 0);
112  rb_define_method(io, "nonblock=", rb_io_nonblock_set, 1);
113  rb_define_method(io, "nonblock", rb_io_nonblock_block, -1);
114 }
Definition: io.h:63
#define io_nonblock_mode(fd)
Definition: nonblock.c:29
void Init_nonblock(void)
Definition: nonblock.c:107
int fcntl(int, int,...)
Definition: win32.c:3839
return Qtrue
Definition: tcltklib.c:9609
#define GetOpenFile(obj, fp)
Definition: io.h:120
return Qfalse
Definition: tcltklib.c:6778
#define F_SETFL
Definition: win32.h:587
#define Qnil
Definition: tcltklib.c:1895
int fd
Definition: io.h:64
VALUE * argv
Definition: tcltklib.c:1970
VALUE rb_yield(VALUE)
Definition: vm_eval.c:933
#define RTEST(v)
int rb_scan_args(int argc, const VALUE *argv, const char *fmt,...)
Definition: class.c:1574
int argc
Definition: tcltklib.c:1969
VALUE rb_ensure(VALUE(*b_proc)(ANYARGS), VALUE data1, VALUE(*e_proc)(ANYARGS), VALUE data2)
Definition: eval.c:804
void rb_sys_fail(const char *mesg)
Definition: error.c:1907
RUBY_EXTERN VALUE rb_cIO
Definition: ripper.y:1442
#define rb_io_nonblock_block
Definition: nonblock.c:103
arg
Definition: ripper.y:1317
#define f
#define O_NONBLOCK
Definition: win32.h:591
gz io
Definition: zlib.c:2261
#define rb_io_nonblock_p
Definition: nonblock.c:43
unsigned long VALUE
Definition: ripper.y:104
BDIGIT v
Definition: bigdecimal.c:5677
void rb_define_method(VALUE klass, const char *name, VALUE(*func)(ANYARGS), int argc)
Definition: class.c:1348
#define rb_io_nonblock_set
Definition: nonblock.c:102