Class: FuseFS::FuseDir

Inherits:
Object
  • Object
show all
Defined in:
lib/fuse/fusedir.rb

Overview

This class is equivalent to using Object.new() as the virtual directory for target for start. It exists primarily to document the API but can also be used as a superclass for your filesystem providing sensible defaults

Method call sequences

Stat (getattr)

FUSE itself will generally stat referenced files and validate the results before performing any file/directory operations so this sequence is called very often

  1. #directory? is checked first

    • #can_write? OR #can_mkdir? with ._rfusefs_check_ to determine write permissions

    • #times is called to determine atime,mtime,ctime info for the directory

  2. #file? is checked next

  3. otherwise we tell FUSE that the path does not exist

List directory

FUSE confirms the path is a directory (via stat above) before we call #contents

FUSE will generally go on to stat each directory entry in the results

Reading files

FUSE confirms path is a file before we call #read_file

For fine control of file access see #raw_open, #raw_read, #raw_close

Writing files

FUSE confirms path for the new file is a directory

  • #can_write? is checked at file open

  • #write_to is called when the file is synced, flushed or closed

See also #raw_open, #raw_truncate, #raw_write, #raw_sync, #raw_close

Deleting files

FUSE confirms path is a file before we call #can_delete? then #delete

Creating directories

FUSE confirms parent is a directory before we call #can_mkdir? then #mkdir

Deleting directories

FUSE confirms path is a directory before we call #can_rmdir? then #rmdir

Renaming files and directories

FUSE confirms the rename is valid (eg. not renaming a directory to a file)

Signals

The filesystem can handle a signal by providing a ‘sig<name>` method. eg ’sighup’ #sigint and #sigterm are handled by default to provide a means to exit the filesystem

Direct Known Subclasses

DirLink, PathMapperFS

Constant Summary collapse

INIT_TIMES =
Array.new(3,0)

Instance Method Summary collapse

Instance Method Details

#can_delete?(path) ⇒ Boolean

This method is abstract.

FuseFS api

Returns true if the user can delete the file at path.

Returns:

  • (Boolean)

    true if the user can delete the file at path



202
# File 'lib/fuse/fusedir.rb', line 202

def can_delete?(path);return false;end

#can_mkdir?(path) ⇒ Boolean

This method is abstract.

FuseFS api

Returns true if user can make a directory at path.

Returns:

  • (Boolean)

    true if user can make a directory at path



211
# File 'lib/fuse/fusedir.rb', line 211

def can_mkdir?(path);return false;end

#can_rmdir?(path) ⇒ Boolean

This method is abstract.

FuseFS api

Returns true if user can remove a directory at path.

Returns:

  • (Boolean)

    true if user can remove a directory at path



220
# File 'lib/fuse/fusedir.rb', line 220

def can_rmdir?(path);return false;end

#can_write?(path) ⇒ Boolean

This method is abstract.

FuseFS api

Returns true if the user can write to file at path.

Returns:

  • (Boolean)

    true if the user can write to file at path



193
# File 'lib/fuse/fusedir.rb', line 193

def can_write?(path);return false;end

#contents(path) ⇒ Array<String>

This method is abstract.

FuseFS api

Returns array of file and directory names within path.

Returns:

  • (Array<String>)

    array of file and directory names within path



171
# File 'lib/fuse/fusedir.rb', line 171

def contents(path);return [];end

#delete(path) ⇒ void

This method is abstract.

FuseFS api

This method returns an undefined value.

Delete the file at path



207
# File 'lib/fuse/fusedir.rb', line 207

def delete(path);end

#directory?(path) ⇒ Boolean

This method is abstract.

FuseFS api

Returns true if path is a directory.

Returns:

  • (Boolean)

    true if path is a directory



163
# File 'lib/fuse/fusedir.rb', line 163

def directory?(path);return false;end

#executable?(path) ⇒ Boolean

This method is abstract.

FuseFS api

Returns true if path is an executable file.

Returns:

  • (Boolean)

    true if path is an executable file



175
# File 'lib/fuse/fusedir.rb', line 175

def executable?(path);return false;end

#file?(path) ⇒ Boolean

This method is abstract.

FuseFS api

Returns true if path is a file.

Returns:

  • (Boolean)

    true if path is a file



167
# File 'lib/fuse/fusedir.rb', line 167

def file?(path);end

#mkdir(path) ⇒ void

This method is abstract.

FuseFS api

This method returns an undefined value.

Make a directory at path



216
# File 'lib/fuse/fusedir.rb', line 216

def mkdir(path);end

#mountedvoid

This method returns an undefined value.

RFuseFS extension. Called when the filesystem is mounted



317
# File 'lib/fuse/fusedir.rb', line 317

def mounted();end

#raw_close(path, raw = nil) ⇒ void

This method is abstract.

FuseFS api

This method returns an undefined value.

Close the file previously opened at path (or filehandle raw)



293
# File 'lib/fuse/fusedir.rb', line 293

def raw_close(path,raw=nil);end

#raw_open(path, mode, rfusefs = nil) ⇒ nil, Object

This method is abstract.

FuseFS api

Raw file access

Parameters:

  • mode (String)

    “r”,“w” or “rw”, with “a” if file is opened for append

  • rfusefs (Boolean) (defaults to: nil)

    will be “true” if RFuseFS extensions are available

Returns:

  • (nil)

    to indicate raw operations are not implemented

  • (Object)

    a filehandle Under RFuseFS this object will be passed back in to the other raw methods as the optional parameter raw



247
# File 'lib/fuse/fusedir.rb', line 247

def raw_open(path,mode,rfusefs = nil);end

#raw_read(path, offset, size, raw = nil) ⇒ void

This method is abstract.

FuseFS api

This method returns an undefined value.

Read sz bytes from file at path (or filehandle raw) starting at offset off

Parameters:

  • path (String)
  • offset (Integer)
  • size (Integer)
  • raw (Object) (defaults to: nil)

    the filehandle returned by #raw_open



276
# File 'lib/fuse/fusedir.rb', line 276

def raw_read(path,offset,size,raw=nil);end

#raw_sync(path, datasync, raw = nil) ⇒ Object

Sync buffered data to your filesystem

Parameters:

  • path (String)
  • datasync (Boolena)

    only sync user data, not metadata

  • raw (Object) (defaults to: nil)

    the filehandle return by #raw_open



288
# File 'lib/fuse/fusedir.rb', line 288

def raw_sync(path,datasync,raw=nil);end

#raw_truncate(path, offset, raw) ⇒ void #raw_truncate(path, offset) ⇒ Boolean

This method is abstract.

FuseFS api

RFuseFS extension.

Overloads:

  • #raw_truncate(path, offset, raw) ⇒ void

    This method returns an undefined value.

    Truncate an open file to offset bytes

    Parameters:

    • path (String)
    • offset (Integer)
    • raw (Object)

      the filehandle returned from #raw_open

  • #raw_truncate(path, offset) ⇒ Boolean

    Optionally truncate a file to offset bytes directly

    Parameters:

    • path (String)
    • offset (Integer)

    Returns:

    • (Boolean)

      if truncate has been performed, otherwise the truncation will be performed with #read_file and #write_to



266
# File 'lib/fuse/fusedir.rb', line 266

def raw_truncate(path,offset,raw=nil);end

#raw_write(path, off, sz, buf, raw = nil) ⇒ void

This method is abstract.

FuseFS api

This method returns an undefined value.

Write sz bytes from file at path (or filehandle raw) starting at offset off



281
# File 'lib/fuse/fusedir.rb', line 281

def raw_write(path,off,sz,buf,raw=nil);end

#read_file(path) ⇒ String

This method is abstract.

FuseFS api

Returns the contents of the file at path.

Returns:

  • (String)

    the contents of the file at path



189
# File 'lib/fuse/fusedir.rb', line 189

def read_file(path);return "";end

#rename(from_path, to_path) ⇒ Boolean

This method is abstract.

FuseFS api

Move a file or directory.

Returns:

  • (Boolean)

    true to indicate the rename has been handled, otherwise will fallback to copy/delete



236
# File 'lib/fuse/fusedir.rb', line 236

def rename(from_path,to_path);end

#rmdir(path) ⇒ void

This method is abstract.

FuseFS api

This method returns an undefined value.

Remove the directory at path



225
# File 'lib/fuse/fusedir.rb', line 225

def rmdir(path);end

#scan_path(path) ⇒ Array<String>

base,*rest = scan_path(path)

Returns:

  • (Array<String>)

    all directory and file elements in path. Useful when encapsulating an entire fs into one object



157
158
159
# File 'lib/fuse/fusedir.rb', line 157

def scan_path(path)
    path.scan(/[^\/]+/)
end

#sigintvoid

This method returns an undefined value.

Handle the INT signal and exit the filesystem



# File 'lib/fuse/fusedir.rb', line 130

#sigtermvoid

This method returns an undefined value.

Handle the TERM signal and exit the filesystem



138
# File 'lib/fuse/fusedir.rb', line 138

INIT_TIMES = Array.new(3,0)

#size(path) ⇒ Integer

This method is abstract.

FuseFS api

File size

Returns:

  • (Integer)

    the size in byte of a file (lots of applications rely on this being accurate )



180
# File 'lib/fuse/fusedir.rb', line 180

def size(path); read_file(path).length ;end

#split_path(path) ⇒ Array<String,String>

base,rest = split_path(path)

Returns:

  • (Array<String,String>)

    base,rest. base is the first directory in path, and rest is nil> or the remaining path. Typically if rest is not nil? you should recurse the paths



145
146
147
148
149
150
151
152
# File 'lib/fuse/fusedir.rb', line 145

def split_path(path)
    cur, *rest = path.scan(/[^\/]+/)
    if rest.empty?
        [ cur, nil ]
    else
        [ cur, File::SEPARATOR + File.join(rest) ]
    end
end

#statistics(path) ⇒ Array<Integer>, RFuse::StatVfs

This method is abstract.

FuseFS api

RFuseFS extensions. File system statistics

Parameters:

  • path (String)

Returns:

  • (Array<Integer>)

    the statistics used_space (in bytes), used_files, max_space, max_files See StatsHelper

  • (RFuse::StatVfs)

    or raw statistics



312
# File 'lib/fuse/fusedir.rb', line 312

def statistics(path); [0,0,0,0]; end

#times(path) ⇒ Array<Integer, Time>

This method is abstract.

FuseFS api

File time information. RFuseFS extension.

Returns:

  • (Array<Integer, Time>)

    a 3 element array [ atime, mtime. ctime ] (good for rsync etc)



185
# File 'lib/fuse/fusedir.rb', line 185

def times(path);return INIT_TIMES;end

#touch(path, modtime) ⇒ void

This method is abstract.

FuseFS api

This method returns an undefined value.

Neat toy. Called when a file is touched or has its timestamp explicitly modified



230
# File 'lib/fuse/fusedir.rb', line 230

def touch(path,modtime);end

#unmountedvoid

This method returns an undefined value.

RFuseFS extension. Called when the filesystem is unmounted



322
# File 'lib/fuse/fusedir.rb', line 322

def unmounted();end

#write_to(path, str) ⇒ void

This method is abstract.

FuseFS api

This method returns an undefined value.

Write the contents of str to file at path



198
# File 'lib/fuse/fusedir.rb', line 198

def write_to(path,str);end

#xattr(path) ⇒ Hash

This method is abstract.

FuseFS api

RFuseFS extension. Extended attributes.

Parameters:

  • path (String)

Returns:

  • (Hash)

    extended attributes for this path. The returned object will be manipulated directly using :[] :[]=,, :keys and :delete so the default (a new empty hash on every call) will not retain attributes that are set



302
# File 'lib/fuse/fusedir.rb', line 302

def xattr(path); {} ; end