From: Kent Sibilev Date: 2005-10-30T05:37:07+09:00 Subject: Re: [ANN] FuseFS-0.5 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 " 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 > > > >