ssh_xfer.erl
来自「OTP是开放电信平台的简称」· ERL 代码 · 共 1,026 行 · 第 1/3 页
ERL
1,026 行
HLen = length(Handle), Size = 1 + 4 + 4+HLen, ToSend = [<<?UINT32(Size), ?SSH_FXP_HANDLE, ?UINT32(ReqId), ?UINT32(HLen)>>, Handle], ssh_cm:send(CM, Channel, ToSend).xf_send_names(#ssh_xfer{cm = CM, channel = Channel, vsn = Vsn}, ReqId, NamesAndAttrs) -> Count = length(NamesAndAttrs), {Data, Len} = encode_names(Vsn, NamesAndAttrs), Size = 1 + 4 + 4 + Len, ToSend = [<<?UINT32(Size), ?SSH_FXP_NAME, ?UINT32(ReqId), ?UINT32(Count)>>, Data], ?dbg(true, "xf_send_names: Size=~p size(ToSend)=~p\n", [Size, size(list_to_binary(ToSend))]), ssh_cm:send(CM, Channel, ToSend).xf_send_status(XF, ReqId, ErrorCode) -> xf_send_status(XF, ReqId, ErrorCode, "").xf_send_status(XF, ReqId, ErrorCode, ErrorMsg) -> xf_send_status(XF, ReqId, ErrorCode, ErrorMsg, <<>>).xf_send_status(#ssh_xfer{cm = CM, channel = Channel}, ReqId, ErrorCode, ErrorMsg, Data) -> LangTag = "en", ELen = length(ErrorMsg), TLen = 2, %% length(LangTag), Size = 1 + 4 + 4 + 4+ELen + 4+TLen + size(Data), ToSend = [<<?UINT32(Size), ?SSH_FXP_STATUS, ?UINT32(ReqId), ?UINT32(ErrorCode)>>, <<?UINT32(ELen)>>, ErrorMsg, <<?UINT32(TLen)>>, LangTag, Data], ssh_cm:send(CM, Channel, ToSend).xf_send_attr(#ssh_xfer{cm = CM, channel = Channel, vsn = Vsn}, ReqId, Attr) -> EncAttr = encode_ATTR(Vsn, Attr), ALen = size(EncAttr), Size = 1 + 4 + ALen, ToSend = [<<?UINT32(Size), ?SSH_FXP_ATTRS, ?UINT32(ReqId)>>, EncAttr], ssh_cm:send(CM, Channel, ToSend).xf_send_data(#ssh_xfer{cm = CM, channel = Channel}, ReqId, Data) -> DLen = size(Data), Size = 1 + 4 + 4+DLen, ToSend = [<<?UINT32(Size), ?SSH_FXP_DATA, ?UINT32(ReqId), ?UINT32(DLen)>>, Data], ssh_cm:send(CM, Channel, ToSend). %% xf_reply_server(XF, <<?SSH_FXP_INIT, ?UINT32(V)>>) ->%% Vers = XF#ssh_xfer.vsn,%% Ver = if Vers > V -> V;%% true -> Vers%% end,%% xf_send_reply(XF, ?SSH_FXP_VERSION, <<?UINT32(Ver)>>),%% ok;%% xf_reply_server(_XF, <<?SSH_FXP_VERSION>> ) ->%% ok.xf_reply(_XF, << ?SSH_FXP_STATUS, ?UINT32(ReqID), ?UINT32(Status), ?UINT32(ELen), Err:ELen/binary, ?UINT32(LLen), Lang:LLen/binary, Reply/binary >> ) -> Stat = decode_status(Status), {status, ReqID, {Stat,binary_to_list(Err),binary_to_list(Lang), Reply}};xf_reply(_XF, << ?SSH_FXP_STATUS, ?UINT32(ReqID), ?UINT32(Status)>> ) -> Stat = decode_status(Status), {status, ReqID, {Stat,"","",<<>>}};xf_reply(_XF, <<?SSH_FXP_HANDLE, ?UINT32(ReqID), ?UINT32(HLen), Handle:HLen/binary>>) -> {handle, ReqID, Handle};xf_reply(_XF, <<?SSH_FXP_DATA, ?UINT32(ReqID), ?UINT32(DLen), Data:DLen/binary>>) -> {data, ReqID, Data};xf_reply(XF, <<?SSH_FXP_NAME, ?UINT32(ReqID), ?UINT32(Count), AData/binary>>) -> ?dbg(true, "xf_reply ?SSH_FXP_NAME: AData=~p\n", [AData]), {name, ReqID, decode_names(XF#ssh_xfer.vsn, Count, AData)};xf_reply(XF, <<?SSH_FXP_ATTRS, ?UINT32(ReqID), AData/binary>>) -> {A, _} = decode_ATTR(XF#ssh_xfer.vsn, AData), {attrs, ReqID, A};xf_reply(_XF, <<?SSH_FXP_EXTENDED_REPLY, ?UINT32(ReqID), RData>>) -> {extended_reply, ReqID, RData}.decode_status(Status) -> case Status of ?SSH_FX_OK -> ok; ?SSH_FX_EOF -> eof; ?SSH_FX_NO_SUCH_FILE -> no_such_file; ?SSH_FX_PERMISSION_DENIED -> permission_denied; ?SSH_FX_FAILURE -> failure; ?SSH_FX_BAD_MESSAGE -> bad_message; ?SSH_FX_NO_CONNECTION -> no_connection; ?SSH_FX_CONNECTION_LOST -> connection_lost; ?SSH_FX_OP_UNSUPPORTED -> op_unsupported; ?SSH_FX_INVALID_HANDLE -> invalid_handle; ?SSH_FX_NO_SUCH_PATH -> no_such_path; ?SSH_FX_FILE_ALREADY_EXISTS -> file_already_exists; ?SSH_FX_WRITE_PROTECT -> write_protect; ?SSH_FX_NO_MEDIA -> no_media; ?SSH_FX_NO_SPACE_ON_FILESYSTEM -> no_space_on_filesystem; ?SSH_FX_QUOTA_EXCEEDED -> quota_exceeded; ?SSH_FX_UNKNOWN_PRINCIPLE -> unknown_principle; ?SSH_FX_LOCK_CONFlICT -> lock_conflict; ?SSH_FX_NOT_A_DIRECTORY -> not_a_directory; _ -> {error,Status} end.encode_erlang_status(Status) -> case Status of ok -> ?SSH_FX_OK; eof -> ?SSH_FX_EOF; enoent -> ?SSH_FX_NO_SUCH_FILE; eacces -> ?SSH_FX_PERMISSION_DENIED; _ -> ?SSH_FX_FAILURE end.%% ?SSH_FX_FAILURE -> failure;%% ?SSH_FX_BAD_MESSAGE -> bad_message;%% ?SSH_FX_NO_CONNECTION -> no_connection;%% ?SSH_FX_CONNECTION_LOST -> connection_lost;%% ?SSH_FX_OP_UNSUPPORTED -> op_unsupported;%% ?SSH_FX_INVALID_HANDLE -> invalid_handle;%% ?SSH_FX_NO_SUCH_PATH -> no_such_path;%% ?SSH_FX_FILE_ALREADY_EXISTS -> file_already_exists;%% ?SSH_FX_WRITE_PROTECT -> write_protect;%% ?SSH_FX_NO_MEDIA -> no_media;%% ?SSH_FX_NO_SPACE_ON_FILESYSTEM -> no_space_on_filesystem;%% ?SSH_FX_QUOTA_EXCEEDED -> quota_exceeded;%% ?SSH_FX_UNKNOWN_PRINCIPLE -> unknown_principle;%% ?SSH_FX_LOCK_CONFlICT -> lock_conflict%% end.decode_ext(<<?UINT32(NameLen), Name:NameLen/binary, ?UINT32(DataLen), Data:DataLen/binary, Tail/binary>>) -> [{binary_to_list(Name), binary_to_list(Data)} | decode_ext(Tail)];decode_ext(<<>>) -> [].%%%% Encode rename flags%%encode_rename_flags(Flags) -> encode_bits( fun(overwrite) -> ?SSH_FXP_RENAME_OVERWRITE; (atomic) -> ?SSH_FXP_RENAME_ATOMIC; (native) -> ?SSH_FXP_RENAME_NATIVE end, Flags).%% decode_rename_flags(F) ->%% decode_bits(F,%% [{?SSH_FXP_RENAME_OVERWRITE, overwrite},%% {?SSH_FXP_RENAME_ATOMIC, atomic},%% {?SSH_FXP_RENAME_NATIVE, native}]). encode_open_flags(Flags) -> encode_bits( fun (read) -> ?SSH_FXF_READ; (write) -> ?SSH_FXF_WRITE; (append) -> ?SSH_FXF_APPEND; (creat) -> ?SSH_FXF_CREAT; (trunc) -> ?SSH_FXF_TRUNC; (excl) -> ?SSH_FXF_EXCL; (create_new) -> ?SSH_FXF_CREATE_NEW; (create_truncate) -> ?SSH_FXF_CREATE_TRUNCATE; (open_existing) -> ?SSH_FXF_OPEN_EXISTING; (open_or_create) -> ?SSH_FXF_OPEN_OR_CREATE; (truncate_existing) -> ?SSH_FXF_TRUNCATE_EXISTING; (append_data) -> ?SSH_FXF_ACCESS_APPEND_DATA; (append_data_atomic) -> ?SSH_FXF_ACCESS_APPEND_DATA_ATOMIC; (text_mode) -> ?SSH_FXF_ACCESS_TEXT_MODE; (read_lock) -> ?SSH_FXF_ACCESS_READ_LOCK; (write_lock) -> ?SSH_FXF_ACCESS_WRITE_LOCK; (delete_lock) -> ?SSH_FXF_ACCESS_DELETE_LOCK end, Flags).encode_ace_mask(Access) -> encode_bits( fun(read_data) -> ?ACE4_READ_DATA; (list_directory) -> ?ACE4_LIST_DIRECTORY; (write_data) -> ?ACE4_WRITE_DATA; (add_file) -> ?ACE4_ADD_FILE; (append_data) -> ?ACE4_APPEND_DATA; (add_subdirectory) -> ?ACE4_ADD_SUBDIRECTORY; (read_named_attrs) -> ?ACE4_READ_NAMED_ATTRS; (write_named_attrs) -> ?ACE4_WRITE_NAMED_ATTRS; (execute) -> ?ACE4_EXECUTE; (delete_child) -> ?ACE4_DELETE_CHILD; (read_attributes) -> ?ACE4_READ_ATTRIBUTES; (write_attributes) -> ?ACE4_WRITE_ATTRIBUTES; (delete) -> ?ACE4_DELETE; (read_acl) -> ?ACE4_READ_ACL; (write_acl) -> ?ACE4_WRITE_ACL; (write_owner) -> ?ACE4_WRITE_OWNER; (synchronize) -> ?ACE4_SYNCHRONIZE end, Access).decode_ace_mask(F) -> decode_bits(F, [ {?ACE4_READ_DATA, read_data}, {?ACE4_LIST_DIRECTORY, list_directory}, {?ACE4_WRITE_DATA, write_data}, {?ACE4_ADD_FILE, add_file}, {?ACE4_APPEND_DATA, append_data}, {?ACE4_ADD_SUBDIRECTORY, add_subdirectory}, {?ACE4_READ_NAMED_ATTRS, read_named_attrs}, {?ACE4_WRITE_NAMED_ATTRS, write_named_attrs}, {?ACE4_EXECUTE, execute}, {?ACE4_DELETE_CHILD, delete_child}, {?ACE4_READ_ATTRIBUTES, read_attributes}, {?ACE4_WRITE_ATTRIBUTES, write_attributes}, {?ACE4_DELETE, delete}, {?ACE4_READ_ACL, read_acl}, {?ACE4_WRITE_ACL, write_acl}, {?ACE4_WRITE_OWNER, write_owner}, {?ACE4_SYNCHRONIZE, synchronize} ]).decode_open_flags(Vsn, F) when Vsn =< 3 -> decode_bits(F, [ {?SSH_FXF_READ, read}, {?SSH_FXF_WRITE, write}, {?SSH_FXF_APPEND, append}, {?SSH_FXF_CREAT, creat}, {?SSH_FXF_TRUNC, trunc}, {?SSH_FXF_EXCL, excl} ]);decode_open_flags(Vsn, F) when Vsn >= 4 -> R = decode_bits(F, [ {?SSH_FXF_ACCESS_APPEND_DATA, append_data}, {?SSH_FXF_ACCESS_APPEND_DATA_ATOMIC, append_data_atomic}, {?SSH_FXF_ACCESS_TEXT_MODE, text_mode}, {?SSH_FXF_ACCESS_READ_LOCK, read_lock}, {?SSH_FXF_ACCESS_WRITE_LOCK, write_lock}, {?SSH_FXF_ACCESS_DELETE_LOCK, delete_lock} ]), AD = case F band ?SSH_FXF_ACCESS_DISPOSITION of ?SSH_FXF_CREATE_NEW -> create_new; ?SSH_FXF_CREATE_TRUNCATE -> create_truncate; ?SSH_FXF_OPEN_EXISTING -> open_existing; ?SSH_FXF_OPEN_OR_CREATE -> open_or_create; ?SSH_FXF_TRUNCATE_EXISTING -> truncate_existing end, [AD | R]. encode_ace_type(Type) -> case Type of access_allowed -> ?ACE4_ACCESS_ALLOWED_ACE_TYPE; access_denied -> ?ACE4_ACCESS_DENIED_ACE_TYPE; system_audit -> ?ACE4_SYSTEM_AUDIT_ACE_TYPE; system_alarm -> ?ACE4_SYSTEM_ALARM_ACE_TYPE end.decode_ace_type(F) -> case F of ?ACE4_ACCESS_ALLOWED_ACE_TYPE -> access_allowed; ?ACE4_ACCESS_DENIED_ACE_TYPE -> access_denied; ?ACE4_SYSTEM_AUDIT_ACE_TYPE -> system_audit; ?ACE4_SYSTEM_ALARM_ACE_TYPE -> system_alarm end.encode_ace_flag(Flag) -> encode_bits( fun(file_inherit) -> ?ACE4_FILE_INHERIT_ACE; (directory_inherit) -> ?ACE4_DIRECTORY_INHERIT_ACE; (no_propagte_inherit) -> ?ACE4_NO_PROPAGATE_INHERIT_ACE; (inherit_only) -> ?ACE4_INHERIT_ONLY_ACE; (successful_access) -> ?ACE4_SUCCESSFUL_ACCESS_ACE_FLAG; (failed_access) -> ?ACE4_FAILED_ACCESS_ACE_FLAG; (identifier_group) -> ?ACE4_IDENTIFIER_GROUP end, Flag).decode_ace_flag(F) -> decode_bits(F, [ {?ACE4_FILE_INHERIT_ACE, file_inherit}, {?ACE4_DIRECTORY_INHERIT_ACE, directory_inherit}, {?ACE4_NO_PROPAGATE_INHERIT_ACE, no_propagte_inherit}, {?ACE4_INHERIT_ONLY_ACE, inherit_only}, {?ACE4_SUCCESSFUL_ACCESS_ACE_FLAG, successful_access}, {?ACE4_FAILED_ACCESS_ACE_FLAG, failed_access}, {?ACE4_IDENTIFIER_GROUP, identifier_group} ]).encode_attr_flags(Vsn, all) -> encode_attr_flags(Vsn, [size, uidgid, permissions, acmodtime, accesstime, createtime, modifytime, acl, ownergroup, subsecond_times, bits, extended]);encode_attr_flags(Vsn, Flags) -> encode_bits( fun(size) -> ?SSH_FILEXFER_ATTR_SIZE; (uidgid) when Vsn =<3 -> ?SSH_FILEXFER_ATTR_UIDGID; (permissions) -> ?SSH_FILEXFER_ATTR_PERMISSIONS; (acmodtime) when Vsn =< 3 -> ?SSH_FILEXFER_ATTR_ACMODTIME; (accesstime) when Vsn >= 5 -> ?SSH_FILEXFER_ATTR_ACCESSTIME; (createtime) when Vsn >= 5 -> ?SSH_FILEXFER_ATTR_CREATETIME; (modifytime) when Vsn >= 5 -> ?SSH_FILEXFER_ATTR_MODIFYTIME; (acl) when Vsn >= 5 -> ?SSH_FILEXFER_ATTR_ACL; (ownergroup) when Vsn >= 5 -> ?SSH_FILEXFER_ATTR_OWNERGROUP; (subsecond_times) when Vsn >= 5 -> ?SSH_FILEXFER_ATTR_SUBSECOND_TIMES; (bits) when Vsn >= 5 -> ?SSH_FILEXFER_ATTR_BITS; (extended) when Vsn >= 5 -> ?SSH_FILEXFER_ATTR_EXTENDED; (_) -> 0 end, Flags).encode_file_type(Type) -> ?dbg(true, "encode_file_type(~p)\n", [Type]), case Type of regular -> ?SSH_FILEXFER_TYPE_REGULAR; directory -> ?SSH_FILEXFER_TYPE_DIRECTORY; symlink -> ?SSH_FILEXFER_TYPE_SYMLINK; special -> ?SSH_FILEXFER_TYPE_SPECIAL; unknown -> ?SSH_FILEXFER_TYPE_UNKNOWN; other -> ?SSH_FILEXFER_TYPE_UNKNOWN; socket -> ?SSH_FILEXFER_TYPE_SOCKET; char_device -> ?SSH_FILEXFER_TYPE_CHAR_DEVICE; block_device -> ?SSH_FILEXFER_TYPE_BLOCK_DEVICE; fifo -> ?SSH_FILEXFER_TYPE_FIFO; undefined -> ?SSH_FILEXFER_TYPE_UNKNOWN end.decode_file_type(Type) -> case Type of ?SSH_FILEXFER_TYPE_REGULAR -> regular; ?SSH_FILEXFER_TYPE_DIRECTORY -> directory; ?SSH_FILEXFER_TYPE_SYMLINK -> symlink; ?SSH_FILEXFER_TYPE_SPECIAL -> special; ?SSH_FILEXFER_TYPE_UNKNOWN -> other; % unknown
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?