Skip to content

Instantly share code, notes, and snippets.

@karmi
Forked from kubicek/gist:111363
Created May 15, 2009 07:54
Show Gist options
  • Save karmi/112105 to your computer and use it in GitHub Desktop.
Save karmi/112105 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
#
# Based on drbfs example by Kent Sibilev
require 'lib/fusefs'
# We're basically just passing all requests on to the local filesystem.
class UfsDirectory
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_rename(path,dest)
puts "HOOK: renamed #{path} to #{dest}"
File.rename(File.join(@dir,path),File.join(@dir,dest))
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__
#raw filesystem
FuseFS.set_root(UfsDirectory.new("./photos"))
#hooked filesystem
FuseFS.mount_under("./virt_photos", "allow_root")
FuseFS.run
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment