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 + -
显示快捷键?