rumai 3.2.0 → 3.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CREDITS +4 -3
- data/HISTORY +327 -0
- data/INSTALL +31 -0
- data/README +92 -0
- data/USAGE +297 -0
- data/bin/rumai +9 -22
- data/doc/api/IO.html +119 -0
- data/doc/api/Integer.html +171 -0
- data/doc/api/Rumai.html +1270 -0
- data/doc/api/Rumai/Area.html +1485 -0
- data/doc/api/Rumai/Chain.html +301 -0
- data/doc/api/Rumai/Client.html +2451 -0
- data/doc/api/Rumai/ClientContainer.html +301 -0
- data/doc/api/Rumai/ExportInstanceMethods.html +103 -0
- data/doc/api/Rumai/IXP.html +94 -0
- data/doc/api/Rumai/IXP/Agent.html +1625 -0
- data/doc/api/Rumai/IXP/Agent/FidStream.html +959 -0
- data/doc/api/Rumai/IXP/Agent/RangedPool.html +381 -0
- data/doc/api/Rumai/IXP/Error.html +110 -0
- data/doc/api/Rumai/IXP/Fcall.html +503 -0
- data/doc/api/Rumai/IXP/Qid.html +207 -0
- data/doc/api/Rumai/IXP/Rattach.html +148 -0
- data/doc/api/Rumai/IXP/Rauth.html +148 -0
- data/doc/api/Rumai/IXP/Rclunk.html +148 -0
- data/doc/api/Rumai/IXP/Rcreate.html +148 -0
- data/doc/api/Rumai/IXP/Rerror.html +148 -0
- data/doc/api/Rumai/IXP/Rflush.html +148 -0
- data/doc/api/Rumai/IXP/Ropen.html +148 -0
- data/doc/api/Rumai/IXP/Rread.html +148 -0
- data/doc/api/Rumai/IXP/Rremove.html +148 -0
- data/doc/api/Rumai/IXP/Rstat.html +148 -0
- data/doc/api/Rumai/IXP/Rversion.html +148 -0
- data/doc/api/Rumai/IXP/Rwalk.html +148 -0
- data/doc/api/Rumai/IXP/Rwrite.html +148 -0
- data/doc/api/Rumai/IXP/Rwstat.html +148 -0
- data/doc/api/Rumai/IXP/Stat.html +335 -0
- data/doc/api/Rumai/IXP/Stream.html +194 -0
- data/doc/api/Rumai/IXP/Struct.html +586 -0
- data/doc/api/Rumai/IXP/Struct/ClassField.html +242 -0
- data/doc/api/Rumai/IXP/Struct/Field.html +782 -0
- data/doc/api/Rumai/IXP/Struct/Field/CounteeField.html +227 -0
- data/doc/api/Rumai/IXP/Struct/Field/CounterField.html +153 -0
- data/doc/api/Rumai/IXP/Struct/Integer8Field.html +242 -0
- data/doc/api/Rumai/IXP/Struct/StringField.html +206 -0
- data/doc/api/Rumai/IXP/Tattach.html +148 -0
- data/doc/api/Rumai/IXP/Tauth.html +148 -0
- data/doc/api/Rumai/IXP/Tclunk.html +148 -0
- data/doc/api/Rumai/IXP/Tcreate.html +148 -0
- data/doc/api/Rumai/IXP/Terror.html +231 -0
- data/doc/api/Rumai/IXP/Tflush.html +148 -0
- data/doc/api/Rumai/IXP/Topen.html +240 -0
- data/doc/api/Rumai/IXP/Tread.html +148 -0
- data/doc/api/Rumai/IXP/Tremove.html +148 -0
- data/doc/api/Rumai/IXP/Tstat.html +148 -0
- data/doc/api/Rumai/IXP/Tversion.html +162 -0
- data/doc/api/Rumai/IXP/Twalk.html +148 -0
- data/doc/api/Rumai/IXP/Twrite.html +148 -0
- data/doc/api/Rumai/IXP/Twstat.html +148 -0
- data/doc/api/Rumai/Node.html +1406 -0
- data/doc/api/Rumai/View.html +1587 -0
- data/doc/api/Rumai/WidgetImpl.html +333 -0
- data/doc/api/Rumai/WidgetNode.html +246 -0
- data/doc/api/String.html +258 -0
- data/doc/api/StringIO.html +119 -0
- data/doc/api/Time.html +247 -0
- data/doc/api/_index.html +581 -0
- data/doc/api/class_list.html +36 -0
- data/doc/api/css/common.css +1 -0
- data/doc/api/css/full_list.css +50 -0
- data/doc/api/css/style.css +273 -0
- data/doc/api/file.LICENSE.html +73 -0
- data/doc/api/file_list.html +38 -0
- data/doc/api/frames.html +13 -0
- data/doc/api/index.html +72 -13
- data/doc/api/js/app.js +111 -0
- data/doc/api/js/full_list.js +117 -0
- data/doc/api/js/{jquery-1.3.2.min.js → jquery.js} +0 -0
- data/doc/api/method_list.html +1483 -0
- data/doc/api/top-level-namespace.html +89 -0
- data/doc/index.erb +18 -13
- data/doc/index.html +331 -386
- data/lib/rumai.rb +1 -18
- data/lib/rumai/fs.rb +11 -11
- data/lib/rumai/inochi.rb +48 -0
- data/lib/rumai/inochi.yaml +94 -0
- data/lib/rumai/ixp.rb +0 -4
- data/lib/rumai/ixp/message.rb +6 -17
- data/lib/rumai/ixp/transport.rb +39 -30
- data/lib/rumai/wm.rb +35 -37
- data/test/rumai/inochi_test.rb +17 -0
- data/test/rumai/ixp/message_test.rb +245 -0
- data/test/runner +25 -0
- data/test/test_helper.rb +1 -0
- metadata +107 -125
- data/doc/api/apple-touch-icon.png +0 -0
- data/doc/api/classes/IO.html +0 -72
- data/doc/api/classes/Integer.html +0 -110
- data/doc/api/classes/Object.html +0 -60
- data/doc/api/classes/Rumai.html +0 -837
- data/doc/api/classes/Rumai/Area.html +0 -909
- data/doc/api/classes/Rumai/Chain.html +0 -197
- data/doc/api/classes/Rumai/Client.html +0 -1526
- data/doc/api/classes/Rumai/ClientContainer.html +0 -191
- data/doc/api/classes/Rumai/ExportInstanceMethods.html +0 -69
- data/doc/api/classes/Rumai/IXP.html +0 -131
- data/doc/api/classes/Rumai/IXP/Agent.html +0 -941
- data/doc/api/classes/Rumai/IXP/Agent/FidStream.html +0 -456
- data/doc/api/classes/Rumai/IXP/Agent/MODES.html +0 -108
- data/doc/api/classes/Rumai/IXP/Agent/RangedPool.html +0 -241
- data/doc/api/classes/Rumai/IXP/Error.html +0 -67
- data/doc/api/classes/Rumai/IXP/Fcall.html +0 -323
- data/doc/api/classes/Rumai/IXP/Qid.html +0 -153
- data/doc/api/classes/Rumai/IXP/Rattach.html +0 -67
- data/doc/api/classes/Rumai/IXP/Rauth.html +0 -67
- data/doc/api/classes/Rumai/IXP/Rclunk.html +0 -67
- data/doc/api/classes/Rumai/IXP/Rcreate.html +0 -67
- data/doc/api/classes/Rumai/IXP/Rerror.html +0 -67
- data/doc/api/classes/Rumai/IXP/Rflush.html +0 -67
- data/doc/api/classes/Rumai/IXP/Ropen.html +0 -67
- data/doc/api/classes/Rumai/IXP/Rread.html +0 -67
- data/doc/api/classes/Rumai/IXP/Rremove.html +0 -67
- data/doc/api/classes/Rumai/IXP/Rstat.html +0 -67
- data/doc/api/classes/Rumai/IXP/Rversion.html +0 -67
- data/doc/api/classes/Rumai/IXP/Rwalk.html +0 -67
- data/doc/api/classes/Rumai/IXP/Rwrite.html +0 -67
- data/doc/api/classes/Rumai/IXP/Rwstat.html +0 -67
- data/doc/api/classes/Rumai/IXP/Stat.html +0 -252
- data/doc/api/classes/Rumai/IXP/Stream.html +0 -131
- data/doc/api/classes/Rumai/IXP/Struct.html +0 -311
- data/doc/api/classes/Rumai/IXP/Struct/Field.html +0 -415
- data/doc/api/classes/Rumai/IXP/Struct/Field/CounteeField.html +0 -153
- data/doc/api/classes/Rumai/IXP/Struct/Field/CounterField.html +0 -104
- data/doc/api/classes/Rumai/IXP/Tattach.html +0 -68
- data/doc/api/classes/Rumai/IXP/Tauth.html +0 -67
- data/doc/api/classes/Rumai/IXP/Tclunk.html +0 -67
- data/doc/api/classes/Rumai/IXP/Tcreate.html +0 -68
- data/doc/api/classes/Rumai/IXP/Terror.html +0 -110
- data/doc/api/classes/Rumai/IXP/Tflush.html +0 -67
- data/doc/api/classes/Rumai/IXP/Topen.html +0 -165
- data/doc/api/classes/Rumai/IXP/Tread.html +0 -67
- data/doc/api/classes/Rumai/IXP/Tremove.html +0 -67
- data/doc/api/classes/Rumai/IXP/Tstat.html +0 -67
- data/doc/api/classes/Rumai/IXP/Tversion.html +0 -86
- data/doc/api/classes/Rumai/IXP/Twalk.html +0 -68
- data/doc/api/classes/Rumai/IXP/Twrite.html +0 -68
- data/doc/api/classes/Rumai/IXP/Twstat.html +0 -67
- data/doc/api/classes/Rumai/Node.html +0 -821
- data/doc/api/classes/Rumai/View.html +0 -967
- data/doc/api/classes/Rumai/WidgetImpl.html +0 -65
- data/doc/api/classes/Rumai/WidgetNode.html +0 -68
- data/doc/api/classes/String.html +0 -163
- data/doc/api/classes/StringIO.html +0 -72
- data/doc/api/classes/Time.html +0 -156
- data/doc/api/created.rid +0 -1
- data/doc/api/css/main.css +0 -263
- data/doc/api/css/panel.css +0 -383
- data/doc/api/css/reset.css +0 -53
- data/doc/api/favicon.ico +0 -0
- data/doc/api/files/CREDITS.html +0 -67
- data/doc/api/files/LICENSE.html +0 -76
- data/doc/api/files/lib/rumai/fs_rb.html +0 -75
- data/doc/api/files/lib/rumai/ixp/message_rb.html +0 -91
- data/doc/api/files/lib/rumai/ixp/transport_rb.html +0 -75
- data/doc/api/files/lib/rumai/ixp_rb.html +0 -69
- data/doc/api/files/lib/rumai/wm_rb.html +0 -77
- data/doc/api/files/lib/rumai_rb.html +0 -65
- data/doc/api/i/arrows.png +0 -0
- data/doc/api/i/results_bg.png +0 -0
- data/doc/api/i/tree_bg.png +0 -0
- data/doc/api/js/jquery-effect.js +0 -593
- data/doc/api/js/main.js +0 -22
- data/doc/api/js/searchdoc.js +0 -628
- data/doc/api/panel/index.html +0 -71
- data/doc/api/panel/search_index.js +0 -1
- data/doc/api/panel/tree.js +0 -1
- data/doc/history.erb +0 -233
- data/doc/intro.erb +0 -70
- data/doc/setup.erb +0 -144
- data/doc/usage.erb +0 -308
- data/rakefile +0 -14
- data/test/rumai/ixp/message.rb +0 -237
data/lib/rumai.rb
CHANGED
@@ -1,20 +1,3 @@
|
|
1
|
-
|
2
|
-
# Copyright protects this work.
|
3
|
-
# See LICENSE file for details.
|
4
|
-
#++
|
5
|
-
|
6
|
-
require 'rubygems'
|
7
|
-
gem 'inochi', '~> 1'
|
8
|
-
require 'inochi'
|
9
|
-
|
10
|
-
Inochi.init :Rumai,
|
11
|
-
:version => '3.2.0',
|
12
|
-
:release => '2009-11-17',
|
13
|
-
:website => 'http://snk.tuxfamily.org/lib/rumai/',
|
14
|
-
:tagline => 'Ruby interface to the wmii window manager',
|
15
|
-
:develop => {
|
16
|
-
:dfect => nil, # for unit testing
|
17
|
-
}
|
18
|
-
|
1
|
+
require 'rumai/inochi'
|
19
2
|
require 'rumai/fs'
|
20
3
|
require 'rumai/wm'
|
data/lib/rumai/fs.rb
CHANGED
@@ -1,8 +1,4 @@
|
|
1
1
|
# File system abstractions over the 9P2000 protocol.
|
2
|
-
#--
|
3
|
-
# Copyright protects this work.
|
4
|
-
# See LICENSE file for details.
|
5
|
-
#++
|
6
2
|
|
7
3
|
require 'rumai/ixp'
|
8
4
|
require 'socket'
|
@@ -15,7 +11,7 @@ module Rumai
|
|
15
11
|
"/tmp/ns.#{ENV['USER']}.#{display[/:\d+/]}/wmii"
|
16
12
|
|
17
13
|
begin
|
18
|
-
#
|
14
|
+
# we use a single, global connection to wmii's IXP server
|
19
15
|
IXP_AGENT = IXP::Agent.new(UNIXSocket.new(IXP_SOCK_ADDR))
|
20
16
|
|
21
17
|
rescue => error
|
@@ -43,7 +39,7 @@ module Rumai
|
|
43
39
|
##
|
44
40
|
# Returns file statistics about this node.
|
45
41
|
#
|
46
|
-
#
|
42
|
+
# @see Rumai::IXP::Agent#stat
|
47
43
|
#
|
48
44
|
def stat
|
49
45
|
IXP_AGENT.stat @path
|
@@ -81,7 +77,7 @@ module Rumai
|
|
81
77
|
##
|
82
78
|
# Opens this node for I/O access.
|
83
79
|
#
|
84
|
-
#
|
80
|
+
# @see Rumai::IXP::Agent#open
|
85
81
|
#
|
86
82
|
def open mode = 'r', &block
|
87
83
|
IXP_AGENT.open @path, mode, &block
|
@@ -90,7 +86,7 @@ module Rumai
|
|
90
86
|
##
|
91
87
|
# Returns the entire content of this node.
|
92
88
|
#
|
93
|
-
#
|
89
|
+
# @see Rumai::IXP::Agent#read
|
94
90
|
#
|
95
91
|
def read *args
|
96
92
|
IXP_AGENT.read @path, *args
|
@@ -99,7 +95,9 @@ module Rumai
|
|
99
95
|
##
|
100
96
|
# Invokes the given block for every line in the content of this node.
|
101
97
|
#
|
102
|
-
|
98
|
+
# @yieldparam [String] line
|
99
|
+
#
|
100
|
+
def each_line &block
|
103
101
|
open do |file|
|
104
102
|
until (chunk = file.read(true)).empty?
|
105
103
|
chunk.each_line(&block)
|
@@ -117,7 +115,7 @@ module Rumai
|
|
117
115
|
##
|
118
116
|
# Creates a file corresponding to this node on the IXP server.
|
119
117
|
#
|
120
|
-
#
|
118
|
+
# @see Rumai::IXP::Agent#create
|
121
119
|
#
|
122
120
|
def create *args
|
123
121
|
IXP_AGENT.create @path, *args
|
@@ -198,7 +196,7 @@ module Rumai
|
|
198
196
|
# Both of the above expressions are equivalent.
|
199
197
|
#
|
200
198
|
module ExportInstanceMethods
|
201
|
-
def self.extended target
|
199
|
+
def self.extended target # @private
|
202
200
|
target.instance_methods(false).each do |meth|
|
203
201
|
(class << target; self; end).instance_eval do
|
204
202
|
define_method meth do |path, *args|
|
@@ -209,10 +207,12 @@ module Rumai
|
|
209
207
|
end
|
210
208
|
end
|
211
209
|
|
210
|
+
##
|
212
211
|
# NOTE: We use extend() **AFTER** all methods have been defined
|
213
212
|
# in the class so that the ExportInstanceMethods module
|
214
213
|
# can do its magic. If, instead, we include()d the module
|
215
214
|
# before all methods in the class had been defined, then
|
216
215
|
# the magic would only apply to **SOME** of the methods!
|
216
|
+
#
|
217
217
|
Node.extend ExportInstanceMethods
|
218
218
|
end
|
data/lib/rumai/inochi.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
module Rumai
|
2
|
+
|
3
|
+
INSTDIR = File.expand_path('../../..', __FILE__)
|
4
|
+
|
5
|
+
# load inochi configuration
|
6
|
+
inochi_file = __FILE__.sub(/rb$/, 'yaml')
|
7
|
+
begin
|
8
|
+
|
9
|
+
configs = File.open(inochi_file) do |f|
|
10
|
+
require 'yaml'
|
11
|
+
YAML.load_stream(f).documents
|
12
|
+
end
|
13
|
+
|
14
|
+
INOCHI = configs.shift.to_hash
|
15
|
+
INOCHI[:runtime] ||= {}
|
16
|
+
INOCHI[:devtime] ||= {}
|
17
|
+
|
18
|
+
INOCHI2 = (configs.shift || {}).to_hash
|
19
|
+
|
20
|
+
rescue => error
|
21
|
+
error.message.insert 0,
|
22
|
+
"Could not load Inochi configuration file: #{inochi_file.inspect}\n"
|
23
|
+
raise error
|
24
|
+
end
|
25
|
+
|
26
|
+
# make values available as constants
|
27
|
+
INOCHI.each do |param, value|
|
28
|
+
const_set param.to_s.upcase, value
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.inspect
|
32
|
+
"#{PROJECT} #{VERSION} (#{RELEASE})"
|
33
|
+
end
|
34
|
+
|
35
|
+
# establish gem version dependencies
|
36
|
+
if respond_to? :gem
|
37
|
+
[:runtime, :devtime].each do |key|
|
38
|
+
INOCHI[key].each do |gem_name, gem_version|
|
39
|
+
begin
|
40
|
+
gem gem_name, *Array(gem_version)
|
41
|
+
rescue LoadError => error
|
42
|
+
warn "#{inspect} #{key}: #{error}"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
--- # information about your project -----------------------------------------
|
2
|
+
|
3
|
+
# Name of your project.
|
4
|
+
:project: Rumai
|
5
|
+
|
6
|
+
# Name of your project when packaged as a directory.
|
7
|
+
:package: rumai
|
8
|
+
|
9
|
+
# Name of Ruby module that namespaces your project.
|
10
|
+
:library: Rumai
|
11
|
+
|
12
|
+
# A short, single-line description of your project.
|
13
|
+
:tagline: Ruby interface to the wmii window manager
|
14
|
+
|
15
|
+
# Address of your project's published website.
|
16
|
+
:website: http://snk.tuxfamily.org/lib/rumai/
|
17
|
+
|
18
|
+
# A list of the core developers of your project.
|
19
|
+
#
|
20
|
+
# :authors:
|
21
|
+
# - An Example <an@example.com> # with email
|
22
|
+
# - Another Example # without email
|
23
|
+
#
|
24
|
+
:authors:
|
25
|
+
- Suraj N. Kurapati <sunaku@gmail.com>
|
26
|
+
|
27
|
+
# Number of the current release of your project.
|
28
|
+
:version: 3.2.1
|
29
|
+
|
30
|
+
# Date of the current release of your project.
|
31
|
+
:release: 2010-03-22
|
32
|
+
|
33
|
+
# A list of gems required by your project during runtime.
|
34
|
+
#
|
35
|
+
# :runtime:
|
36
|
+
# # your project needs exactly version 1.2.3 of the "an_example" gem
|
37
|
+
# an_example: 1.2.3
|
38
|
+
#
|
39
|
+
# # your project needs at least version 1.2 (but not
|
40
|
+
# # version 1.2.4 or newer) of the "another_example" gem
|
41
|
+
# another_example: [ >= 1.2 , < 1.2.4 ]
|
42
|
+
#
|
43
|
+
# # your project needs any version of the "yet_another_example" gem
|
44
|
+
# yet_another_example:
|
45
|
+
#
|
46
|
+
:runtime:
|
47
|
+
|
48
|
+
# A list of gems required by your project during development.
|
49
|
+
#
|
50
|
+
# :devtime:
|
51
|
+
# # your project needs exactly version 1.2.3 of the "an_example" gem
|
52
|
+
# an_example: 1.2.3
|
53
|
+
#
|
54
|
+
# # your project needs at least version 1.2 (but not
|
55
|
+
# # version 1.2.4 or newer) of the "another_example" gem
|
56
|
+
# another_example: [ >= 1.2 , < 1.2.4 ]
|
57
|
+
#
|
58
|
+
# # your project needs any version of the "yet_another_example" gem
|
59
|
+
# yet_another_example:
|
60
|
+
#
|
61
|
+
:devtime:
|
62
|
+
dfect: ~> 2 # for unit testing
|
63
|
+
|
64
|
+
--- # parameters for the `inochi` command ------------------------------------
|
65
|
+
|
66
|
+
# Location where project documentation will be uploaded by `inochi pub:doc`.
|
67
|
+
:pub_doc_target: ~/www/lib/rumai/
|
68
|
+
|
69
|
+
# Options for the `rsync` command used to upload your project's documentation.
|
70
|
+
:pub_doc_options: --verbose --compress --archive --update --delete
|
71
|
+
|
72
|
+
# Path to YAML file containing login information for publishing announcements.
|
73
|
+
:pub_ann_logins: ~/.config/inochi/pub_ann_logins.yaml
|
74
|
+
|
75
|
+
# Your project's unique identifier in the RAA (Ruby Application Archive).
|
76
|
+
:pub_ann_raa_id: rumai
|
77
|
+
|
78
|
+
# Arbitrary Ruby code to configure your project's
|
79
|
+
# RubyGem, whose Gem::Specification object is made
|
80
|
+
# available to the given code in the `gem` variable.
|
81
|
+
#
|
82
|
+
# :gem_spec_logic: |
|
83
|
+
# # view the Inochi-provided default configuration of your RubyGem
|
84
|
+
# puts gem
|
85
|
+
#
|
86
|
+
# # add files that are outside your project directory to your RubyGem
|
87
|
+
# gem.files += FileList['/some/outside/**/*.files']
|
88
|
+
#
|
89
|
+
# # omit some files in your project directory from your RubyGem
|
90
|
+
# gem.files.exclude '{some*files,in_your,project/**/directory}'
|
91
|
+
#
|
92
|
+
# # and so on... anything is possible! use your imagination!
|
93
|
+
#
|
94
|
+
:gem_spec_logic: |
|
data/lib/rumai/ixp.rb
CHANGED
data/lib/rumai/ixp/message.rb
CHANGED
@@ -1,13 +1,7 @@
|
|
1
1
|
# Primitives for the 9P2000 protocol.
|
2
2
|
#
|
3
3
|
# See http://cm.bell-labs.com/sys/man/5/INDEX.html
|
4
|
-
#
|
5
4
|
# See http://swtch.com/plan9port/man/man9/
|
6
|
-
#
|
7
|
-
#--
|
8
|
-
# Copyright protects this work.
|
9
|
-
# See LICENSE file for details.
|
10
|
-
#++
|
11
5
|
|
12
6
|
module Rumai
|
13
7
|
module IXP
|
@@ -54,7 +48,7 @@ module Rumai
|
|
54
48
|
##
|
55
49
|
# Allows field values to be initialized via the constructor.
|
56
50
|
#
|
57
|
-
#
|
51
|
+
# @param field_values
|
58
52
|
# a mapping from field name to field value
|
59
53
|
#
|
60
54
|
def initialize field_values = {}
|
@@ -100,7 +94,8 @@ module Rumai
|
|
100
94
|
##
|
101
95
|
# Defines a new field in this Struct.
|
102
96
|
#
|
103
|
-
#
|
97
|
+
# @param args
|
98
|
+
# arguments for {Field.new}
|
104
99
|
#
|
105
100
|
def field name, format = nil, *args
|
106
101
|
klass = Field.factory(format)
|
@@ -135,8 +130,6 @@ module Rumai
|
|
135
130
|
end
|
136
131
|
end
|
137
132
|
|
138
|
-
private
|
139
|
-
|
140
133
|
##
|
141
134
|
# A field inside a Struct.
|
142
135
|
#
|
@@ -148,13 +141,13 @@ module Rumai
|
|
148
141
|
attr_reader :name, :format, :counter, :countee
|
149
142
|
|
150
143
|
##
|
151
|
-
#
|
144
|
+
# @param name
|
152
145
|
# unique (among all fields in a struct) name for the field
|
153
146
|
#
|
154
|
-
#
|
147
|
+
# @param format
|
155
148
|
# number of bytes, a class, or nil
|
156
149
|
#
|
157
|
-
# [counter
|
150
|
+
# @param [Field] counter
|
158
151
|
# field which counts the length of this field's value
|
159
152
|
#
|
160
153
|
def initialize name, format = nil, counter = nil
|
@@ -272,8 +265,6 @@ module Rumai
|
|
272
265
|
end
|
273
266
|
end
|
274
267
|
|
275
|
-
#:stopdoc:
|
276
|
-
|
277
268
|
##
|
278
269
|
# A field whose value knows how to convert itself to and from 9p.
|
279
270
|
#
|
@@ -310,8 +301,6 @@ module Rumai
|
|
310
301
|
stream.read_9p(4) | (stream.read_9p(4) << BYTE4_BITS)
|
311
302
|
end
|
312
303
|
end
|
313
|
-
|
314
|
-
#:startdoc:
|
315
304
|
end
|
316
305
|
|
317
306
|
##
|
data/lib/rumai/ixp/transport.rb
CHANGED
@@ -1,8 +1,4 @@
|
|
1
1
|
# Transport layer for 9P2000 protocol.
|
2
|
-
#--
|
3
|
-
# Copyright protects this work.
|
4
|
-
# See LICENSE file for details.
|
5
|
-
#++
|
6
2
|
|
7
3
|
require 'rumai/ixp/message'
|
8
4
|
require 'thread' # for Mutex and Queue
|
@@ -20,7 +16,7 @@ module Rumai
|
|
20
16
|
attr_reader :msize
|
21
17
|
|
22
18
|
##
|
23
|
-
#
|
19
|
+
# @param stream
|
24
20
|
# I/O stream on which a 9P2000 server is listening.
|
25
21
|
#
|
26
22
|
def initialize stream
|
@@ -105,7 +101,7 @@ module Rumai
|
|
105
101
|
end
|
106
102
|
|
107
103
|
##
|
108
|
-
# Sends the given request
|
104
|
+
# Sends the given request {Rumai::IXP::Fcall} and returns
|
109
105
|
# a ticket that you can use later to receive the reply.
|
110
106
|
#
|
111
107
|
def send request
|
@@ -119,7 +115,7 @@ module Rumai
|
|
119
115
|
|
120
116
|
##
|
121
117
|
# Returns the reply for the given ticket, which was previously given
|
122
|
-
# to you when you sent the corresponding request
|
118
|
+
# to you when you sent the corresponding request {Rumai::IXP::Fcall}.
|
123
119
|
#
|
124
120
|
def recv tag
|
125
121
|
loop do
|
@@ -127,17 +123,30 @@ module Rumai
|
|
127
123
|
if @recv_buf.key? tag
|
128
124
|
@recv_buf.delete tag
|
129
125
|
else
|
130
|
-
# reply was not in
|
131
|
-
#
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
126
|
+
# reply was not in receive buffer, so read
|
127
|
+
# the next reply... hoping that it is ours
|
128
|
+
|
129
|
+
next_reply_available =
|
130
|
+
@recv_buf.empty? || begin
|
131
|
+
# check (in a non-blocking fashion) if
|
132
|
+
# the stream has reply for us right now
|
133
|
+
@stream.ungetc @stream.read_nonblock(1)
|
134
|
+
true
|
135
|
+
rescue Errno::EAGAIN
|
136
|
+
# the stream is empty
|
137
|
+
end
|
138
|
+
|
139
|
+
if next_reply_available
|
140
|
+
msg = Fcall.from_9p(@stream)
|
141
|
+
|
142
|
+
if msg.tag == tag
|
143
|
+
msg
|
144
|
+
else
|
145
|
+
# we got someone else's reply, so buffer
|
146
|
+
# it (for them to receive) and try again
|
147
|
+
@recv_buf[msg.tag] = msg
|
148
|
+
nil
|
149
|
+
end
|
141
150
|
end
|
142
151
|
end
|
143
152
|
end
|
@@ -158,7 +167,7 @@ module Rumai
|
|
158
167
|
end
|
159
168
|
|
160
169
|
##
|
161
|
-
# Sends the given request
|
170
|
+
# Sends the given request {Rumai::IXP::Fcall} and returns its reply.
|
162
171
|
#
|
163
172
|
def talk request
|
164
173
|
tag = send(request)
|
@@ -190,13 +199,13 @@ module Rumai
|
|
190
199
|
end
|
191
200
|
|
192
201
|
##
|
193
|
-
# Opens the given path for I/O access through a FidStream
|
202
|
+
# Opens the given path for I/O access through a {FidStream}
|
194
203
|
# object. If a block is given, it is invoked with a
|
195
|
-
# FidStream object and the stream is closed afterwards.
|
204
|
+
# {FidStream} object and the stream is closed afterwards.
|
196
205
|
#
|
197
|
-
#
|
206
|
+
# @see File::open
|
198
207
|
#
|
199
|
-
def open path, mode = 'r'
|
208
|
+
def open path, mode = 'r'
|
200
209
|
mode = MODES.parse(mode)
|
201
210
|
|
202
211
|
# open the file
|
@@ -224,7 +233,7 @@ module Rumai
|
|
224
233
|
##
|
225
234
|
# Encapsulates I/O access over a file handle (fid).
|
226
235
|
#
|
227
|
-
#
|
236
|
+
# @note this class is NOT thread safe!
|
228
237
|
#
|
229
238
|
class FidStream
|
230
239
|
attr_reader :fid, :stat
|
@@ -272,17 +281,17 @@ module Rumai
|
|
272
281
|
|
273
282
|
##
|
274
283
|
# Reads some data from this stream at the current position.
|
284
|
+
# If this stream corresponds to a directory, then an Array of
|
285
|
+
# Stat (one for each file in the directory) will be returned.
|
286
|
+
#
|
287
|
+
# @param [Boolean] partial
|
275
288
|
#
|
276
|
-
# [partial]
|
277
289
|
# When false, the entire content of
|
278
290
|
# this stream is read and returned.
|
279
291
|
#
|
280
292
|
# When true, the maximum amount of content that can fit
|
281
293
|
# inside a single 9P2000 message is read and returned.
|
282
294
|
#
|
283
|
-
# If this stream corresponds to a directory, then an Array of
|
284
|
-
# Stat (one for each file in the directory) will be returned.
|
285
|
-
#
|
286
295
|
def read partial = false
|
287
296
|
raise 'cannot read from a closed stream' if @closed
|
288
297
|
|
@@ -355,7 +364,7 @@ module Rumai
|
|
355
364
|
# Returns the basenames of all files
|
356
365
|
# inside the directory at the given path.
|
357
366
|
#
|
358
|
-
#
|
367
|
+
# @see Dir::entries
|
359
368
|
#
|
360
369
|
def entries path
|
361
370
|
unless stat(path).directory?
|
@@ -478,7 +487,7 @@ module Rumai
|
|
478
487
|
##
|
479
488
|
# Invokes the given block with a temporary FID.
|
480
489
|
#
|
481
|
-
def with_fid
|
490
|
+
def with_fid
|
482
491
|
begin
|
483
492
|
fid = @fid_pool.obtain
|
484
493
|
yield fid
|