Sorry for replying to my previous email. With this patch applied, here
is the simple implementation (less than 100 lines of code) of Ruby
remote filesystem using DRb.
server.rb:
#!/usr/bin/env ruby
require 'drb'
class RemoteDirectory
def initialize(dir)
@dir = dir
@files = {}
end
def contents(path)
Dir[File.join(@dir, path,'*')].map{|fn| File.basename fn}
end
%w|file? directory? executable? size delete|.each do |name|
define_method(name) do |path|
File.send name, File.join(@dir, path)
end
end
%w|mkdir rmdir|.each do |name|
define_method(name) do |path|
Dir.send name, File.join(@dir, path)
end
end
%w|can_write? can_delete? can_mkdir? can_rmdir?|.each do |name|
define_method(name) do |path|
true
end
end
def raw_open(path, mode)
return true if @files.has_key? path
@files[path] = File.open(File.join(@dir, path), mode)
return true
rescue
puts $!
false
end
def raw_read(path, off, size)
file = @files[path]
return unless file
file.seek(off, File::SEEK_SET)
file.read(size)
rescue
puts $!
nil
end
def raw_write(path, off, sz, buf)
file = @files[path]
return unless file
file.seek(off, File::SEEK_SET)
file.write(buf[0, sz])
rescue
puts $!
end
def raw_close(path)
file = @files[path]
return unless file
file.close
@files.delete path
rescue
puts $!
end
end
if $0 == __FILE__
dir = RemoteDirectory.new ARGV.shift || '.'
uri = ARGV.shift || 'druby://0.0.0.0:7777'
DRb.start_service uri, dir
puts DRb.uri
DRb.thread.join
end
rubyfs.rb:
#!/usr/bin/env ruby
require 'drb'
require 'fusefs'
unless (1..2).include? ARGV.size
puts "Usage: #$0 <directory> <uri>"
exit(1)
end
dir = ARGV.shift
uri = ARGV.shift || 'druby://0.0.0.0:7777'
DRb.start_service(nil, nil)
root = DRbObject.new_with_uri(uri)
FuseFS.set_root(root)
FuseFS.mount_under(dir)
FuseFS.run
Now I don't have to use samba in order to access files on my Windows
workstation!
Cool.
Kent.
···
On Sun, 2005-10-30 at 05:18 +0900, Kent Sibilev wrote:
Thank you.
I've been playing with new raw API and I've found it somewhat broken.
Please consider this diff:
RCS file: /var/cvs/fusefs/fusefs/ext/fusefs_lib.c,v
retrieving revision 1.9
diff -u -r1.9 fusefs_lib.c
--- fusefs_lib.c 15 Oct 2005 21:48:03 -0000 1.9
+++ fusefs_lib.c 29 Oct 2005 20:07:03 -0000
@@ -637,7 +637,7 @@
newfile->next = opened_head;
opened_head = newfile;
- return 1;
+ return 0;
}
debug(" no.\n");
@@ -845,7 +845,7 @@
/* raw read */
debug(" yes.\n");
rf_call(path,id_raw_close,Qnil);
- return 0;
+ goto out;
}
debug(" no.\n");
@@ -867,6 +867,8 @@
}
}
+out:
+
/* Free the file contents. */
if (!is_editor) {
if (prev == NULL) {
@@ -1246,7 +1248,13 @@
VALUE args = rb_ary_new();
rb_ary_push(args,INT2NUM(offset));
rb_ary_push(args,INT2NUM(size));
- rf_call(path,id_raw_read,args);
+ VALUE ret = rf_call(path,id_raw_read,args);
+ if(ret == Qnil)
+ return 0;
+ StringValue(ret);
+ if(RSTRING(ret)->len < size)
+ size = RSTRING(ret)->len;
+ memcpy(buf, RSTRING(ret)->ptr, size);
return size;
}
Cheers,
Kent.
On Sat, 2005-10-29 at 16:52 +0900, Greg Millam wrote:
> Lo, another travesty was visited upon the ruby-talk community ... and
> this one was named ... FuseFS 0.5!
>
> --------------
>
> FuseFS is a ruby module that lets you define Filesystems in ruby, so you
> can navigate a database. Browse virtual filesystems with ls and cd! Or
> even, with _why_the_lucky_stiff's railsfs.rb (included in FuseFS 0.5!)
> view your Ruby On Rails data on your filesystem! Do you want to know more?
>
> http://redhanded.hobix.com/inspect/railsfsAfterACoupleMinutesOfToolingWithFuseWhoa.html
>
> Aside from the awesome railsfs.rb and the FUSE-2.4 change, what else is
> included?
>
> Well, remember how you couldn't get some apps to recognize a file as
> being anything other than empty? Well now you can correct that assumption!
>
> fuseroot#size will be called on files, so when xmms tries to load your
> ruby-offered mp3, it'll be able to!
>
> And a treat for those working with big (and I mean BIG) files that they
> don't want all loaded into ram:
>
> "raw_open" and associated methods will allow fuseroot to receive the
> actual, individual read and write requests for each file, so that you
> can return portions of a file at a time!
>
> http://rubyforge.org/projects/fusefs/
>
> Happy coding!
>
> - Greg
>