def open(path, flags, options)
flags = normalize_open_flags(flags)
if flags & (IO::WRONLY | IO::RDWR) != 0
sftp_flags = FV1::WRITE
sftp_flags |= FV1::READ if flags & IO::RDWR != 0
sftp_flags |= FV1::APPEND if flags & IO::APPEND != 0
else
sftp_flags = FV1::READ
end
sftp_flags |= FV1::CREAT if flags & IO::CREAT != 0
sftp_flags |= FV1::TRUNC if flags & IO::TRUNC != 0
sftp_flags |= FV1::EXCL if flags & IO::EXCL != 0
attributes = attribute_factory.new(options)
send_request(FXP_OPEN, :string, path, :long, sftp_flags, :raw, attributes.to_s)
end