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.
- data/ChangeLog +146 -0
- data/README +80 -0
- data/examples/modem_check0.rb +69 -0
- data/examples/modem_check1.rb +68 -0
- data/examples/modem_check2.rb +69 -0
- data/examples/secret_input1.rb +12 -0
- data/examples/secret_input2.rb +14 -0
- data/extconf.rb +20 -0
- data/lib/termios.rb +151 -0
- data/termios.c +1537 -0
- data/test/test0.rb +29 -0
- metadata +81 -0
data/ChangeLog
ADDED
@@ -0,0 +1,146 @@
|
|
1
|
+
2009-08-28 akira yamada <akira@arika.org>
|
2
|
+
|
3
|
+
* version 0.9.6.
|
4
|
+
|
5
|
+
2009-02-05 akira yamada <akira@arika.org>
|
6
|
+
|
7
|
+
* termios.c: added RDoc.
|
8
|
+
|
9
|
+
* README: converted to RDoc.
|
10
|
+
|
11
|
+
* ruby-termios.gemspec: added.
|
12
|
+
|
13
|
+
2008-10-23 akira yamada <akira@arika.org>
|
14
|
+
|
15
|
+
* termios.c: added IOCTL_COMMANDS, IOCTL_COMMAND_NAMES,
|
16
|
+
MODEM_SIGNALS, MODEM_SIGNAL_NAMES, PTY_PACKET_OPTIONS,
|
17
|
+
PTY_PACKET_OPTION_NAMES, LINE_DISCIPLINES and
|
18
|
+
LINE_DISCIPLINE_NAMES.
|
19
|
+
|
20
|
+
This change is contributed from Chris Hoffman
|
21
|
+
<chrishoffman_cardialife.com>.
|
22
|
+
|
23
|
+
* termios.c, extconf.rb: included <sys/ioctl.h>.
|
24
|
+
|
25
|
+
2008-06-03 akira yamada <akira@arika.org>
|
26
|
+
|
27
|
+
* extconf.rb, termios.c: adjusted rb_io_t/OpenFile checks for Ruby
|
28
|
+
1.8.7.
|
29
|
+
|
30
|
+
2007-05-30 akira yamada <akira@arika.org>
|
31
|
+
|
32
|
+
* extconf.rb: rb_io_t test isn't needed for Ruby 1.6.
|
33
|
+
|
34
|
+
* version 0.9.5.
|
35
|
+
|
36
|
+
2007-05-29 Tanaka Akira <akr@fsij.org>
|
37
|
+
|
38
|
+
* extconf.rb: check rb_io_t.
|
39
|
+
check fd member in OpenFile.
|
40
|
+
|
41
|
+
* termios.c: support Ruby 1.9.
|
42
|
+
use unsigned long for flags bigger than Fixnum such as CRTSCTS.
|
43
|
+
use rb_sys_fail instead of rb_raise(rb_eRuntimeError).
|
44
|
+
(Termios_to_termios): use rb_ary_entry to access cc_ary to avoid SEGV.
|
45
|
+
(termios_tcgetpgrp): use pid_t.
|
46
|
+
(termios_tcsetpgrp): ditto.
|
47
|
+
(Termios::Termios#dup): defined to duplicate cc.
|
48
|
+
(Termios::Termios#clone): ditto.
|
49
|
+
(Termios::POSIX_VDISABLE): defined.
|
50
|
+
(Termios::CCINDEX_NAMES): defined.
|
51
|
+
(Termios::IFLAG_NAMES): defined.
|
52
|
+
(Termios::OFLAG_NAMES): defined.
|
53
|
+
(Termios::OFLAG_CHOICES): defined.
|
54
|
+
(Termios::CFLAG_NAMES): defined.
|
55
|
+
(Termios::CFLAG_CHOICES): defined.
|
56
|
+
(Termios::LFLAG_NAMES): defined.
|
57
|
+
(Termios::BAUD_NAMES): defined.
|
58
|
+
(Termios::IUTF8): defined.
|
59
|
+
(Termios::VDSUSP): defined for 4.4BSD.
|
60
|
+
(Termios::VSTATUS): defined for 4.4BSD.
|
61
|
+
(Termios::MDMBUF): defined for 4.4BSD.
|
62
|
+
|
63
|
+
* lib/termios.rb: new file. inspect and pretty_print defined.
|
64
|
+
|
65
|
+
2005-05-30 akira yamada <akira@arika.org>
|
66
|
+
|
67
|
+
* termios.c: applied a patch which makes ruby-termios work under
|
68
|
+
both ruby1.8 and ruby1.9. [ruby-talk:143781]
|
69
|
+
Thanks to: Akr.
|
70
|
+
|
71
|
+
2002-10-13 akira yamada <akira@arika.org>
|
72
|
+
|
73
|
+
* termios.c
|
74
|
+
(termios_set_ispeed): fixed typo.
|
75
|
+
(termios_initialize): 0-cleared "@cc".
|
76
|
+
(Termios_to_termios): unknown cc-values are treated as 0.
|
77
|
+
|
78
|
+
* examples/modem_check.rb: renamed examples/modem_check1.rb.
|
79
|
+
|
80
|
+
* examples/modem_check0.rb, exampes/modem_check2.rb: new.
|
81
|
+
|
82
|
+
* version 0.9.4.
|
83
|
+
|
84
|
+
2002-10-12 akira yamada <akira@arika.org>
|
85
|
+
|
86
|
+
* termios.c: revoked Termios::Termios#set_cc and removed some methods
|
87
|
+
such as Termios::Termios#iflag etc. they became attr_reader.
|
88
|
+
|
89
|
+
* version 0.9.3.
|
90
|
+
|
91
|
+
2002-10-12 akira yamada <akira@arika.org>
|
92
|
+
|
93
|
+
* termios.c
|
94
|
+
(termios_cc): accepts index of c_cc.
|
95
|
+
(termios_set_a_cc): new function for Termios::Termios#set_cc.
|
96
|
+
(Init_termios): added new constants Termios::CCINDEX, Termios::IFLAGS,
|
97
|
+
Termios::OFLAGS, Termios::CFLAGS, Termios::LFLAGS and Termios::BAUD.
|
98
|
+
|
99
|
+
* examples/modem_check.rb: it did not work. rewrited.
|
100
|
+
|
101
|
+
* test/test0.rb: rewrited.
|
102
|
+
|
103
|
+
* version 0.9.2.
|
104
|
+
|
105
|
+
2002-10-10 akira yamada <akira@arika.org>
|
106
|
+
|
107
|
+
* termios.c
|
108
|
+
(Init_termios): revived Termios::Termios#c_foo/c_foo= for backward
|
109
|
+
compatibility.
|
110
|
+
|
111
|
+
2002-09-25 akira yamada <akira@arika.org>
|
112
|
+
|
113
|
+
* termios.c
|
114
|
+
(termios_clone): new method "clone" for Termios::Termios.
|
115
|
+
(Init_termios): revived Termios.new_termios for backward
|
116
|
+
compatibility.
|
117
|
+
|
118
|
+
* version 0.9.1.
|
119
|
+
|
120
|
+
2002-09-25 akira yamada <akira@arika.org>
|
121
|
+
|
122
|
+
* Termios module can be included to IO classes and can extend IO
|
123
|
+
objects.
|
124
|
+
|
125
|
+
* now Termios::Termios is rb_cObject class.
|
126
|
+
|
127
|
+
* version 0.9.0.
|
128
|
+
|
129
|
+
Wed Nov 15 19:03:06 2000 akira yamada <akira@arika.org>
|
130
|
+
|
131
|
+
* renamed to ruby-termios.
|
132
|
+
|
133
|
+
Wed Dec 1 21:27:23 1999 GOTO Kentaro <gotoken@math.sci.hokudai.ac.jp>
|
134
|
+
|
135
|
+
* termios.c: removed c_line.
|
136
|
+
* test1.rb: removed c_line.
|
137
|
+
* test3.rb: stty -echo.
|
138
|
+
|
139
|
+
Fri Feb 19 00:05:20 1999 akira yamada <akira@linux.or.jp>
|
140
|
+
|
141
|
+
* termios.c (Init_termios): now sTermios is hidden.
|
142
|
+
* test2.rb: rewrited.
|
143
|
+
|
144
|
+
Fri Thu 18 02:24:21 1999 akira yamada <akira@linux.or.jp>
|
145
|
+
|
146
|
+
* development started.
|
data/README
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
= termios (ruby-termios) - a simple wrapper of termios(3)
|
2
|
+
|
3
|
+
== Description
|
4
|
+
|
5
|
+
This extension library provides Termios module. It enables you to use
|
6
|
+
termios(3) interface.
|
7
|
+
|
8
|
+
Termios module is simple wrapper of termios(3). It can be included into
|
9
|
+
IO-family classes and can extend IO-family objects. In addition, the
|
10
|
+
methods can use as module function.
|
11
|
+
|
12
|
+
== Requires
|
13
|
+
|
14
|
+
This extension library can use with Ruby 1.6, 1.8 or 1.9. (Ruby-termios can
|
15
|
+
build with Ruby 1.6 but it has not yet been tested enough.)
|
16
|
+
|
17
|
+
== Installation
|
18
|
+
|
19
|
+
ruby extconf.rb
|
20
|
+
make
|
21
|
+
make install
|
22
|
+
|
23
|
+
== Copyright
|
24
|
+
|
25
|
+
Ruby-termios for Ruby is copyrighted free software by akira yamada
|
26
|
+
<akira@arika.org>. You can redistribute it and/or modify it under either
|
27
|
+
the terms of the GPL, or the conditions below:
|
28
|
+
|
29
|
+
1. You may make and give away verbatim copies of the source form of the
|
30
|
+
software without restriction, provided that you duplicate all of the
|
31
|
+
original copyright notices and associated disclaimers.
|
32
|
+
|
33
|
+
2. You may modify your copy of the software in any way, provided that
|
34
|
+
you do at least ONE of the following:
|
35
|
+
|
36
|
+
a) place your modifications in the Public Domain or otherwise
|
37
|
+
make them Freely Available, such as by posting said
|
38
|
+
modifications to Usenet or an equivalent medium, or by allowing
|
39
|
+
the author to include your modifications in the software.
|
40
|
+
|
41
|
+
b) use the modified software only within your corporation or
|
42
|
+
organization.
|
43
|
+
|
44
|
+
c) rename any non-standard executables so the names do not conflict
|
45
|
+
with standard executables, which must also be provided.
|
46
|
+
|
47
|
+
d) make other distribution arrangements with the author.
|
48
|
+
|
49
|
+
3. You may distribute the software in object code or executable
|
50
|
+
form, provided that you do at least ONE of the following:
|
51
|
+
|
52
|
+
a) distribute the executables and library files of the software,
|
53
|
+
together with instructions (in the manual page or equivalent)
|
54
|
+
on where to get the original distribution.
|
55
|
+
|
56
|
+
b) accompany the distribution with the machine-readable source of
|
57
|
+
the software.
|
58
|
+
|
59
|
+
c) give non-standard executables non-standard names, with
|
60
|
+
instructions on where to get the original software distribution.
|
61
|
+
|
62
|
+
d) make other distribution arrangements with the author.
|
63
|
+
|
64
|
+
4. You may modify and include the part of the software into any other
|
65
|
+
software (possibly commercial). But some files in the distribution
|
66
|
+
are not written by the author, so that they are not under this terms.
|
67
|
+
They are gc.c(partly), utils.c(partly), regex.[ch], fnmatch.[ch],
|
68
|
+
glob.c, st.[ch] and some files under the ./missing directory. See
|
69
|
+
each file for the copying condition.
|
70
|
+
|
71
|
+
5. The scripts and library files supplied as input to or produced as
|
72
|
+
output from the software do not automatically fall under the
|
73
|
+
copyright of the software, but belong to whomever generated them,
|
74
|
+
and may be sold commercially, and may be aggregated with this
|
75
|
+
software.
|
76
|
+
|
77
|
+
6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
|
78
|
+
IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
79
|
+
WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
|
80
|
+
PURPOSE.
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'fcntl'
|
2
|
+
require 'termios'
|
3
|
+
include Termios
|
4
|
+
|
5
|
+
DEVICE = '/dev/modem'
|
6
|
+
BAUDRATE = B115200
|
7
|
+
|
8
|
+
def dev_open(path)
|
9
|
+
dev = open(DEVICE, File::RDWR | File::NONBLOCK)
|
10
|
+
mode = dev.fcntl(Fcntl::F_GETFL, 0)
|
11
|
+
dev.fcntl(Fcntl::F_SETFL, mode & ~File::NONBLOCK)
|
12
|
+
dev
|
13
|
+
end
|
14
|
+
|
15
|
+
def dump_termios(tio, banner)
|
16
|
+
puts banner
|
17
|
+
puts " ispeed = #{BAUDS[tio.ispeed]}, ospeed = #{BAUDS[tio.ospeed]}"
|
18
|
+
["iflag", "oflag", "cflag", "lflag"].each do |x|
|
19
|
+
flag = tio.send(x)
|
20
|
+
flags = []
|
21
|
+
eval("#{x.upcase}S").each do |f, sym|
|
22
|
+
flags << sym.to_s if flag & f != 0
|
23
|
+
end
|
24
|
+
puts " #{x} = #{flags.sort.join(' | ')}"
|
25
|
+
end
|
26
|
+
print " cc ="
|
27
|
+
cc = tio.cc
|
28
|
+
cc.each_with_index do |x, idx|
|
29
|
+
print " #{CCINDEX[idx]}=#{x}" if CCINDEX.include?(idx)
|
30
|
+
end
|
31
|
+
puts
|
32
|
+
end
|
33
|
+
|
34
|
+
dev = dev_open(DEVICE)
|
35
|
+
|
36
|
+
oldtio = getattr(dev)
|
37
|
+
dump_termios(oldtio, "current tio:")
|
38
|
+
|
39
|
+
newtio = new_termios()
|
40
|
+
newtio.iflag = IGNPAR
|
41
|
+
newtio.oflag = 0
|
42
|
+
newtio.cflag = (CRTSCTS | CS8 | CREAD)
|
43
|
+
newtio.lflag = 0
|
44
|
+
newtio.cc[VTIME] = 0
|
45
|
+
newtio.cc[VMIN] = 1
|
46
|
+
newtio.ispeed = BAUDRATE
|
47
|
+
newtio.ospeed = BAUDRATE
|
48
|
+
dump_termios(newtio, "new tio:")
|
49
|
+
|
50
|
+
flush(dev, TCIOFLUSH)
|
51
|
+
setattr(dev, TCSANOW, newtio)
|
52
|
+
dump_termios(getattr(dev), "current tio:")
|
53
|
+
|
54
|
+
"AT\x0d".each_byte {|c|
|
55
|
+
c = c.chr
|
56
|
+
p [:write_char, c]
|
57
|
+
dev.putc c
|
58
|
+
d = dev.getc
|
59
|
+
p [:echo_back, d && d.chr || nil]
|
60
|
+
}
|
61
|
+
|
62
|
+
r = ''
|
63
|
+
while /OK\x0d\x0a/o !~ r
|
64
|
+
r << dev.getc.chr
|
65
|
+
p [:response, r]
|
66
|
+
end
|
67
|
+
|
68
|
+
setattr(dev, TCSANOW, oldtio)
|
69
|
+
dump_termios(getattr(dev), "current tio:")
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'fcntl'
|
2
|
+
require 'termios'
|
3
|
+
|
4
|
+
DEVICE = '/dev/modem'
|
5
|
+
BAUDRATE = Termios::B115200
|
6
|
+
|
7
|
+
def dev_open(path)
|
8
|
+
dev = open(DEVICE, File::RDWR | File::NONBLOCK)
|
9
|
+
mode = dev.fcntl(Fcntl::F_GETFL, 0)
|
10
|
+
dev.fcntl(Fcntl::F_SETFL, mode & ~File::NONBLOCK)
|
11
|
+
dev
|
12
|
+
end
|
13
|
+
|
14
|
+
def dump_termios(tio, banner)
|
15
|
+
puts banner
|
16
|
+
puts " ispeed = #{Termios::BAUDS[tio.ispeed]}, ospeed = #{Termios::BAUDS[tio.ospeed]}"
|
17
|
+
["iflag", "oflag", "cflag", "lflag"].each do |x|
|
18
|
+
flag = tio.send(x)
|
19
|
+
flags = []
|
20
|
+
eval("Termios::#{x.upcase}S").each do |f, sym|
|
21
|
+
flags << sym.to_s if flag & f != 0
|
22
|
+
end
|
23
|
+
puts " #{x} = #{flags.sort.join(' | ')}"
|
24
|
+
end
|
25
|
+
print " cc ="
|
26
|
+
cc = tio.cc
|
27
|
+
cc.each_with_index do |x, idx|
|
28
|
+
print " #{Termios::CCINDEX[idx]}=#{x}" if Termios::CCINDEX.include?(idx)
|
29
|
+
end
|
30
|
+
puts
|
31
|
+
end
|
32
|
+
|
33
|
+
dev = dev_open(DEVICE)
|
34
|
+
|
35
|
+
oldtio = Termios::tcgetattr(dev)
|
36
|
+
dump_termios(oldtio, "current tio:")
|
37
|
+
|
38
|
+
newtio = Termios::new_termios()
|
39
|
+
newtio.iflag = Termios::IGNPAR
|
40
|
+
newtio.oflag = 0
|
41
|
+
newtio.cflag = (Termios::CRTSCTS | Termios::CS8 | Termios::CREAD)
|
42
|
+
newtio.lflag = 0
|
43
|
+
newtio.cc[Termios::VTIME] = 0
|
44
|
+
newtio.cc[Termios::VMIN] = 1
|
45
|
+
newtio.ispeed = BAUDRATE
|
46
|
+
newtio.ospeed = BAUDRATE
|
47
|
+
dump_termios(newtio, "new tio:")
|
48
|
+
|
49
|
+
Termios::tcflush(dev, Termios::TCIOFLUSH)
|
50
|
+
Termios::tcsetattr(dev, Termios::TCSANOW, newtio)
|
51
|
+
dump_termios(Termios::tcgetattr(dev), "current tio:")
|
52
|
+
|
53
|
+
"AT\x0d".each_byte {|c|
|
54
|
+
c = c.chr
|
55
|
+
p [:write_char, c]
|
56
|
+
dev.putc c
|
57
|
+
d = dev.getc
|
58
|
+
p [:echo_back, d && d.chr || nil]
|
59
|
+
}
|
60
|
+
|
61
|
+
r = ''
|
62
|
+
while /OK\x0d\x0a/o !~ r
|
63
|
+
r << dev.getc.chr
|
64
|
+
p [:response, r]
|
65
|
+
end
|
66
|
+
|
67
|
+
Termios::tcsetattr(dev, Termios::TCSANOW, oldtio)
|
68
|
+
dump_termios(Termios::tcgetattr(dev), "current tio:")
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'fcntl'
|
2
|
+
require 'termios'
|
3
|
+
|
4
|
+
DEVICE = '/dev/modem'
|
5
|
+
BAUDRATE = Termios::B115200
|
6
|
+
|
7
|
+
def dev_open(path)
|
8
|
+
dev = open(DEVICE, File::RDWR | File::NONBLOCK)
|
9
|
+
mode = dev.fcntl(Fcntl::F_GETFL, 0)
|
10
|
+
dev.fcntl(Fcntl::F_SETFL, mode & ~File::NONBLOCK)
|
11
|
+
dev
|
12
|
+
end
|
13
|
+
|
14
|
+
def dump_termios(tio, banner)
|
15
|
+
puts banner
|
16
|
+
puts " ispeed = #{Termios::BAUDS[tio.ispeed]}, ospeed = #{Termios::BAUDS[tio.ospeed]}"
|
17
|
+
["iflag", "oflag", "cflag", "lflag"].each do |x|
|
18
|
+
flag = tio.send(x)
|
19
|
+
flags = []
|
20
|
+
eval("Termios::#{x.upcase}S").each do |f, sym|
|
21
|
+
flags << sym.to_s if flag & f != 0
|
22
|
+
end
|
23
|
+
puts " #{x} = #{flags.sort.join(' | ')}"
|
24
|
+
end
|
25
|
+
print " cc ="
|
26
|
+
cc = tio.cc
|
27
|
+
cc.each_with_index do |x, idx|
|
28
|
+
print " #{Termios::CCINDEX[idx]}=#{x}" if Termios::CCINDEX.include?(idx)
|
29
|
+
end
|
30
|
+
puts
|
31
|
+
end
|
32
|
+
|
33
|
+
dev = dev_open(DEVICE)
|
34
|
+
dev.extend Termios
|
35
|
+
|
36
|
+
oldtio = dev.tcgetattr
|
37
|
+
dump_termios(oldtio, "current tio:")
|
38
|
+
|
39
|
+
newtio = Termios::new_termios()
|
40
|
+
newtio.iflag = Termios::IGNPAR
|
41
|
+
newtio.oflag = 0
|
42
|
+
newtio.cflag = (Termios::CRTSCTS | Termios::CS8 | Termios::CREAD)
|
43
|
+
newtio.lflag = 0
|
44
|
+
newtio.cc[Termios::VTIME] = 0
|
45
|
+
newtio.cc[Termios::VMIN] = 1
|
46
|
+
newtio.ispeed = BAUDRATE
|
47
|
+
newtio.ospeed = BAUDRATE
|
48
|
+
dump_termios(newtio, "new tio:")
|
49
|
+
|
50
|
+
dev.tcflush(Termios::TCIOFLUSH)
|
51
|
+
dev.tcsetattr(Termios::TCSANOW, newtio)
|
52
|
+
dump_termios(dev.tcgetattr, "current tio:")
|
53
|
+
|
54
|
+
"AT\x0d".each_byte {|c|
|
55
|
+
c = c.chr
|
56
|
+
p [:write_char, c]
|
57
|
+
dev.putc c
|
58
|
+
d = dev.getc
|
59
|
+
p [:echo_back, d && d.chr || nil]
|
60
|
+
}
|
61
|
+
|
62
|
+
r = ''
|
63
|
+
while /OK\x0d\x0a/o !~ r
|
64
|
+
r << dev.getc.chr
|
65
|
+
p [:response, r]
|
66
|
+
end
|
67
|
+
|
68
|
+
dev.tcsetattr(Termios::TCSANOW, oldtio)
|
69
|
+
dump_termios(dev.tcgetattr, "current tio:")
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# to input secretly [ruby-list:15968]
|
2
|
+
require 'termios'
|
3
|
+
|
4
|
+
oldt = Termios.tcgetattr($stdin)
|
5
|
+
newt = oldt.dup
|
6
|
+
newt.lflag &= ~Termios::ECHO
|
7
|
+
Termios.tcsetattr($stdin, Termios::TCSANOW, newt)
|
8
|
+
print "noecho> "
|
9
|
+
a = $stdin.gets
|
10
|
+
Termios.tcsetattr($stdin, Termios::TCSANOW, oldt)
|
11
|
+
print "\n"
|
12
|
+
p a
|