rumai 3.2.0 → 3.2.1
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/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/wm.rb
CHANGED
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
# Abstractions for the window manager.
|
|
2
|
-
#--
|
|
3
|
-
# Copyright protects this work.
|
|
4
|
-
# See LICENSE file for details.
|
|
5
|
-
#++
|
|
6
2
|
|
|
7
3
|
require 'rumai/fs'
|
|
8
4
|
require 'enumerator'
|
|
9
5
|
|
|
10
|
-
class Object
|
|
6
|
+
class Object # @private
|
|
11
7
|
# prevent these deprecated properties
|
|
12
8
|
# from clashing with our usage below
|
|
13
9
|
undef id if respond_to? :id
|
|
@@ -21,12 +17,12 @@ module Rumai
|
|
|
21
17
|
CLIENT_GROUPING_TAG = '@'.freeze
|
|
22
18
|
CLIENT_STICKY_TAG = '/./'.freeze
|
|
23
19
|
|
|
24
|
-
|
|
20
|
+
#---------------------------------------------------------------------------
|
|
25
21
|
# abstraction of WM components
|
|
26
|
-
|
|
22
|
+
#---------------------------------------------------------------------------
|
|
27
23
|
|
|
28
24
|
##
|
|
29
|
-
#
|
|
25
|
+
# @note Inheritors must override the {Chain#chain} method.
|
|
30
26
|
#
|
|
31
27
|
module Chain
|
|
32
28
|
##
|
|
@@ -64,10 +60,10 @@ module Rumai
|
|
|
64
60
|
##
|
|
65
61
|
# The basic building block of the WM hierarchy.
|
|
66
62
|
#
|
|
67
|
-
#
|
|
68
|
-
#
|
|
63
|
+
# @note Inheritors must define a {curr} class method.
|
|
64
|
+
# @note Inheritors must override the {focus} method.
|
|
69
65
|
#
|
|
70
|
-
module WidgetImpl
|
|
66
|
+
module WidgetImpl
|
|
71
67
|
attr_reader :id
|
|
72
68
|
|
|
73
69
|
def == other
|
|
@@ -87,7 +83,7 @@ module Rumai
|
|
|
87
83
|
##
|
|
88
84
|
# A widget that has a corresponding representation in the IXP file system.
|
|
89
85
|
#
|
|
90
|
-
class WidgetNode < Node
|
|
86
|
+
class WidgetNode < Node
|
|
91
87
|
include WidgetImpl
|
|
92
88
|
|
|
93
89
|
def initialize id, path_prefix
|
|
@@ -126,9 +122,9 @@ module Rumai
|
|
|
126
122
|
View.curr.clients
|
|
127
123
|
end
|
|
128
124
|
|
|
129
|
-
|
|
125
|
+
#-----------------------------------------------------------------------
|
|
130
126
|
# WM operations
|
|
131
|
-
|
|
127
|
+
#-----------------------------------------------------------------------
|
|
132
128
|
|
|
133
129
|
##
|
|
134
130
|
# Focuses this client within the given view.
|
|
@@ -188,7 +184,8 @@ module Rumai
|
|
|
188
184
|
end
|
|
189
185
|
|
|
190
186
|
##
|
|
191
|
-
# Maximizes this client to occupy the
|
|
187
|
+
# Maximizes this client to occupy the
|
|
188
|
+
# entire screen on the current view.
|
|
192
189
|
#
|
|
193
190
|
def fullscreen
|
|
194
191
|
ctl.write 'Fullscreen on'
|
|
@@ -291,9 +288,9 @@ module Rumai
|
|
|
291
288
|
|
|
292
289
|
alias manage! float!
|
|
293
290
|
|
|
294
|
-
|
|
291
|
+
#-----------------------------------------------------------------------
|
|
295
292
|
# WM hierarchy
|
|
296
|
-
|
|
293
|
+
#-----------------------------------------------------------------------
|
|
297
294
|
|
|
298
295
|
##
|
|
299
296
|
# Returns the area that contains this client within the given view.
|
|
@@ -309,9 +306,9 @@ module Rumai
|
|
|
309
306
|
tags.map! {|t| View.new t }
|
|
310
307
|
end
|
|
311
308
|
|
|
312
|
-
|
|
309
|
+
#-----------------------------------------------------------------------
|
|
313
310
|
# tag manipulations
|
|
314
|
-
|
|
311
|
+
#-----------------------------------------------------------------------
|
|
315
312
|
|
|
316
313
|
TAG_DELIMITER = '+'.freeze
|
|
317
314
|
|
|
@@ -395,9 +392,9 @@ module Rumai
|
|
|
395
392
|
end
|
|
396
393
|
end
|
|
397
394
|
|
|
398
|
-
|
|
395
|
+
#-----------------------------------------------------------------------
|
|
399
396
|
# multiple client grouping
|
|
400
|
-
|
|
397
|
+
#-----------------------------------------------------------------------
|
|
401
398
|
|
|
402
399
|
##
|
|
403
400
|
# Checks if this client is included in the current grouping.
|
|
@@ -449,7 +446,7 @@ module Rumai
|
|
|
449
446
|
end
|
|
450
447
|
|
|
451
448
|
##
|
|
452
|
-
#
|
|
449
|
+
# @note Inheritors should override the {ClientContainer#client_ids} method.
|
|
453
450
|
#
|
|
454
451
|
module ClientContainer
|
|
455
452
|
##
|
|
@@ -491,7 +488,8 @@ module Rumai
|
|
|
491
488
|
attr_reader :view
|
|
492
489
|
|
|
493
490
|
##
|
|
494
|
-
# [
|
|
491
|
+
# @param [Rumai::View] view
|
|
492
|
+
# the view object which contains this area
|
|
495
493
|
#
|
|
496
494
|
def initialize area_id, view = View.curr
|
|
497
495
|
@id = Integer(area_id) rescue area_id
|
|
@@ -576,9 +574,9 @@ module Rumai
|
|
|
576
574
|
@view.ctl.write "colmode #{@id} #{mode}"
|
|
577
575
|
end
|
|
578
576
|
|
|
579
|
-
|
|
577
|
+
#-----------------------------------------------------------------------
|
|
580
578
|
# WM operations
|
|
581
|
-
|
|
579
|
+
#-----------------------------------------------------------------------
|
|
582
580
|
|
|
583
581
|
##
|
|
584
582
|
# Puts focus on this area.
|
|
@@ -587,9 +585,9 @@ module Rumai
|
|
|
587
585
|
@view.ctl.write "select #{@id}"
|
|
588
586
|
end
|
|
589
587
|
|
|
590
|
-
|
|
588
|
+
#-----------------------------------------------------------------------
|
|
591
589
|
# array abstraction: area is an array of clients
|
|
592
|
-
|
|
590
|
+
#-----------------------------------------------------------------------
|
|
593
591
|
|
|
594
592
|
##
|
|
595
593
|
# Returns the number of clients in this area.
|
|
@@ -761,9 +759,9 @@ module Rumai
|
|
|
761
759
|
super view_id, '/tag'
|
|
762
760
|
end
|
|
763
761
|
|
|
764
|
-
|
|
762
|
+
#-----------------------------------------------------------------------
|
|
765
763
|
# WM operations
|
|
766
|
-
|
|
764
|
+
#-----------------------------------------------------------------------
|
|
767
765
|
|
|
768
766
|
##
|
|
769
767
|
# Returns the manifest of all areas and clients in this view.
|
|
@@ -779,9 +777,9 @@ module Rumai
|
|
|
779
777
|
ctl.write "select #{direction}"
|
|
780
778
|
end
|
|
781
779
|
|
|
782
|
-
|
|
780
|
+
#-----------------------------------------------------------------------
|
|
783
781
|
# WM hierarchy
|
|
784
|
-
|
|
782
|
+
#-----------------------------------------------------------------------
|
|
785
783
|
|
|
786
784
|
##
|
|
787
785
|
# Returns the area which contains the given client in this view.
|
|
@@ -852,9 +850,9 @@ module Rumai
|
|
|
852
850
|
|
|
853
851
|
alias each_managed_area each_column
|
|
854
852
|
|
|
855
|
-
|
|
853
|
+
#-----------------------------------------------------------------------
|
|
856
854
|
# visual arrangement of clients
|
|
857
|
-
|
|
855
|
+
#-----------------------------------------------------------------------
|
|
858
856
|
|
|
859
857
|
##
|
|
860
858
|
# Arranges the clients in this view, while maintaining
|
|
@@ -1011,9 +1009,9 @@ module Rumai
|
|
|
1011
1009
|
end
|
|
1012
1010
|
end
|
|
1013
1011
|
|
|
1014
|
-
|
|
1012
|
+
#---------------------------------------------------------------------------
|
|
1015
1013
|
# access to global WM state
|
|
1016
|
-
|
|
1014
|
+
#---------------------------------------------------------------------------
|
|
1017
1015
|
|
|
1018
1016
|
##
|
|
1019
1017
|
# Returns the root of IXP file system hierarchy.
|
|
@@ -1061,9 +1059,9 @@ module Rumai
|
|
|
1061
1059
|
list
|
|
1062
1060
|
end
|
|
1063
1061
|
|
|
1064
|
-
|
|
1062
|
+
#---------------------------------------------------------------------------
|
|
1065
1063
|
# shortcuts for interactive WM manipulation (via IRB)
|
|
1066
|
-
|
|
1064
|
+
#---------------------------------------------------------------------------
|
|
1067
1065
|
|
|
1068
1066
|
def curr_client ; Client.curr ; end
|
|
1069
1067
|
def next_client ; curr_client.next ; end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require 'rumai/inochi'
|
|
2
|
+
|
|
3
|
+
unless defined? Rumai::INOCHI
|
|
4
|
+
fail "Rumai module must be established by Inochi"
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
Rumai::INOCHI.each do |param, value|
|
|
8
|
+
const = param.to_s.upcase
|
|
9
|
+
|
|
10
|
+
unless Rumai.const_defined? const
|
|
11
|
+
fail "Rumai::#{const} must be established by Inochi"
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
unless Rumai.const_get(const) == value
|
|
15
|
+
fail "Rumai::#{const} is not what Inochi established"
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
require 'rumai/fs'
|
|
2
|
+
require 'pp' if $DEBUG
|
|
3
|
+
|
|
4
|
+
D 'IXP' do
|
|
5
|
+
extend Rumai::IXP
|
|
6
|
+
|
|
7
|
+
D .<< do
|
|
8
|
+
# connect to the wmii IXP server
|
|
9
|
+
@conn = UNIXSocket.new(Rumai::IXP_SOCK_ADDR)
|
|
10
|
+
|
|
11
|
+
# at_exit do
|
|
12
|
+
# puts "just making sure there is no more data in the pipe"
|
|
13
|
+
# while c = @conn.getc
|
|
14
|
+
# puts c
|
|
15
|
+
# end
|
|
16
|
+
# end
|
|
17
|
+
|
|
18
|
+
D 'establish a new session' do
|
|
19
|
+
request, response = talk(Tversion,
|
|
20
|
+
:tag => Fcall::NOTAG,
|
|
21
|
+
:msize => Tversion::MSIZE,
|
|
22
|
+
:version => Tversion::VERSION
|
|
23
|
+
)
|
|
24
|
+
T { response.type == Rversion.type }
|
|
25
|
+
T { response.version == request.version }
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
D 'can read a directory' do
|
|
30
|
+
D 'attach to FS root' do
|
|
31
|
+
request, response = talk(Tattach,
|
|
32
|
+
:tag => 0,
|
|
33
|
+
:fid => 0,
|
|
34
|
+
:afid => Fcall::NOFID,
|
|
35
|
+
:uname => ENV['USER'],
|
|
36
|
+
:aname => ''
|
|
37
|
+
)
|
|
38
|
+
T { response.type == Rattach.type }
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
D 'stat FS root' do
|
|
42
|
+
request, response = talk(Tstat,
|
|
43
|
+
:tag => 0,
|
|
44
|
+
:fid => 0
|
|
45
|
+
)
|
|
46
|
+
T { response.type == Rstat.type }
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
D 'open the FS root for reading' do
|
|
50
|
+
request, response = talk(Topen,
|
|
51
|
+
:tag => 0,
|
|
52
|
+
:fid => 0,
|
|
53
|
+
:mode => Topen::OREAD
|
|
54
|
+
)
|
|
55
|
+
T { response.type == Ropen.type }
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
D 'fetch a Stat for every file in FS root' do
|
|
59
|
+
request, response = talk(Tread,
|
|
60
|
+
:tag => 0,
|
|
61
|
+
:fid => 0,
|
|
62
|
+
:offset => 0,
|
|
63
|
+
:count => Tversion::MSIZE
|
|
64
|
+
)
|
|
65
|
+
T { response.type == Rread.type }
|
|
66
|
+
|
|
67
|
+
if $DEBUG
|
|
68
|
+
s = StringIO.new(response.data, 'r')
|
|
69
|
+
a = []
|
|
70
|
+
|
|
71
|
+
until s.eof?
|
|
72
|
+
t = Stat.from_9p(s)
|
|
73
|
+
a << t
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
pp a
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
D 'close the fid for FS root' do
|
|
81
|
+
request, response = talk(Tclunk,
|
|
82
|
+
:tag => 0,
|
|
83
|
+
:fid => 0
|
|
84
|
+
)
|
|
85
|
+
T { response.type == Rclunk.type }
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
D 'closed fid should not be readable' do
|
|
89
|
+
request, response = talk(Tread,
|
|
90
|
+
:tag => 0,
|
|
91
|
+
:fid => 0,
|
|
92
|
+
:offset => 0,
|
|
93
|
+
:count => Tversion::MSIZE
|
|
94
|
+
)
|
|
95
|
+
T { response.type == Rerror.type }
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
D 'can read & write a file' do
|
|
100
|
+
D 'attach to /' do
|
|
101
|
+
request, response = talk(Tattach,
|
|
102
|
+
:tag => 0,
|
|
103
|
+
:fid => 0,
|
|
104
|
+
:afid => Fcall::NOFID,
|
|
105
|
+
:uname => ENV['USER'],
|
|
106
|
+
:aname => ''
|
|
107
|
+
)
|
|
108
|
+
T { response.type == Rattach.type }
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
file = %W[rbar temp#{$$}]
|
|
112
|
+
root = file[0..-2]
|
|
113
|
+
leaf = file.last
|
|
114
|
+
|
|
115
|
+
D "walk to #{root.inspect}" do
|
|
116
|
+
request, response = talk(Twalk,
|
|
117
|
+
:tag => 0,
|
|
118
|
+
:fid => 0,
|
|
119
|
+
:newfid => 1,
|
|
120
|
+
:wname => root
|
|
121
|
+
)
|
|
122
|
+
T { response.type == Rwalk.type }
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
D "create #{leaf.inspect}" do
|
|
126
|
+
request, response = talk(Tcreate,
|
|
127
|
+
:tag => 0,
|
|
128
|
+
:fid => 1,
|
|
129
|
+
:name => leaf,
|
|
130
|
+
:perm => 0644,
|
|
131
|
+
:mode => Topen::ORDWR
|
|
132
|
+
)
|
|
133
|
+
T { response.type == Rcreate.type }
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
D "close the fid for #{root.inspect}" do
|
|
137
|
+
request, response = talk(Tclunk,
|
|
138
|
+
:tag => 0,
|
|
139
|
+
:fid => 1
|
|
140
|
+
)
|
|
141
|
+
T { response.type == Rclunk.type }
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
D "walk to #{file.inspect} from /" do
|
|
145
|
+
request, response = talk(Twalk,
|
|
146
|
+
:tag => 0,
|
|
147
|
+
:fid => 0,
|
|
148
|
+
:newfid => 1,
|
|
149
|
+
:wname => file
|
|
150
|
+
)
|
|
151
|
+
T { response.type == Rwalk.type }
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
D 'close the fid for /' do
|
|
155
|
+
request, response = talk(Tclunk,
|
|
156
|
+
:tag => 0,
|
|
157
|
+
:fid => 0
|
|
158
|
+
)
|
|
159
|
+
T { response.type == Rclunk.type }
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
D "open #{file.inspect} for writing" do
|
|
163
|
+
request, response = talk(Topen,
|
|
164
|
+
:tag => 0,
|
|
165
|
+
:fid => 1,
|
|
166
|
+
:mode => Topen::ORDWR
|
|
167
|
+
)
|
|
168
|
+
T { response.type == Ropen.type }
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
D "write to #{file.inspect}" do
|
|
172
|
+
write_request, write_response = talk(Twrite,
|
|
173
|
+
:tag => 0,
|
|
174
|
+
:fid => 1,
|
|
175
|
+
:offset => 0,
|
|
176
|
+
:data => "#a1a2a3 #b1b2b3 #c1c2c3 hello world!!!"
|
|
177
|
+
)
|
|
178
|
+
T { write_response.type == Rwrite.type }
|
|
179
|
+
T { write_response.count == write_request.data.length }
|
|
180
|
+
|
|
181
|
+
D "verify the write" do
|
|
182
|
+
read_request, read_response = talk(Tread,
|
|
183
|
+
:tag => 0,
|
|
184
|
+
:fid => 1,
|
|
185
|
+
:offset => 0,
|
|
186
|
+
:count => write_response.count
|
|
187
|
+
)
|
|
188
|
+
T { read_response.type == Rread.type }
|
|
189
|
+
T { read_response.data == write_request.data }
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
D "remove #{file.inspect}" do
|
|
194
|
+
request, response = talk(Tremove,
|
|
195
|
+
:tag => 0,
|
|
196
|
+
:fid => 1
|
|
197
|
+
)
|
|
198
|
+
T { response.type == Rremove.type }
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
D "fid for #{file.inspect} should have been closed by Tremove" do
|
|
202
|
+
request, response = talk(Tclunk,
|
|
203
|
+
:tag => 0,
|
|
204
|
+
:fid => 1
|
|
205
|
+
)
|
|
206
|
+
T { response.type == Rerror.type }
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
##
|
|
211
|
+
# Transmits the given request and returns the received response.
|
|
212
|
+
#
|
|
213
|
+
def talk request_type, request_options
|
|
214
|
+
request = request_type.new(request_options)
|
|
215
|
+
|
|
216
|
+
# send the request
|
|
217
|
+
if $DEBUG
|
|
218
|
+
puts
|
|
219
|
+
pp request
|
|
220
|
+
pp request.to_9p
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
@conn << request.to_9p
|
|
224
|
+
|
|
225
|
+
# receive the response
|
|
226
|
+
response = Fcall.from_9p(@conn)
|
|
227
|
+
|
|
228
|
+
if $DEBUG
|
|
229
|
+
puts
|
|
230
|
+
pp response
|
|
231
|
+
pp response.to_9p
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
if response.type == Rerror.type
|
|
235
|
+
T { response.kind_of? Rerror }
|
|
236
|
+
else
|
|
237
|
+
T { response.type == request.type + 1 }
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
T { response.tag == request.tag }
|
|
241
|
+
|
|
242
|
+
# return the conversation
|
|
243
|
+
[request, response]
|
|
244
|
+
end
|
|
245
|
+
end
|