Class: HrrRbSftp::Protocol::Version3::Extensions::FstatvfsAtOpensshCom

Inherits:
Extension
  • Object
show all
Defined in:
lib/hrr_rb_sftp/protocol/version3/extensions/fstatvfs_at_openssh_com.rb

Overview

This class implements [email protected] version 2 extension format and responder.

Constant Summary collapse

EXTENSION_NAME =

Represents [email protected] version 2 extension name.

"[email protected]"
EXTENSION_DATA =

Represents [email protected] version 2 extension data.

"2"
SSH_FXE_STATVFS_ST_RDONLY =

Represents [email protected] version 2 extension read-only flag.

0x1
SSH_FXE_STATVFS_ST_NOSUID =

Represents [email protected] version 2 extension no setuid flag.

0x2
REQUEST_FORMAT =

Represents SSH_FXP_EXTENDED packet additional format for [email protected] version 2 extension.

{
  :"extended-request" => {
    "[email protected]" => [
      [DataTypes::String, :"handle"],
    ],
  },
}
REPLY_FORMAT =

Represents SSH_FXP_EXTENDED_REPLY packet additional format for [email protected] version 2 extension.

{
  :"extended-reply" => {
    "[email protected]" => [
      [DataTypes::Uint64, :"f_bsize"  ], # file system block size
      [DataTypes::Uint64, :"f_frsize" ], # fundamental fs block size
      [DataTypes::Uint64, :"f_blocks" ], # number of blocks (unit f_frsize)
      [DataTypes::Uint64, :"f_bfree"  ], # free blocks in file system
      [DataTypes::Uint64, :"f_bavail" ], # free blocks for non-root
      [DataTypes::Uint64, :"f_files"  ], # total file inodes
      [DataTypes::Uint64, :"f_ffree"  ], # free file inodes
      [DataTypes::Uint64, :"f_favail" ], # free file inodes for to non-root
      [DataTypes::Uint64, :"f_fsid"   ], # file system id
      [DataTypes::Uint64, :"f_flag"   ], # bit mask of f_flag values
      [DataTypes::Uint64, :"f_namemax"], # maximum filename length
    ],
  },
}

Instance Method Summary collapse

Instance Method Details

#respond_to(request) ⇒ Hash{Symbol=>Object}

Responds to SSH_FXP_EXTENDED request with [email protected] extended-request.

Parameters:

  • request (Hash{Symbol=>Object})

    SSH_FXP_EXTENDED request represented in Hash.

Returns:

  • (Hash{Symbol=>Object})

    Response represented in Hash. In case of success, its type is SSH_FXP_EXTENDED_REPLY. In other cases, its type is SSH_FXP_STATUS.



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/hrr_rb_sftp/protocol/version3/extensions/fstatvfs_at_openssh_com.rb', line 69

def respond_to request
  begin
    raise "Specified handle does not exist" unless handles.has_key?(request[:"handle"])
    log_debug { "file = handles[#{request[:"handle"].inspect}]" }
    file = handles[request[:"handle"]]
    log_debug { "Sys::Filesystem.stat(#{file.path.inspect})" }
    stat = Sys::Filesystem.stat(file.path)
    {
      :"type"           => Packets::SSH_FXP_EXTENDED_REPLY::TYPE,
      :"request-id"     => request[:"request-id"],
      :"extended-reply" => request[:"extended-request"], # implied field in reply format
      :"f_bsize"        => stat.block_size,
      :"f_frsize"       => stat.fragment_size,
      :"f_blocks"       => stat.blocks,
      :"f_bfree"        => stat.blocks_free,
      :"f_bavail"       => stat.blocks_available,
      :"f_files"        => stat.files,
      :"f_ffree"        => stat.files_free,
      :"f_favail"       => stat.files_available,
      :"f_fsid"         => stat.filesystem_id,
      :"f_flag"         => stat.flags & (Sys::Filesystem::Stat::RDONLY | Sys::Filesystem::Stat::NOSUID),
      :"f_namemax"      => stat.name_max,
    }
  rescue Sys::Filesystem::Error => e
    log_debug { e.message }
    {
      :"type"          => Packets::SSH_FXP_STATUS::TYPE,
      :"request-id"    => request[:"request-id"],
      :"code"          => Packets::SSH_FXP_STATUS::SSH_FX_FAILURE,
      :"error message" => e.message,
      :"language tag"  => "",
    }
  end
end