Method: Net::SFTP::Protocol::V05::Base#open

Defined in:
lib/net/sftp/protocol/05/base.rb

#open(path, flags, options) ⇒ Object

Sends a FXP_OPEN packet to the server and returns the packet identifier. The flags parameter is either an integer (in which case it must be a combination of the IO constants) or a string (in which case it must be one of the mode strings that IO::open accepts). The options parameter is a hash that is used to construct a new Attribute object, to pass as part of the FXP_OPEN request.



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/net/sftp/protocol/05/base.rb', line 35

def open(path, flags, options)
  flags = normalize_open_flags(flags)

  sftp_flags, desired_access = if flags & (IO::WRONLY | IO::RDWR) != 0
      open = if flags & (IO::CREAT | IO::EXCL) == (IO::CREAT | IO::EXCL)
        FV5::CREATE_NEW
      elsif flags & (IO::CREAT | IO::TRUNC) == (IO::CREAT | IO::TRUNC)
        FV5::CREATE_TRUNCATE
      elsif flags & IO::CREAT == IO::CREAT
        FV5::OPEN_OR_CREATE
      else
        FV5::OPEN_EXISTING
      end
      access = ACE::Mask::WRITE_DATA | ACE::Mask::WRITE_ATTRIBUTES
      access |= ACE::Mask::READ_DATA | ACE::Mask::READ_ATTRIBUTES if (flags & IO::RDWR) == IO::RDWR
      if flags & IO::APPEND == IO::APPEND
        open |= FV5::APPEND_DATA
        access |= ACE::Mask::APPEND_DATA
      end
      [open, access]
    else
      [FV5::OPEN_EXISTING, ACE::Mask::READ_DATA | ACE::Mask::READ_ATTRIBUTES]
    end

  attributes = attribute_factory.new(options)

  send_request(FXP_OPEN, :string, path, :long, desired_access, :long, sftp_flags, :raw, attributes.to_s)
end