ruby-termios 0.9.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,14 @@
1
+ # to input secretly [ruby-list:15968]
2
+ require 'termios'
3
+
4
+ $stdin.extend Termios
5
+
6
+ oldt = $stdin.tcgetattr
7
+ newt = oldt.dup
8
+ newt.lflag &= ~Termios::ECHO
9
+ $stdin.tcsetattr(Termios::TCSANOW, newt)
10
+ print "noecho> "
11
+ a = $stdin.gets
12
+ $stdin.tcsetattr(Termios::TCSANOW, oldt)
13
+ print "\n"
14
+ p a
data/extconf.rb ADDED
@@ -0,0 +1,20 @@
1
+ require 'mkmf'
2
+
3
+ if have_header('termios.h') &&
4
+ have_header('unistd.h')
5
+ have_header('sys/ioctl.h')
6
+
7
+ if RUBY_VERSION >= '1.7'
8
+ have_header('ruby/io.h')
9
+ if have_type("rb_io_t", ["ruby.h", "rubyio.h"])
10
+ have_struct_member("rb_io_t", "fd", ["ruby.h", "rubyio.h"])
11
+ else
12
+ have_struct_member("OpenFile", "fd", ["ruby.h", "rubyio.h"])
13
+ end
14
+ if have_macro("OpenFile", ["ruby.h", "rubyio.h"])
15
+ $defs.push("-DHAVE_MACRO_OPENFILE")
16
+ end
17
+ end
18
+
19
+ create_makefile('termios')
20
+ end
data/lib/termios.rb ADDED
@@ -0,0 +1,151 @@
1
+ require 'termios.so'
2
+
3
+ module Termios
4
+ VISIBLE_CHAR = {}
5
+ [
6
+ "^@", "^A", "^B", "^C", "^D", "^E", "^F", "^G",
7
+ "^H", "^I", "^J", "^K", "^L", "^M", "^N", "^O",
8
+ "^P", "^Q", "^R", "^S", "^T", "^U", "^V", "^W",
9
+ "^X", "^Y", "^Z", "^[", "^\\", "^]", "^^", "^_",
10
+ "<sp>", "!", "\"", "#", "$", "%", "&", "'",
11
+ "(", ")", "*", "+", ",", "-", ".", "/",
12
+ "0", "1", "2", "3", "4", "5", "6", "7",
13
+ "8", "9", ":", ";", "<", "=", ">", "?",
14
+ "@", "A", "B", "C", "D", "E", "F", "G",
15
+ "H", "I", "J", "K", "L", "M", "N", "O",
16
+ "P", "Q", "R", "S", "T", "U", "V", "W",
17
+ "X", "Y", "Z", "[", "\\", "]", "^", "_",
18
+ "`", "a", "b", "c", "d", "e", "f", "g",
19
+ "h", "i", "j", "k", "l", "m", "n", "o",
20
+ "p", "q", "r", "s", "t", "u", "v", "w",
21
+ "x", "y", "z", "{", "|", "}", "~", "^?",
22
+ "M-^@", "M-^A", "M-^B", "M-^C", "M-^D", "M-^E", "M-^F", "M-^G",
23
+ "M-^H", "M-^I", "M-^J", "M-^K", "M-^L", "M-^M", "M-^N", "M-^O",
24
+ "M-^P", "M-^Q", "M-^R", "M-^S", "M-^T", "M-^U", "M-^V", "M-^W",
25
+ "M-^X", "M-^Y", "M-^Z", "M-^[", "M-^\\", "M-^]", "M-^^", "M-^_",
26
+ "M-<sp>", "M-!", "M-\"", "M-#", "M-$", "M-%", "M-&", "M-'",
27
+ "M-(", "M-)", "M-*", "M-+", "M-,", "M--", "M-.", "M-/",
28
+ "M-0", "M-1", "M-2", "M-3", "M-4", "M-5", "M-6", "M-7",
29
+ "M-8", "M-9", "M-:", "M-;", "M-<", "M-=", "M->", "M-?",
30
+ "M-@", "M-A", "M-B", "M-C", "M-D", "M-E", "M-F", "M-G",
31
+ "M-H", "M-I", "M-J", "M-K", "M-L", "M-M", "M-N", "M-O",
32
+ "M-P", "M-Q", "M-R", "M-S", "M-T", "M-U", "M-V", "M-W",
33
+ "M-X", "M-Y", "M-Z", "M-[", "M-\\", "M-]", "M-^", "M-_",
34
+ "M-`", "M-a", "M-b", "M-c", "M-d", "M-e", "M-f", "M-g",
35
+ "M-h", "M-i", "M-j", "M-k", "M-l", "M-m", "M-n", "M-o",
36
+ "M-p", "M-q", "M-r", "M-s", "M-t", "M-u", "M-v", "M-w",
37
+ "M-x", "M-y", "M-z", "M-{", "M-|", "M-}", "M-~", "M-^?",
38
+ ].each_with_index {|s, i|
39
+ VISIBLE_CHAR[i] = s
40
+ VISIBLE_CHAR[[i].pack("C")] = s
41
+ }
42
+ VISIBLE_CHAR[POSIX_VDISABLE] = "<undef>"
43
+ VISIBLE_CHAR[[POSIX_VDISABLE].pack("C")] = "<undef>"
44
+
45
+ class Termios
46
+ def inspect
47
+ str = "\#<#{self.class}"
48
+ if self.ispeed == self.ospeed
49
+ speed = (BAUDS[self.ispeed] || "B???").to_s[1..-1]
50
+ str << " speed #{speed} baud;"
51
+ else
52
+ ispeed = (BAUDS[self.ispeed] || "B???").to_s[1..-1]
53
+ ospeed = (BAUDS[self.ospeed] || "B???").to_s[1..-1]
54
+ str << " ispeed #{ispeed} baud; ospeed #{ospeed} baud;"
55
+ end
56
+
57
+ CCINDEX_NAMES.each {|ccindex|
58
+ next if ccindex == :VMIN || ccindex == :VTIME
59
+ str << " #{ccindex.to_s[1..-1].downcase}"
60
+ str << "=#{VISIBLE_CHAR[self.cc[::Termios.const_get(ccindex)]]}"
61
+ }
62
+ str << " min=#{self.cc[VMIN]}"
63
+ str << " time=#{self.cc[VTIME]}"
64
+
65
+ [
66
+ [:cflag,
67
+ CFLAG_NAMES-[:CBAUD, :CBAUDEX, :CIBAUD, :EXTA, :EXTB],
68
+ CFLAG_CHOICES],
69
+ [:iflag, IFLAG_NAMES, nil],
70
+ [:oflag, OFLAG_NAMES, OFLAG_CHOICES],
71
+ [:lflag, LFLAG_NAMES, nil]
72
+ ].each {|l|
73
+ str << ";"
74
+ flag_type, flag_names, choices = l
75
+ flags = self.send(flag_type)
76
+ choice_names = choices ? choices.values.flatten : []
77
+ (flag_names-choice_names).each {|name|
78
+ str << " "
79
+ if choices and ns = choices[name]
80
+ mask = ::Termios.const_get(name)
81
+ ns.each {|n|
82
+ if (flags & mask) == ::Termios.const_get(n)
83
+ str << n.to_s.downcase
84
+ break
85
+ end
86
+ }
87
+ else
88
+ str << "-" if (flags & ::Termios.const_get(name)) == 0
89
+ str << name.to_s.downcase
90
+ end
91
+ }
92
+ }
93
+
94
+ str << ">"
95
+ str
96
+ end
97
+
98
+ def pretty_print(q) # :nodoc:
99
+ q.object_group(self) {
100
+ if self.ispeed == self.ospeed
101
+ speed = (BAUDS[self.ispeed] || "B???").to_s[1..-1]
102
+ q.fill_breakable; q.text "speed #{speed} baud;"
103
+ else
104
+ ispeed = (BAUDS[self.ispeed] || "B???").to_s[1..-1]
105
+ ospeed = (BAUDS[self.ospeed] || "B???").to_s[1..-1]
106
+ q.fill_breakable; q.text "ispeed #{ispeed} baud;"
107
+ q.fill_breakable; q.text "ospeed #{ospeed} baud;"
108
+ end
109
+ q.breakable
110
+
111
+ q.seplist(CCINDEX_NAMES-[:VMIN, :VTIME],
112
+ lambda { q.fill_breakable }) {|ccindex|
113
+ q.text ccindex.to_s[1..-1].downcase
114
+ q.text "=#{VISIBLE_CHAR[self.cc[::Termios.const_get(ccindex)]]}"
115
+ }
116
+ q.breakable; q.text "min=#{self.cc[VMIN]}"
117
+ q.fill_breakable; q.text "time=#{self.cc[VTIME]}"
118
+
119
+ [
120
+ [:cflag,
121
+ CFLAG_NAMES-[:CBAUD, :CBAUDEX, :CIBAUD, :EXTA, :EXTB],
122
+ CFLAG_CHOICES],
123
+ [:iflag, IFLAG_NAMES, nil],
124
+ [:oflag, OFLAG_NAMES, OFLAG_CHOICES],
125
+ [:lflag, LFLAG_NAMES, nil]
126
+ ].each {|l|
127
+ q.text ";"
128
+ q.breakable
129
+ flag_type, flag_names, choices = l
130
+ flags = self.send(flag_type)
131
+ choice_names = choices ? choices.values.flatten : []
132
+ q.seplist(flag_names-choice_names,
133
+ lambda { q.fill_breakable }) {|name|
134
+ if choices and ns = choices[name]
135
+ mask = ::Termios.const_get(name)
136
+ ns.each {|n|
137
+ if (flags & mask) == ::Termios.const_get(n)
138
+ q.text n.to_s.downcase
139
+ break
140
+ end
141
+ }
142
+ else
143
+ q.text "-" if (flags & ::Termios.const_get(name)) == 0
144
+ q.text name.to_s.downcase
145
+ end
146
+ }
147
+ }
148
+ }
149
+ end
150
+ end
151
+ end
data/termios.c ADDED
@@ -0,0 +1,1537 @@
1
+ /*
2
+
3
+ A termios library for Ruby.
4
+ Copyright (C) 1999, 2000, 2002 akira yamada.
5
+
6
+ */
7
+
8
+ #include "ruby.h"
9
+ #if defined(HAVE_RUBY_IO_H)
10
+ #include "ruby/io.h"
11
+ #else
12
+ #include "rubyio.h"
13
+ #endif
14
+ #include <termios.h>
15
+ #include <sys/ioctl.h>
16
+ #if defined(HAVE_SYS_IOCTL_H)
17
+ #include <unistd.h>
18
+ #endif
19
+ #include <string.h>
20
+
21
+ #if defined(HAVE_TYPE_RB_IO_T) && !defined(HAVE_MACRO_OPENFILE)
22
+ typedef rb_io_t OpenFile;
23
+ #endif
24
+
25
+ #if defined(HAVE_ST_FD)
26
+ #define FILENO(fptr) (fptr->fd)
27
+ #else
28
+ #define FILENO(fptr) fileno(fptr->f)
29
+ #endif
30
+
31
+ #define validate_ulong(v) ULONG2NUM(NUM2ULONG(v))
32
+
33
+ static VALUE mTermios;
34
+ static VALUE cTermios;
35
+ static VALUE tcsetattr_opt, tcflush_qs, tcflow_act;
36
+ static ID id_iflag, id_oflag, id_cflag, id_lflag, id_cc, id_ispeed, id_ospeed;
37
+
38
+ /*
39
+ * Document-class: Termios::Termios
40
+ *
41
+ * Encupsalates termios parameters.
42
+ *
43
+ * See also: termios(3)
44
+ */
45
+
46
+ /*
47
+ * call-seq:
48
+ * termios.iflag = flag
49
+ *
50
+ * Updates input modes of the object.
51
+ */
52
+ static VALUE
53
+ termios_set_iflag(self, value)
54
+ VALUE self, value;
55
+ {
56
+ rb_ivar_set(self, id_iflag, validate_ulong(value));
57
+
58
+ return value;
59
+ }
60
+
61
+ /*
62
+ * call-seq:
63
+ * termios.oflag = flag
64
+ *
65
+ * Updates output modes of the object.
66
+ */
67
+ static VALUE
68
+ termios_set_oflag(self, value)
69
+ VALUE self, value;
70
+ {
71
+ rb_ivar_set(self, id_oflag, validate_ulong(value));
72
+
73
+ return value;
74
+ }
75
+
76
+ /*
77
+ * call-seq:
78
+ * termios.cflag = flag
79
+ *
80
+ * Updates control modes of the object.
81
+ */
82
+ static VALUE
83
+ termios_set_cflag(self, value)
84
+ VALUE self, value;
85
+ {
86
+ rb_ivar_set(self, id_cflag, validate_ulong(value));
87
+
88
+ return value;
89
+ }
90
+
91
+ /*
92
+ * call-seq:
93
+ * termios.lflag = flag
94
+ *
95
+ * Updates local modes of the object.
96
+ */
97
+ static VALUE
98
+ termios_set_lflag(self, value)
99
+ VALUE self, value;
100
+ {
101
+ rb_ivar_set(self, id_lflag, validate_ulong(value));
102
+
103
+ return value;
104
+ }
105
+
106
+ /*
107
+ * call-seq:
108
+ * termios.cc = value
109
+ *
110
+ * Updates control characters of the object.
111
+ */
112
+ static VALUE
113
+ termios_set_cc(self, value)
114
+ VALUE self, value;
115
+ {
116
+ Check_Type(value, T_ARRAY);
117
+ rb_ivar_set(self, id_cc, value);
118
+
119
+ return value;
120
+ }
121
+
122
+ /*
123
+ * call-seq:
124
+ * termios.ispeed = speed
125
+ *
126
+ * Updates input baud rate of the object.
127
+ */
128
+ static VALUE
129
+ termios_set_ispeed(self, value)
130
+ VALUE self, value;
131
+ {
132
+ rb_ivar_set(self, id_ispeed, validate_ulong(value));
133
+
134
+ return value;
135
+ }
136
+
137
+ /*
138
+ * call-seq:
139
+ * termios.ospeed = speed
140
+ *
141
+ * Updates output baud rate of the object.
142
+ */
143
+ static VALUE
144
+ termios_set_ospeed(self, value)
145
+ VALUE self, value;
146
+ {
147
+ rb_ivar_set(self, id_ospeed, validate_ulong(value));
148
+
149
+ return value;
150
+ }
151
+
152
+ /*
153
+ * call-seq:
154
+ * Termios.new
155
+ *
156
+ * Returns new Termios::Termios object.
157
+ */
158
+ static VALUE
159
+ termios_initialize(argc, argv, self)
160
+ int argc;
161
+ VALUE *argv;
162
+ VALUE self;
163
+ {
164
+ VALUE c_iflag, c_oflag, c_cflag, c_lflag, c_cc, c_ispeed, c_ospeed;
165
+ VALUE cc_ary;
166
+ int i;
167
+
168
+ cc_ary = rb_ary_new2(NCCS);
169
+ for (i = 0; i < NCCS; i++) {
170
+ rb_ary_store(cc_ary, i, INT2FIX(0));
171
+ }
172
+
173
+ rb_ivar_set(self, id_iflag, INT2FIX(0));
174
+ rb_ivar_set(self, id_oflag, INT2FIX(0));
175
+ rb_ivar_set(self, id_cflag, INT2FIX(0));
176
+ rb_ivar_set(self, id_lflag, INT2FIX(0));
177
+ rb_ivar_set(self, id_cc, cc_ary);
178
+ rb_ivar_set(self, id_ispeed, INT2FIX(0));
179
+ rb_ivar_set(self, id_ospeed, INT2FIX(0));
180
+
181
+ rb_scan_args(argc, argv, "07",
182
+ &c_iflag, &c_oflag, &c_cflag, &c_lflag,
183
+ &c_cc, &c_ispeed, &c_ospeed);
184
+
185
+ if (!NIL_P(c_iflag))
186
+ termios_set_iflag(self, c_iflag);
187
+
188
+ if (!NIL_P(c_oflag))
189
+ termios_set_oflag(self, c_oflag);
190
+
191
+ if (!NIL_P(c_cflag))
192
+ termios_set_cflag(self, c_cflag);
193
+
194
+ if (!NIL_P(c_lflag))
195
+ termios_set_lflag(self, c_lflag);
196
+
197
+ if (!NIL_P(c_cc))
198
+ termios_set_cc(self, c_cc);
199
+
200
+ if (!NIL_P(c_ispeed))
201
+ termios_set_ispeed(self, c_ispeed);
202
+
203
+ if (!NIL_P(c_ospeed))
204
+ termios_set_ispeed(self, c_ospeed);
205
+
206
+ return self;
207
+ }
208
+
209
+ /*
210
+ * Document-module: Termios
211
+ *
212
+ * = Description
213
+ *
214
+ * Termios module is simple wrapper of termios(3). It can be included
215
+ * into IO-family classes and can extend IO-family objects. In addition,
216
+ * the methods can use as module function.
217
+ *
218
+ * You can call termios(3) function as module methods. Or you can use these
219
+ * methods as instance method by including Termios module to the target IO
220
+ * object.
221
+ *
222
+ * == Constants
223
+ *
224
+ * Many constants which are derived from "termios.h" are defined on Termios
225
+ * module. You can use these constants as the same name in "termios.h"
226
+ * basically.
227
+ *
228
+ * IFLAGS, OFLAGS, CFLAGS and LFLAGS are Hash object. They contains Symbols
229
+ * of constants for c_iflag, c_oflag, c_cflag and c_lflag. CCINDEX and BAUDS
230
+ * are Hash object too. They contains Symbols of constats for c_cc or ispeed
231
+ * and ospeed.
232
+ *
233
+ * == See also
234
+ *
235
+ * termios(3)
236
+ */
237
+
238
+ static VALUE
239
+ termios_to_Termios(t)
240
+ struct termios *t;
241
+ {
242
+ int i;
243
+ VALUE obj, cc_ary;
244
+
245
+ obj = rb_funcall(cTermios, rb_intern("new"), 0);
246
+
247
+ termios_set_iflag(obj, ULONG2NUM(t->c_iflag));
248
+ termios_set_oflag(obj, ULONG2NUM(t->c_oflag));
249
+ termios_set_cflag(obj, ULONG2NUM(t->c_cflag));
250
+ termios_set_lflag(obj, ULONG2NUM(t->c_lflag));
251
+
252
+ cc_ary = rb_ary_new2(NCCS);
253
+ for (i = 0; i < NCCS; i++) {
254
+ rb_ary_store(cc_ary, i, CHR2FIX(t->c_cc[i]));
255
+ }
256
+ termios_set_cc(obj, cc_ary);
257
+
258
+ termios_set_ispeed(obj, ULONG2NUM(cfgetispeed(t)));
259
+ termios_set_ospeed(obj, ULONG2NUM(cfgetospeed(t)));
260
+
261
+ return obj;
262
+ }
263
+
264
+ static void
265
+ Termios_to_termios(obj, t)
266
+ VALUE obj;
267
+ struct termios *t;
268
+ {
269
+ int i;
270
+ VALUE cc_ary;
271
+
272
+ t->c_iflag = NUM2ULONG(rb_ivar_get(obj, id_iflag));
273
+ t->c_oflag = NUM2ULONG(rb_ivar_get(obj, id_oflag));
274
+ t->c_cflag = NUM2ULONG(rb_ivar_get(obj, id_cflag));
275
+ t->c_lflag = NUM2ULONG(rb_ivar_get(obj, id_lflag));
276
+
277
+ cc_ary = rb_ivar_get(obj, id_cc);
278
+ for (i = 0; i < NCCS; i++) {
279
+ VALUE elt = rb_ary_entry(cc_ary, i);
280
+ t->c_cc[i] = NUM2CHR(elt);
281
+ }
282
+
283
+ cfsetispeed(t, NUM2ULONG(rb_ivar_get(obj, id_ispeed)));
284
+ cfsetospeed(t, NUM2ULONG(rb_ivar_get(obj, id_ospeed)));
285
+ }
286
+
287
+ /*
288
+ * call-seq:
289
+ * Termios.tcgetattr(io)
290
+ * io.tcgetattr
291
+ *
292
+ * Returns new Termios::Termios object which stores termios parameters
293
+ * associated with the io.
294
+ *
295
+ * require 'termios'
296
+ *
297
+ * Termios.tcgetattr($stdin)
298
+ * #=> #<Termios::Termios speed 38400 baud; intr=^C ... >
299
+ *
300
+ * $stdout.extend(Termios)
301
+ * $stdout.tcgetattr
302
+ * #=> #<Termios::Termios speed 38400 baud; intr=^C ... >
303
+ *
304
+ * See also: tcgetattr(3)
305
+ */
306
+ static VALUE
307
+ termios_tcgetattr(io)
308
+ VALUE io;
309
+ {
310
+ struct termios t;
311
+ OpenFile *fptr;
312
+
313
+ Check_Type(io, T_FILE);
314
+ GetOpenFile(io, fptr);
315
+ if (tcgetattr(FILENO(fptr), &t) < 0) {
316
+ rb_sys_fail("tcgetattr");
317
+ }
318
+
319
+ return termios_to_Termios(&t);
320
+ }
321
+
322
+ static VALUE
323
+ termios_s_tcgetattr(obj, io)
324
+ VALUE obj, io;
325
+ {
326
+ return termios_tcgetattr(io);
327
+ }
328
+
329
+ /*
330
+ * call-seq:
331
+ * Termios.tcsetattr(io, option, termios)
332
+ * io.tcsetattr(option, termios)
333
+ *
334
+ * Sets the Termios::Termios object as the termios paramter to the io
335
+ * and returns the old termios parameter.
336
+ *
337
+ * Option are specifies when the parameter is changed. What option are
338
+ * available is plathome dependent, but usually Termios::TCSANOW,
339
+ * Termios::TCSADRAIN and Termios::TCSAFLUSH are provided.
340
+ *
341
+ * require 'termios'
342
+ *
343
+ * oldt = Termios.tcgetattr($stdin)
344
+ * newt = oldt.dup
345
+ * newt.lflag &= ~Termios::ECHO
346
+ *
347
+ * secret = nil
348
+ * begin
349
+ * Termios.tcsetattr($stdin, Termios::TCSANOW, newt)
350
+ * print "noecho> "
351
+ * secret = $stdin.gets
352
+ * print "\n"
353
+ * ensure
354
+ * Termios.tcsetattr($stdin, Termios::TCSANOW, oldt)
355
+ * end
356
+ *
357
+ * puts secret
358
+ *
359
+ * See also: tcsetattr(3)
360
+ */
361
+ static VALUE
362
+ termios_tcsetattr(io, opt, param)
363
+ VALUE io, opt, param;
364
+ {
365
+ VALUE old;
366
+ OpenFile *fptr;
367
+ struct termios t;
368
+ int tcsetattr_option;
369
+
370
+ Check_Type(io, T_FILE);
371
+ Check_Type(opt, T_FIXNUM);
372
+ if (CLASS_OF(param) != cTermios) {
373
+ const char *type = rb_class2name(CLASS_OF(param));
374
+ rb_raise(rb_eTypeError,
375
+ "wrong argument type %s (expected Termios::Termios)",
376
+ type);
377
+ }
378
+
379
+ tcsetattr_option = FIX2INT(opt);
380
+ if (rb_ary_includes(tcsetattr_opt, opt) != Qtrue) {
381
+ rb_raise(rb_eArgError,
382
+ "wrong option value %d", tcsetattr_option);
383
+ }
384
+
385
+ old = termios_tcgetattr(io);
386
+ GetOpenFile(io, fptr);
387
+ Termios_to_termios(param, &t);
388
+ if (tcsetattr(FILENO(fptr), tcsetattr_option, &t) < 0) {
389
+ rb_sys_fail("tcsetattr");
390
+ }
391
+
392
+ return old;
393
+ }
394
+
395
+ static VALUE
396
+ termios_s_tcsetattr(obj, io, opt, param)
397
+ VALUE obj, io, opt, param;
398
+ {
399
+ return termios_tcsetattr(io, opt, param);
400
+ }
401
+
402
+ /*
403
+ * call-seq:
404
+ * Termios.tcsendbreak(io, duration)
405
+ * io.tcsendbreak(duration)
406
+ *
407
+ * Sends a continuous stream of 0-bits for a specific duration.
408
+ *
409
+ * See also: tcsendbreak(3)
410
+ */
411
+ static VALUE
412
+ termios_tcsendbreak(io, duration)
413
+ VALUE io, duration;
414
+ {
415
+ OpenFile *fptr;
416
+
417
+ Check_Type(io, T_FILE);
418
+ Check_Type(duration, T_FIXNUM);
419
+
420
+ GetOpenFile(io, fptr);
421
+ if (tcsendbreak(FILENO(fptr), FIX2INT(duration)) < 0) {
422
+ rb_sys_fail("tcsendbreak");
423
+ }
424
+
425
+ return Qtrue;
426
+ }
427
+
428
+ static VALUE
429
+ termios_s_tcsendbreak(obj, io, duration)
430
+ VALUE obj, io, duration;
431
+ {
432
+ return termios_tcsendbreak(io, duration);
433
+ }
434
+
435
+ /*
436
+ * call-seq:
437
+ * Termios.tcdrain(io)
438
+ * io.tcdrain
439
+ *
440
+ * Waits until all output to the object has been sent.
441
+ *
442
+ * See also: tcdrain(3)
443
+ */
444
+ static VALUE
445
+ termios_tcdrain(io)
446
+ VALUE io;
447
+ {
448
+ OpenFile *fptr;
449
+
450
+ Check_Type(io, T_FILE);
451
+
452
+ GetOpenFile(io, fptr);
453
+ if (tcdrain(FILENO(fptr)) < 0) {
454
+ rb_sys_fail("tcdrain");
455
+ }
456
+
457
+ return Qtrue;
458
+ }
459
+
460
+ static VALUE
461
+ termios_s_tcdrain(obj, io)
462
+ VALUE obj, io;
463
+ {
464
+ return termios_tcdrain(io);
465
+ }
466
+
467
+ /*
468
+ * call-seq:
469
+ * Termios.tcflush(io, qs)
470
+ * io.tcflush(qs)
471
+ *
472
+ * Cancels data written to the object but not send or data received but not
473
+ * read.
474
+ *
475
+ * See also: tcflush(3)
476
+ */
477
+ static VALUE
478
+ termios_tcflush(io, qs)
479
+ VALUE io, qs;
480
+ {
481
+ OpenFile *fptr;
482
+ int queue_selector;
483
+
484
+ Check_Type(io, T_FILE);
485
+ Check_Type(qs, T_FIXNUM);
486
+ queue_selector = FIX2INT(qs);
487
+ if (rb_ary_includes(tcflush_qs, qs) != Qtrue) {
488
+ rb_raise(rb_eArgError,
489
+ "wrong queue-selector value %d", queue_selector);
490
+ }
491
+
492
+ GetOpenFile(io, fptr);
493
+ if (tcflush(FILENO(fptr), queue_selector) < 0) {
494
+ rb_sys_fail("tcflush");
495
+ }
496
+
497
+ return Qtrue;
498
+ }
499
+
500
+ static VALUE
501
+ termios_s_tcflush(obj, io, qs)
502
+ VALUE obj, io, qs;
503
+ {
504
+ return termios_tcflush(io, qs);
505
+ }
506
+
507
+ /*
508
+ * call-seq:
509
+ * Termios.tcflow(io, action)
510
+ * io.tcflow(action)
511
+ *
512
+ * Suspends write or read of data on the object.
513
+ *
514
+ * See also: tcflow(3)
515
+ */
516
+ static VALUE
517
+ termios_tcflow(io, act)
518
+ VALUE io, act;
519
+ {
520
+ OpenFile *fptr;
521
+ int action;
522
+
523
+ Check_Type(io, T_FILE);
524
+ Check_Type(act, T_FIXNUM);
525
+ action = FIX2INT(act);
526
+ if (rb_ary_includes(tcflow_act, act) != Qtrue) {
527
+ rb_raise(rb_eArgError,
528
+ "wrong action value %d", action);
529
+ }
530
+
531
+ GetOpenFile(io, fptr);
532
+ if (tcflow(FILENO(fptr), action) < 0) {
533
+ rb_sys_fail("tcflow");
534
+ }
535
+
536
+ return Qtrue;
537
+ }
538
+
539
+ static VALUE
540
+ termios_s_tcflow(obj, io, act)
541
+ VALUE obj, io, act;
542
+ {
543
+ return termios_tcflow(io, act);
544
+ }
545
+
546
+ /*
547
+ * call-seq:
548
+ * Termios.tcgetpgrp(io)
549
+ * io.tcgetpgrp
550
+ *
551
+ * Returns the process group ID of the foreground process group the
552
+ * terminal associated to the object.
553
+ *
554
+ * See also: tcgetpgrp(3)
555
+ */
556
+ static VALUE
557
+ termios_tcgetpgrp(io)
558
+ VALUE io;
559
+ {
560
+ OpenFile *fptr;
561
+ pid_t pid;
562
+
563
+ Check_Type(io, T_FILE);
564
+ GetOpenFile(io, fptr);
565
+ if ((pid = tcgetpgrp(FILENO(fptr))) < 0) {
566
+ rb_sys_fail("tcgetpgrp");
567
+ }
568
+
569
+ return LONG2NUM(pid);
570
+ }
571
+
572
+ static VALUE
573
+ termios_s_tcgetpgrp(obj, io)
574
+ VALUE obj, io;
575
+ {
576
+ return termios_tcgetpgrp(io);
577
+ }
578
+
579
+ /*
580
+ * call-seq:
581
+ * Termios.tcsetpgrp(io, pgrpid)
582
+ * io.tcsetpgrp(pgrpid)
583
+ *
584
+ * Makes the process group with pgrpid the foreground process group on the
585
+ * terminal associated to the object.
586
+ *
587
+ * See also: tcsetpgrp(3)
588
+ */
589
+ static VALUE
590
+ termios_tcsetpgrp(io, pgrpid)
591
+ VALUE io, pgrpid;
592
+ {
593
+ OpenFile *fptr;
594
+ pid_t pgrp;
595
+
596
+ Check_Type(io, T_FILE);
597
+ pgrp = NUM2LONG(pgrpid);
598
+
599
+ GetOpenFile(io, fptr);
600
+ if (tcsetpgrp(FILENO(fptr), pgrp) < 0) {
601
+ rb_sys_fail("tcsetpgrp");
602
+ }
603
+
604
+ return Qtrue;
605
+ }
606
+
607
+ static VALUE
608
+ termios_s_tcsetpgrp(obj, io, pgrpid)
609
+ VALUE obj, io, pgrpid;
610
+ {
611
+ return termios_tcsetpgrp(io, pgrpid);
612
+ }
613
+
614
+ /*
615
+ * call-seq:
616
+ * Termios.new_termios
617
+ *
618
+ * Returns new Termios::Termios object.
619
+ */
620
+ static VALUE
621
+ termios_s_newtermios(argc, argv, klass)
622
+ int argc;
623
+ VALUE *argv;
624
+ VALUE klass;
625
+ {
626
+ return rb_funcall2(cTermios, rb_intern("new"), argc, argv);
627
+ }
628
+
629
+ /*
630
+ * call-seq:
631
+ * termios.dup
632
+ *
633
+ * Produces a shallow copy of the object.
634
+ */
635
+ static VALUE
636
+ termios_dup(self)
637
+ VALUE self;
638
+ {
639
+ VALUE result;
640
+ VALUE cc_ary;
641
+
642
+ result = rb_call_super(0, 0);
643
+ cc_ary = rb_ivar_get(self, id_cc);
644
+ rb_ivar_set(result, id_cc, rb_ary_dup(cc_ary));
645
+
646
+ return result;
647
+ }
648
+
649
+ void
650
+ Init_termios()
651
+ {
652
+ VALUE ccindex, ccindex_names;
653
+ VALUE iflags, iflags_names;
654
+ VALUE oflags, oflags_names, oflags_choices;
655
+ VALUE cflags, cflags_names, cflags_choices;
656
+ VALUE lflags, lflags_names;
657
+ VALUE bauds, bauds_names;
658
+ VALUE ioctl_commands, ioctl_commands_names;
659
+ VALUE modem_signals, modem_signals_names;
660
+ VALUE pty_pkt_options, pty_pkt_options_names;
661
+ VALUE line_disciplines, line_disciplines_names;
662
+
663
+ /* module Termios */
664
+
665
+ mTermios = rb_define_module("Termios");
666
+
667
+ rb_define_singleton_method(mTermios,"tcgetattr", termios_s_tcgetattr, 1);
668
+ rb_define_module_function(mTermios, "getattr", termios_s_tcgetattr, 1);
669
+ rb_define_method(mTermios, "tcgetattr", termios_tcgetattr, 0);
670
+
671
+ rb_define_singleton_method(mTermios,"tcsetattr", termios_s_tcsetattr, 3);
672
+ rb_define_module_function(mTermios, "setattr", termios_s_tcsetattr, 3);
673
+ rb_define_method(mTermios, "tcsetattr", termios_tcsetattr, 2);
674
+
675
+ rb_define_singleton_method(mTermios,"tcsendbreak",termios_s_tcsendbreak,2);
676
+ rb_define_module_function(mTermios, "sendbreak",termios_s_tcsendbreak,2);
677
+ rb_define_method(mTermios, "tcsendbreak",termios_tcsendbreak, 1);
678
+
679
+ rb_define_singleton_method(mTermios,"tcdrain", termios_s_tcdrain, 1);
680
+ rb_define_module_function(mTermios, "drain", termios_s_tcdrain, 1);
681
+ rb_define_method(mTermios, "tcdrain", termios_tcdrain, 0);
682
+
683
+ rb_define_singleton_method(mTermios,"tcflush", termios_s_tcflush, 2);
684
+ rb_define_module_function(mTermios, "flush", termios_s_tcflush, 2);
685
+ rb_define_method(mTermios, "tcflush", termios_tcflush, 1);
686
+
687
+ rb_define_singleton_method(mTermios,"tcflow", termios_s_tcflow, 2);
688
+ rb_define_module_function(mTermios, "flow", termios_s_tcflow, 2);
689
+ rb_define_method(mTermios, "tcflow", termios_tcflow, 1);
690
+
691
+ rb_define_singleton_method(mTermios,"tcgetpgrp", termios_s_tcgetpgrp, 1);
692
+ rb_define_module_function(mTermios, "getpgrp", termios_s_tcgetpgrp, 1);
693
+ rb_define_method(mTermios, "tcgetpgrp", termios_tcgetpgrp, 0);
694
+
695
+ rb_define_singleton_method(mTermios,"tcsetpgrp", termios_s_tcsetpgrp, 2);
696
+ rb_define_module_function(mTermios, "setpgrp", termios_s_tcsetpgrp, 2);
697
+ rb_define_method(mTermios, "tcsetpgrp", termios_tcsetpgrp, 1);
698
+
699
+ rb_define_module_function(mTermios,"new_termios",termios_s_newtermios, -1);
700
+
701
+ /* class Termios::Termios */
702
+
703
+ cTermios = rb_define_class_under(mTermios, "Termios", rb_cObject);
704
+
705
+ id_iflag = rb_intern("@iflag");
706
+ id_oflag = rb_intern("@oflag");
707
+ id_cflag = rb_intern("@cflag");
708
+ id_lflag = rb_intern("@lflag");
709
+ id_cc = rb_intern("@cc");
710
+ id_ispeed = rb_intern("@ispeed");
711
+ id_ospeed = rb_intern("@ospeed");
712
+
713
+ /* input modes */
714
+ rb_define_attr(cTermios, "iflag", 1, 0);
715
+ /* output modes */
716
+ rb_define_attr(cTermios, "oflag", 1, 0);
717
+ /* control modes */
718
+ rb_define_attr(cTermios, "cflag", 1, 0);
719
+ /* local modes */
720
+ rb_define_attr(cTermios, "lflag", 1, 0);
721
+ /* control characters */
722
+ rb_define_attr(cTermios, "cc", 1, 0);
723
+ /* input baud rate */
724
+ rb_define_attr(cTermios, "ispeed", 1, 0);
725
+ /* output baud rate */
726
+ rb_define_attr(cTermios, "ospeed", 1, 0);
727
+
728
+ rb_define_private_method(cTermios, "initialize", termios_initialize, -1);
729
+ rb_define_method(cTermios, "dup", termios_dup, 0);
730
+ rb_define_method(cTermios, "clone", termios_dup, 0);
731
+
732
+ rb_define_method(cTermios, "iflag=", termios_set_iflag, 1);
733
+ rb_define_method(cTermios, "oflag=", termios_set_oflag, 1);
734
+ rb_define_method(cTermios, "cflag=", termios_set_cflag, 1);
735
+ rb_define_method(cTermios, "lflag=", termios_set_lflag, 1);
736
+ rb_define_method(cTermios, "cc=", termios_set_cc, 1);
737
+ rb_define_method(cTermios, "ispeed=", termios_set_ispeed, 1);
738
+ rb_define_method(cTermios, "ospeed=", termios_set_ospeed, 1);
739
+
740
+ rb_define_alias(cTermios, "c_iflag", "iflag");
741
+ rb_define_alias(cTermios, "c_iflag=", "iflag=");
742
+ rb_define_alias(cTermios, "c_oflag", "oflag");
743
+ rb_define_alias(cTermios, "c_oflag=", "oflag=");
744
+ rb_define_alias(cTermios, "c_cflag", "cflag");
745
+ rb_define_alias(cTermios, "c_cflag=", "cflag=");
746
+ rb_define_alias(cTermios, "c_lflag", "lflag");
747
+ rb_define_alias(cTermios, "c_lflag=", "lflag=");
748
+ rb_define_alias(cTermios, "c_cc", "cc");
749
+ rb_define_alias(cTermios, "c_cc=", "cc=");
750
+ rb_define_alias(cTermios, "c_ispeed", "ispeed");
751
+ rb_define_alias(cTermios, "c_ispeed=", "ispeed=");
752
+ rb_define_alias(cTermios, "c_ospeed", "ospeed");
753
+ rb_define_alias(cTermios, "c_ospeed=", "ospeed=");
754
+
755
+ /* constants under Termios module */
756
+
757
+ /* number of control characters */
758
+ rb_define_const(mTermios, "NCCS", INT2FIX(NCCS));
759
+ rb_define_const(mTermios, "POSIX_VDISABLE", INT2FIX(_POSIX_VDISABLE));
760
+
761
+ ccindex = rb_hash_new();
762
+ ccindex_names = rb_ary_new();
763
+ /* Hash of control character index and control character names */
764
+ rb_define_const(mTermios, "CCINDEX", ccindex);
765
+ /* List of control character names */
766
+ rb_define_const(mTermios, "CCINDEX_NAMES", ccindex_names);
767
+
768
+ iflags = rb_hash_new();
769
+ iflags_names = rb_ary_new();
770
+ /* Hash of input mode names and values */
771
+ rb_define_const(mTermios, "IFLAGS", iflags);
772
+ /* List of input mode names */
773
+ rb_define_const(mTermios, "IFLAG_NAMES", iflags_names);
774
+
775
+ oflags = rb_hash_new();
776
+ oflags_names = rb_ary_new();
777
+ oflags_choices = rb_hash_new();
778
+ /* Hash of output mode names and values */
779
+ rb_define_const(mTermios, "OFLAGS", oflags);
780
+ /* List of output mode names */
781
+ rb_define_const(mTermios, "OFLAG_NAMES", oflags_names);
782
+ rb_define_const(mTermios, "OFLAG_CHOICES", oflags_choices);
783
+
784
+ cflags = rb_hash_new();
785
+ cflags_names = rb_ary_new();
786
+ cflags_choices = rb_hash_new();
787
+ /* Hash of control mode names and values */
788
+ rb_define_const(mTermios, "CFLAGS", cflags);
789
+ /* List of control mode names */
790
+ rb_define_const(mTermios, "CFLAG_NAMES", cflags_names);
791
+ rb_define_const(mTermios, "CFLAG_CHOICES", cflags_choices);
792
+
793
+ lflags = rb_hash_new();
794
+ lflags_names = rb_ary_new();
795
+ /* Hash of local mode names and values */
796
+ rb_define_const(mTermios, "LFLAGS", lflags);
797
+ /* List of local mode names */
798
+ rb_define_const(mTermios, "LFLAG_NAMES", lflags_names);
799
+
800
+ bauds = rb_hash_new();
801
+ bauds_names = rb_ary_new();
802
+ /* List of baud rates */
803
+ rb_define_const(mTermios, "BAUDS", bauds);
804
+ /* List of baud rate names */
805
+ rb_define_const(mTermios, "BAUD_NAMES", bauds_names);
806
+
807
+ tcsetattr_opt = rb_ary_new();
808
+ /* List of tcsetattr options */
809
+ rb_define_const(mTermios, "SETATTR_OPTS", tcsetattr_opt);
810
+
811
+ tcflush_qs = rb_ary_new();
812
+ /* List of tcflush qselectors */
813
+ rb_define_const(mTermios, "FLUSH_QSELECTORS", tcflush_qs);
814
+
815
+ tcflow_act = rb_ary_new();
816
+ /* List of tcflow actions */
817
+ rb_define_const(mTermios, "FLOW_ACTIONS", tcflow_act);
818
+
819
+ ioctl_commands = rb_hash_new();
820
+ ioctl_commands_names = rb_ary_new();
821
+ rb_define_const(mTermios, "IOCTL_COMMANDS", ioctl_commands);
822
+ rb_define_const(mTermios, "IOCTL_COMMAND_NAMES", ioctl_commands_names);
823
+
824
+ modem_signals = rb_hash_new();
825
+ modem_signals_names = rb_ary_new();
826
+ rb_define_const(mTermios, "MODEM_SIGNALS", modem_signals);
827
+ rb_define_const(mTermios, "MODEM_SIGNAL_NAMES", modem_signals_names);
828
+
829
+ pty_pkt_options = rb_hash_new();
830
+ pty_pkt_options_names = rb_ary_new();
831
+ rb_define_const(mTermios, "PTY_PACKET_OPTIONS", pty_pkt_options);
832
+ rb_define_const(mTermios, "PTY_PACKET_OPTION_NAMES", pty_pkt_options_names);
833
+
834
+ line_disciplines = rb_hash_new();
835
+ line_disciplines_names = rb_ary_new();
836
+ rb_define_const(mTermios, "LINE_DISCIPLINES", line_disciplines);
837
+ rb_define_const(mTermios, "LINE_DISCIPLINE_NAMES", line_disciplines);
838
+
839
+ #define define_flag(hash, flag) \
840
+ { \
841
+ rb_define_const(mTermios, #flag, ULONG2NUM(flag)); \
842
+ rb_hash_aset(hash, rb_const_get(mTermios, rb_intern(#flag)), \
843
+ ID2SYM(rb_intern(#flag))); \
844
+ rb_ary_push(hash##_names, ID2SYM(rb_intern(#flag)));\
845
+ }
846
+ #define define_flag2(ary, flag) \
847
+ { \
848
+ rb_define_const(mTermios, #flag, INT2FIX(flag)); \
849
+ rb_ary_push(ary, rb_const_get(mTermios, rb_intern(#flag)));\
850
+ }
851
+ #define define_choice(hash, mask, value) \
852
+ { \
853
+ VALUE a; \
854
+ rb_define_const(mTermios, #value, ULONG2NUM(value)); \
855
+ rb_hash_aset(hash, rb_const_get(mTermios, rb_intern(#value)), \
856
+ ID2SYM(rb_intern(#value))); \
857
+ rb_ary_push(hash##_names, ID2SYM(rb_intern(#value)));\
858
+ a = rb_hash_aref(hash##_choices, ID2SYM(rb_intern(#mask))); \
859
+ if (a == Qnil) { \
860
+ a = rb_ary_new(); \
861
+ rb_hash_aset(hash##_choices, ID2SYM(rb_intern(#mask)), a); \
862
+ } \
863
+ rb_ary_push(a, ID2SYM(rb_intern(#value))); \
864
+ }
865
+
866
+ /* c_cc characters */
867
+ #ifdef VINTR
868
+ define_flag(ccindex, VINTR);
869
+ #endif
870
+ #ifdef VQUIT
871
+ define_flag(ccindex, VQUIT);
872
+ #endif
873
+ #ifdef VERASE
874
+ define_flag(ccindex, VERASE);
875
+ #endif
876
+ #ifdef VKILL
877
+ define_flag(ccindex, VKILL);
878
+ #endif
879
+ #ifdef VEOF
880
+ define_flag(ccindex, VEOF);
881
+ #endif
882
+ #ifdef VEOL
883
+ define_flag(ccindex, VEOL);
884
+ #endif
885
+ #ifdef VEOL2
886
+ define_flag(ccindex, VEOL2);
887
+ #endif
888
+ #ifdef VSWTC
889
+ define_flag(ccindex, VSWTC);
890
+ #endif
891
+ #ifdef VSTART
892
+ define_flag(ccindex, VSTART);
893
+ #endif
894
+ #ifdef VSTOP
895
+ define_flag(ccindex, VSTOP);
896
+ #endif
897
+ #ifdef VSUSP
898
+ define_flag(ccindex, VSUSP);
899
+ #endif
900
+ #ifdef VDSUSP
901
+ define_flag(ccindex, VDSUSP);
902
+ #endif
903
+ #ifdef VREPRINT
904
+ define_flag(ccindex, VREPRINT);
905
+ #endif
906
+ #ifdef VDISCARD
907
+ define_flag(ccindex, VDISCARD);
908
+ #endif
909
+ #ifdef VWERASE
910
+ define_flag(ccindex, VWERASE);
911
+ #endif
912
+ #ifdef VLNEXT
913
+ define_flag(ccindex, VLNEXT);
914
+ #endif
915
+ #ifdef VSTATUS
916
+ define_flag(ccindex, VSTATUS);
917
+ #endif
918
+ #ifdef VTIME
919
+ define_flag(ccindex, VTIME);
920
+ #endif
921
+ #ifdef VMIN
922
+ define_flag(ccindex, VMIN);
923
+ #endif
924
+
925
+ /* c_iflag bits */
926
+ #ifdef IGNBRK
927
+ define_flag(iflags, IGNBRK);
928
+ #endif
929
+ #ifdef BRKINT
930
+ define_flag(iflags, BRKINT);
931
+ #endif
932
+ #ifdef IGNPAR
933
+ define_flag(iflags, IGNPAR);
934
+ #endif
935
+ #ifdef PARMRK
936
+ define_flag(iflags, PARMRK);
937
+ #endif
938
+ #ifdef INPCK
939
+ define_flag(iflags, INPCK);
940
+ #endif
941
+ #ifdef ISTRIP
942
+ define_flag(iflags, ISTRIP);
943
+ #endif
944
+ #ifdef INLCR
945
+ define_flag(iflags, INLCR);
946
+ #endif
947
+ #ifdef IGNCR
948
+ define_flag(iflags, IGNCR);
949
+ #endif
950
+ #ifdef ICRNL
951
+ define_flag(iflags, ICRNL);
952
+ #endif
953
+ #ifdef IXON
954
+ define_flag(iflags, IXON);
955
+ #endif
956
+ #ifdef IXOFF
957
+ define_flag(iflags, IXOFF);
958
+ #endif
959
+ #ifdef IUCLC
960
+ define_flag(iflags, IUCLC);
961
+ #endif
962
+ #ifdef IXANY
963
+ define_flag(iflags, IXANY);
964
+ #endif
965
+ #ifdef IMAXBEL
966
+ define_flag(iflags, IMAXBEL);
967
+ #endif
968
+ #ifdef IUTF8
969
+ define_flag(iflags, IUTF8);
970
+ #endif
971
+
972
+ /* c_oflag bits */
973
+ #ifdef OPOST
974
+ define_flag(oflags, OPOST);
975
+ #endif
976
+ #ifdef OLCUC
977
+ define_flag(oflags, OLCUC);
978
+ #endif
979
+ #ifdef OCRNL
980
+ define_flag(oflags, OCRNL);
981
+ #endif
982
+ #ifdef ONLCR
983
+ define_flag(oflags, ONLCR);
984
+ #endif
985
+ #ifdef ONOCR
986
+ define_flag(oflags, ONOCR);
987
+ #endif
988
+ #ifdef ONLRET
989
+ define_flag(oflags, ONLRET);
990
+ #endif
991
+ #ifdef OFILL
992
+ define_flag(oflags, OFILL);
993
+ #endif
994
+ #ifdef OFDEL
995
+ define_flag(oflags, OFDEL);
996
+ #endif
997
+ #ifdef ONOEOT
998
+ define_flag(oflags, ONOEOT);
999
+ #endif
1000
+ #ifdef OXTABS
1001
+ define_flag(oflags, OXTABS);
1002
+ #endif
1003
+ #ifdef NLDLY
1004
+ define_flag(oflags, NLDLY);
1005
+ #endif
1006
+ #ifdef NL0
1007
+ define_choice(oflags, NLDLY, NL0);
1008
+ #endif
1009
+ #ifdef NL1
1010
+ define_choice(oflags, NLDLY, NL1);
1011
+ #endif
1012
+ #ifdef CRDLY
1013
+ define_flag(oflags, CRDLY);
1014
+ #endif
1015
+ #ifdef CR0
1016
+ define_choice(oflags, CRDLY, CR0);
1017
+ #endif
1018
+ #ifdef CR1
1019
+ define_choice(oflags, CRDLY, CR1);
1020
+ #endif
1021
+ #ifdef CR2
1022
+ define_choice(oflags, CRDLY, CR2);
1023
+ #endif
1024
+ #ifdef CR3
1025
+ define_choice(oflags, CRDLY, CR3);
1026
+ #endif
1027
+ #ifdef TABDLY
1028
+ define_flag(oflags, TABDLY);
1029
+ #endif
1030
+ #ifdef TAB0
1031
+ define_choice(oflags, TABDLY, TAB0);
1032
+ #endif
1033
+ #ifdef TAB1
1034
+ define_choice(oflags, TABDLY, TAB1);
1035
+ #endif
1036
+ #ifdef TAB2
1037
+ define_choice(oflags, TABDLY, TAB2);
1038
+ #endif
1039
+ #ifdef TAB3
1040
+ define_choice(oflags, TABDLY, TAB3);
1041
+ #endif
1042
+ #ifdef XTABS
1043
+ define_choice(oflags, TABDLY, XTABS);
1044
+ #endif
1045
+ #ifdef BSDLY
1046
+ define_flag(oflags, BSDLY);
1047
+ #endif
1048
+ #ifdef BS0
1049
+ define_choice(oflags, BSDLY, BS0);
1050
+ #endif
1051
+ #ifdef BS1
1052
+ define_choice(oflags, BSDLY, BS1);
1053
+ #endif
1054
+ #ifdef VTDLY
1055
+ define_flag(oflags, VTDLY);
1056
+ #endif
1057
+ #ifdef VT0
1058
+ define_choice(oflags, VTDLY, VT0);
1059
+ #endif
1060
+ #ifdef VT1
1061
+ define_choice(oflags, VTDLY, VT1);
1062
+ #endif
1063
+ #ifdef FFDLY
1064
+ define_flag(oflags, FFDLY);
1065
+ #endif
1066
+ #ifdef FF0
1067
+ define_choice(oflags, FFDLY, FF0);
1068
+ #endif
1069
+ #ifdef FF1
1070
+ define_choice(oflags, FFDLY, FF1);
1071
+ #endif
1072
+
1073
+ /* c_cflag bit meaning */
1074
+ #ifdef CBAUD
1075
+ define_flag(cflags, CBAUD);
1076
+ #endif
1077
+ #ifdef B0
1078
+ define_flag(bauds, B0);
1079
+ #endif
1080
+ #ifdef B50
1081
+ define_flag(bauds, B50);
1082
+ #endif
1083
+ #ifdef B75
1084
+ define_flag(bauds, B75);
1085
+ #endif
1086
+ #ifdef B110
1087
+ define_flag(bauds, B110);
1088
+ #endif
1089
+ #ifdef B134
1090
+ define_flag(bauds, B134);
1091
+ #endif
1092
+ #ifdef B150
1093
+ define_flag(bauds, B150);
1094
+ #endif
1095
+ #ifdef B200
1096
+ define_flag(bauds, B200);
1097
+ #endif
1098
+ #ifdef B300
1099
+ define_flag(bauds, B300);
1100
+ #endif
1101
+ #ifdef B600
1102
+ define_flag(bauds, B600);
1103
+ #endif
1104
+ #ifdef B1200
1105
+ define_flag(bauds, B1200);
1106
+ #endif
1107
+ #ifdef B1800
1108
+ define_flag(bauds, B1800);
1109
+ #endif
1110
+ #ifdef B2400
1111
+ define_flag(bauds, B2400);
1112
+ #endif
1113
+ #ifdef B4800
1114
+ define_flag(bauds, B4800);
1115
+ #endif
1116
+ #ifdef B9600
1117
+ define_flag(bauds, B9600);
1118
+ #endif
1119
+ #ifdef B19200
1120
+ define_flag(bauds, B19200);
1121
+ #endif
1122
+ #ifdef B38400
1123
+ define_flag(bauds, B38400);
1124
+ #endif
1125
+ #ifdef EXTA
1126
+ define_flag(cflags, EXTA);
1127
+ #endif
1128
+ #ifdef EXTB
1129
+ define_flag(cflags, EXTB);
1130
+ #endif
1131
+ #ifdef PARENB
1132
+ define_flag(cflags, PARENB);
1133
+ #endif
1134
+ #ifdef PARODD
1135
+ define_flag(cflags, PARODD);
1136
+ #endif
1137
+ #ifdef CSIZE
1138
+ define_flag(cflags, CSIZE);
1139
+ #endif
1140
+ #ifdef CS5
1141
+ define_choice(cflags, CSIZE, CS5);
1142
+ #endif
1143
+ #ifdef CS6
1144
+ define_choice(cflags, CSIZE, CS6);
1145
+ #endif
1146
+ #ifdef CS7
1147
+ define_choice(cflags, CSIZE, CS7);
1148
+ #endif
1149
+ #ifdef CS8
1150
+ define_choice(cflags, CSIZE, CS8);
1151
+ #endif
1152
+ #ifdef HUPCL
1153
+ define_flag(cflags, HUPCL);
1154
+ #endif
1155
+ #ifdef CSTOPB
1156
+ define_flag(cflags, CSTOPB);
1157
+ #endif
1158
+ #ifdef CREAD
1159
+ define_flag(cflags, CREAD);
1160
+ #endif
1161
+ #ifdef CLOCAL
1162
+ define_flag(cflags, CLOCAL);
1163
+ #endif
1164
+ #ifdef CBAUDEX
1165
+ define_flag(cflags, CBAUDEX);
1166
+ #endif
1167
+ #ifdef B57600
1168
+ define_flag(bauds, B57600);
1169
+ #endif
1170
+ #ifdef B115200
1171
+ define_flag(bauds, B115200);
1172
+ #endif
1173
+ #ifdef B230400
1174
+ define_flag(bauds, B230400);
1175
+ #endif
1176
+ #ifdef B460800
1177
+ define_flag(bauds, B460800);
1178
+ #endif
1179
+ #ifdef B500000
1180
+ define_flag(bauds, B500000);
1181
+ #endif
1182
+ #ifdef B576000
1183
+ define_flag(bauds, B576000);
1184
+ #endif
1185
+ #ifdef B921600
1186
+ define_flag(bauds, B921600);
1187
+ #endif
1188
+ #ifdef B1000000
1189
+ define_flag(bauds, B1000000);
1190
+ #endif
1191
+ #ifdef B1152000
1192
+ define_flag(bauds, B1152000);
1193
+ #endif
1194
+ #ifdef B1500000
1195
+ define_flag(bauds, B1500000);
1196
+ #endif
1197
+ #ifdef B2000000
1198
+ define_flag(bauds, B2000000);
1199
+ #endif
1200
+ #ifdef B2500000
1201
+ define_flag(bauds, B2500000);
1202
+ #endif
1203
+ #ifdef B3000000
1204
+ define_flag(bauds, B3000000);
1205
+ #endif
1206
+ #ifdef B3500000
1207
+ define_flag(bauds, B3500000);
1208
+ #endif
1209
+ #ifdef B4000000
1210
+ define_flag(bauds, B4000000);
1211
+ #endif
1212
+ #ifdef CIBAUD
1213
+ define_flag(cflags, CIBAUD);
1214
+ #endif
1215
+ #ifdef CRTSCTS
1216
+ define_flag(cflags, CRTSCTS);
1217
+ #endif
1218
+ #ifdef MDMBUF
1219
+ define_flag(cflags, MDMBUF);
1220
+ #endif
1221
+
1222
+ /* c_lflag bits */
1223
+ #ifdef ISIG
1224
+ define_flag(lflags, ISIG);
1225
+ #endif
1226
+ #ifdef ICANON
1227
+ define_flag(lflags, ICANON);
1228
+ #endif
1229
+ #ifdef IEXTEN
1230
+ define_flag(lflags, IEXTEN);
1231
+ #endif
1232
+ #ifdef ECHO
1233
+ define_flag(lflags, ECHO);
1234
+ #endif
1235
+ #ifdef ECHOE
1236
+ define_flag(lflags, ECHOE);
1237
+ #endif
1238
+ #ifdef ECHOK
1239
+ define_flag(lflags, ECHOK);
1240
+ #endif
1241
+ #ifdef ECHONL
1242
+ define_flag(lflags, ECHONL);
1243
+ #endif
1244
+ #ifdef NOFLSH
1245
+ define_flag(lflags, NOFLSH);
1246
+ #endif
1247
+ #ifdef XCASE
1248
+ define_flag(lflags, XCASE);
1249
+ #endif
1250
+ #ifdef TOSTOP
1251
+ define_flag(lflags, TOSTOP);
1252
+ #endif
1253
+ #ifdef ECHOPRT
1254
+ define_flag(lflags, ECHOPRT);
1255
+ #endif
1256
+ #ifdef ECHOCTL
1257
+ define_flag(lflags, ECHOCTL);
1258
+ #endif
1259
+ #ifdef ECHOKE
1260
+ define_flag(lflags, ECHOKE);
1261
+ #endif
1262
+ #ifdef FLUSHO
1263
+ define_flag(lflags, FLUSHO);
1264
+ #endif
1265
+ #ifdef PENDIN
1266
+ define_flag(lflags, PENDIN);
1267
+ #endif
1268
+ #ifdef ALTWERASE
1269
+ define_flag(lflags, ALTWERASE);
1270
+ #endif
1271
+ #ifdef EXTPROC
1272
+ define_flag(lflags, EXTPROC);
1273
+ #endif
1274
+ #ifdef NOKERNINFO
1275
+ define_flag(lflags, NOKERNINFO);
1276
+ #endif
1277
+
1278
+ /* tcflow() and TCXONC use these */
1279
+ #ifdef TCOOFF
1280
+ define_flag2(tcflow_act, TCOOFF);
1281
+ #endif
1282
+ #ifdef TCOON
1283
+ define_flag2(tcflow_act, TCOON);
1284
+ #endif
1285
+ #ifdef TCIOFF
1286
+ define_flag2(tcflow_act, TCIOFF);
1287
+ #endif
1288
+ #ifdef TCION
1289
+ define_flag2(tcflow_act, TCION);
1290
+ #endif
1291
+
1292
+ /* tcflush() and TCFLSH use these */
1293
+ #ifdef TCIFLUSH
1294
+ define_flag2(tcflush_qs, TCIFLUSH);
1295
+ #endif
1296
+ #ifdef TCOFLUSH
1297
+ define_flag2(tcflush_qs, TCOFLUSH);
1298
+ #endif
1299
+ #ifdef TCIOFLUSH
1300
+ define_flag2(tcflush_qs, TCIOFLUSH);
1301
+ #endif
1302
+
1303
+ /* tcsetattr uses these */
1304
+ #ifdef TCSANOW
1305
+ define_flag2(tcsetattr_opt, TCSANOW);
1306
+ #endif
1307
+ #ifdef TCSADRAIN
1308
+ define_flag2(tcsetattr_opt, TCSADRAIN);
1309
+ #endif
1310
+ #ifdef TCSAFLUSH
1311
+ define_flag2(tcsetattr_opt, TCSAFLUSH);
1312
+ #endif
1313
+ #ifdef TCSASOFT
1314
+ define_flag2(tcsetattr_opt, TCSASOFT);
1315
+ #endif
1316
+
1317
+ /* Constants useful to ioctl for controlling lines */
1318
+ #ifdef TIOCMODG
1319
+ define_flag(ioctl_commands, TIOCMODG)
1320
+ #endif
1321
+ #ifdef TIOCMODS
1322
+ define_flag(ioctl_commands, TIOCMODS)
1323
+ #endif
1324
+ #ifdef TIOCM_LE
1325
+ define_flag(modem_signals, TIOCM_LE)
1326
+ #endif
1327
+ #ifdef TIOCM_DTR
1328
+ define_flag(modem_signals, TIOCM_DTR)
1329
+ #endif
1330
+ #ifdef TIOCM_RTS
1331
+ define_flag(modem_signals, TIOCM_RTS)
1332
+ #endif
1333
+ #ifdef TIOCM_ST
1334
+ define_flag(modem_signals, TIOCM_ST)
1335
+ #endif
1336
+ #ifdef TIOCM_SR
1337
+ define_flag(modem_signals, TIOCM_SR)
1338
+ #endif
1339
+ #ifdef TIOCM_CTS
1340
+ define_flag(modem_signals, TIOCM_CTS)
1341
+ #endif
1342
+ #ifdef TIOCM_CAR
1343
+ define_flag(modem_signals, TIOCM_CAR)
1344
+ #endif
1345
+ #ifdef TIOCM_CD
1346
+ define_flag(modem_signals, TIOCM_CD)
1347
+ #endif
1348
+ #ifdef TIOCM_RNG
1349
+ define_flag(modem_signals, TIOCM_RNG)
1350
+ #endif
1351
+ #ifdef TIOCM_RI
1352
+ define_flag(modem_signals, TIOCM_RI)
1353
+ #endif
1354
+ #ifdef TIOCM_DSR
1355
+ define_flag(modem_signals, TIOCM_DSR)
1356
+ #endif
1357
+ #ifdef TIOCEXCL
1358
+ define_flag(ioctl_commands, TIOCEXCL)
1359
+ #endif
1360
+ #ifdef TIOCNXCL
1361
+ define_flag(ioctl_commands, TIOCNXCL)
1362
+ #endif
1363
+ #ifdef TIOCFLUSH
1364
+ define_flag(ioctl_commands, TIOCFLUSH)
1365
+ #endif
1366
+ #ifdef TIOCGETA
1367
+ define_flag(ioctl_commands, TIOCGETA)
1368
+ #endif
1369
+ #ifdef TIOCSETA
1370
+ define_flag(ioctl_commands, TIOCSETA)
1371
+ #endif
1372
+ #ifdef TIOCSETAW
1373
+ define_flag(ioctl_commands, TIOCSETAW)
1374
+ #endif
1375
+ #ifdef TIOCSETAF
1376
+ define_flag(ioctl_commands, TIOCSETAF)
1377
+ #endif
1378
+ #ifdef TIOCGETD
1379
+ define_flag(ioctl_commands, TIOCGETD)
1380
+ #endif
1381
+ #ifdef TIOCSETD
1382
+ define_flag(ioctl_commands, TIOCSETD)
1383
+ #endif
1384
+ #ifdef TIOCIXON
1385
+ define_flag(ioctl_commands, TIOCIXON)
1386
+ #endif
1387
+ #ifdef TIOCIXOFF
1388
+ define_flag(ioctl_commands, TIOCIXOFF)
1389
+ #endif
1390
+ #ifdef TIOCSBRK
1391
+ define_flag(ioctl_commands, TIOCSBRK)
1392
+ #endif
1393
+ #ifdef TIOCCBRK
1394
+ define_flag(ioctl_commands, TIOCCBRK)
1395
+ #endif
1396
+ #ifdef TIOCSDTR
1397
+ define_flag(ioctl_commands, TIOCSDTR)
1398
+ #endif
1399
+ #ifdef TIOCCDTR
1400
+ define_flag(ioctl_commands, TIOCCDTR)
1401
+ #endif
1402
+ #ifdef TIOCGPGRP
1403
+ define_flag(ioctl_commands, TIOCGPGRP)
1404
+ #endif
1405
+ #ifdef TIOCSPGRP
1406
+ define_flag(ioctl_commands, TIOCSPGRP)
1407
+ #endif
1408
+ #ifdef TIOCOUTQ
1409
+ define_flag(ioctl_commands, TIOCOUTQ)
1410
+ #endif
1411
+ #ifdef TIOCSTI
1412
+ define_flag(ioctl_commands, TIOCSTI)
1413
+ #endif
1414
+ #ifdef TIOCNOTTY
1415
+ define_flag(ioctl_commands, TIOCNOTTY)
1416
+ #endif
1417
+ #ifdef TIOCPKT
1418
+ define_flag(ioctl_commands, TIOCPKT)
1419
+ #endif
1420
+ #ifdef TIOCPKT_DATA
1421
+ define_flag(pty_pkt_options, TIOCPKT_DATA)
1422
+ #endif
1423
+ #ifdef TIOCPKT_FLUSHREAD
1424
+ define_flag(pty_pkt_options, TIOCPKT_FLUSHREAD)
1425
+ #endif
1426
+ #ifdef TIOCPKT_FLUSHWRITE
1427
+ define_flag(pty_pkt_options, TIOCPKT_FLUSHWRITE)
1428
+ #endif
1429
+ #ifdef TIOCPKT_STOP
1430
+ define_flag(pty_pkt_options, TIOCPKT_STOP)
1431
+ #endif
1432
+ #ifdef TIOCPKT_START
1433
+ define_flag(pty_pkt_options, TIOCPKT_START)
1434
+ #endif
1435
+ #ifdef TIOCPKT_NOSTOP
1436
+ define_flag(pty_pkt_options, TIOCPKT_NOSTOP)
1437
+ #endif
1438
+ #ifdef TIOCPKT_DOSTOP
1439
+ define_flag(pty_pkt_options, TIOCPKT_DOSTOP)
1440
+ #endif
1441
+ #ifdef TIOCPKT_IOCTL
1442
+ define_flag(pty_pkt_options, TIOCPKT_IOCTL)
1443
+ #endif
1444
+ #ifdef TIOCSTOP
1445
+ define_flag(ioctl_commands, TIOCSTOP)
1446
+ #endif
1447
+ #ifdef TIOCSTART
1448
+ define_flag(ioctl_commands, TIOCSTART)
1449
+ #endif
1450
+ #ifdef TIOCMSET
1451
+ define_flag(ioctl_commands, TIOCMSET)
1452
+ #endif
1453
+ #ifdef TIOCMBIS
1454
+ define_flag(ioctl_commands, TIOCMBIS)
1455
+ #endif
1456
+ #ifdef TIOCMBIC
1457
+ define_flag(ioctl_commands, TIOCMBIC)
1458
+ #endif
1459
+ #ifdef TIOCMGET
1460
+ define_flag(ioctl_commands, TIOCMGET)
1461
+ #endif
1462
+ #ifdef TIOCREMOTE
1463
+ define_flag(ioctl_commands, TIOCREMOTE)
1464
+ #endif
1465
+ #ifdef TIOCGWINSZ
1466
+ define_flag(ioctl_commands, TIOCGWINSZ)
1467
+ #endif
1468
+ #ifdef TIOCSWINSZ
1469
+ define_flag(ioctl_commands, TIOCSWINSZ)
1470
+ #endif
1471
+ #ifdef TIOCUCNTL
1472
+ define_flag(ioctl_commands, TIOCUCNTL)
1473
+ #endif
1474
+ #ifdef TIOCSTAT
1475
+ define_flag(ioctl_commands, TIOCSTAT)
1476
+ #endif
1477
+ #ifdef TIOCSCONS
1478
+ define_flag(ioctl_commands, TIOCSCONS)
1479
+ #endif
1480
+ #ifdef TIOCCONS
1481
+ define_flag(ioctl_commands, TIOCCONS)
1482
+ #endif
1483
+ #ifdef TIOCSCTTY
1484
+ define_flag(ioctl_commands, TIOCSCTTY)
1485
+ #endif
1486
+ #ifdef TIOCEXT
1487
+ define_flag(ioctl_commands, TIOCEXT)
1488
+ #endif
1489
+ #ifdef TIOCSIG
1490
+ define_flag(ioctl_commands, TIOCSIG)
1491
+ #endif
1492
+ #ifdef TIOCDRAIN
1493
+ define_flag(ioctl_commands, TIOCDRAIN)
1494
+ #endif
1495
+ #ifdef TIOCMSDTRWAIT
1496
+ define_flag(ioctl_commands, TIOCMSDTRWAIT)
1497
+ #endif
1498
+ #ifdef TIOCMGDTRWAIT
1499
+ define_flag(ioctl_commands, TIOCMGDTRWAIT)
1500
+ #endif
1501
+ #ifdef TIOCTIMESTAMP
1502
+ define_flag(ioctl_commands, TIOCTIMESTAMP)
1503
+ #endif
1504
+ #ifdef TIOCDCDTIMESTAMP
1505
+ define_flag(ioctl_commands, TIOCDCDTIMESTAMP)
1506
+ #endif
1507
+ #ifdef TIOCSDRAINWAIT
1508
+ define_flag(ioctl_commands, TIOCSDRAINWAIT)
1509
+ #endif
1510
+ #ifdef TIOCGDRAINWAIT
1511
+ define_flag(ioctl_commands, TIOCGDRAINWAIT)
1512
+ #endif
1513
+ #ifdef TIOCDSIMICROCODE
1514
+ define_flag(ioctl_commands, TIOCDSIMICROCODE)
1515
+ #endif
1516
+ #ifdef TIOCPTYGRANT
1517
+ define_flag(ioctl_commands, TIOCPTYGRANT)
1518
+ #endif
1519
+ #ifdef TIOCPTYGNAME
1520
+ define_flag(ioctl_commands, TIOCPTYGNAME)
1521
+ #endif
1522
+ #ifdef TIOCPTYUNLK
1523
+ define_flag(ioctl_commands, TIOCPTYUNLK)
1524
+ #endif
1525
+ #ifdef TTYDISC
1526
+ define_flag(line_disciplines, TTYDISC)
1527
+ #endif
1528
+ #ifdef TABLDISC
1529
+ define_flag(line_disciplines, TABLDISC)
1530
+ #endif
1531
+ #ifdef SLIPDISC
1532
+ define_flag(line_disciplines, SLIPDISC)
1533
+ #endif
1534
+ #ifdef PPPDISC
1535
+ define_flag(line_disciplines, PPPDISC)
1536
+ #endif
1537
+ }