5151 retrieve_attributes /1 ,
5252 root_with_cwd /1 ,
5353 set_attributes /1 ,
54- sshd_read_file /1 ,
5554 ver3_open_flags /1 ,
5655 ver3_rename /1 ,
5756 ver6_basic /1 ,
7271-define (SSH_TIMEOUT , 5000 ).
7372-define (REG_ATTERS , <<0 ,0 ,0 ,0 ,1 >>).
7473-define (UNIX_EPOCH , 62167219200 ).
75-
76- -define (is_set (F , Bits ),
77- ((F ) band (Bits )) == (F )).
74+ -define (MAX_HANDLES , 10 ).
75+ -define (is_set (F , Bits ), ((F ) band (Bits )) == (F )).
7876
7977% %--------------------------------------------------------------------
8078% % Common Test interface functions -----------------------------------
@@ -98,8 +96,7 @@ all() ->
9896 links ,
9997 ver3_rename ,
10098 ver3_open_flags ,
101- relpath ,
102- sshd_read_file ,
99+ relpath ,
103100 ver6_basic ,
104101 access_outside_root ,
105102 root_with_cwd ,
@@ -181,7 +178,7 @@ init_per_testcase(TestCase, Config) ->
181178 {sftpd_vsn , 6 }])],
182179 ssh :daemon (0 , [{subsystems , SubSystems }|Options ]);
183180 _ ->
184- SubSystems = [ssh_sftpd :subsystem_spec ([])],
181+ SubSystems = [ssh_sftpd :subsystem_spec ([{ max_handles , ? MAX_HANDLES } ])],
185182 ssh :daemon (0 , [{subsystems , SubSystems }|Options ])
186183 end ,
187184
@@ -317,33 +314,44 @@ open_close_dir(Config) when is_list(Config) ->
317314read_file (Config ) when is_list (Config ) ->
318315 PrivDir = proplists :get_value (priv_dir , Config ),
319316 FileName = filename :join (PrivDir , " test.txt" ),
317+ {Cm , Channel } = proplists :get_value (sftp , Config ),
318+ [begin
319+ R1 = req_id (),
320+ {ok , <<? SSH_FXP_HANDLE , ? UINT32 (R1 ), Handle /binary >>, _ } =
321+ open_file (FileName , Cm , Channel , R1 , ? ACE4_READ_DATA bor ? ACE4_READ_ATTRIBUTES ,
322+ ? SSH_FXF_OPEN_EXISTING ),
323+ R2 = req_id (),
324+ {ok , <<? SSH_FXP_DATA , ? UINT32 (R2 ), ? UINT32 (_Length ), Data /binary >>, _ } =
325+ read_file (Handle , 100 , 0 , Cm , Channel , R2 ),
326+ {ok , Data } = file :read_file (FileName )
327+ end || _I <- lists :seq (0 , ? MAX_HANDLES - 1 )],
328+ ReqId = req_id (),
329+ {ok , <<? SSH_FXP_STATUS , ? UINT32 (ReqId ), ? UINT32 (? SSH_FX_FAILURE ),
330+ ? UINT32 (MsgLen ), Msg :MsgLen /binary ,
331+ ? UINT32 (LangTagLen ), _LangTag :LangTagLen /binary >>, _ } =
332+ open_file (FileName , Cm , Channel , ReqId , ? ACE4_READ_DATA bor ? ACE4_READ_ATTRIBUTES ,
333+ ? SSH_FXF_OPEN_EXISTING ),
334+ ct :log (" Message: ~s " , [Msg ]),
335+ ok .
320336
321- ReqId = 0 ,
322- {Cm , Channel } = proplists :get_value (sftp , Config ),
323-
324- {ok , <<? SSH_FXP_HANDLE , ? UINT32 (ReqId ), Handle /binary >>, _ } =
325- open_file (FileName , Cm , Channel , ReqId ,
326- ? ACE4_READ_DATA bor ? ACE4_READ_ATTRIBUTES ,
327- ? SSH_FXF_OPEN_EXISTING ),
328-
329- NewReqId = 1 ,
330-
331- {ok , <<? SSH_FXP_DATA , ? UINT32 (NewReqId ), ? UINT32 (_Length ),
332- Data /binary >>, _ } =
333- read_file (Handle , 100 , 0 , Cm , Channel , NewReqId ),
334-
335- {ok , Data } = file :read_file (FileName ).
336-
337- % %--------------------------------------------------------------------
338337read_dir (Config ) when is_list (Config ) ->
339338 PrivDir = proplists :get_value (priv_dir , Config ),
340339 {Cm , Channel } = proplists :get_value (sftp , Config ),
341- ReqId = 0 ,
342- {ok , <<? SSH_FXP_HANDLE , ? UINT32 (ReqId ), Handle /binary >>, _ } =
343- open_dir (PrivDir , Cm , Channel , ReqId ),
344- ok = read_dir (Handle , Cm , Channel , ReqId ).
340+ [begin
341+ R1 = req_id (),
342+ {ok , <<? SSH_FXP_HANDLE , ? UINT32 (R1 ), Handle /binary >>, _ } =
343+ open_dir (PrivDir , Cm , Channel , R1 ),
344+ R2 = req_id (),
345+ ok = read_dir (Handle , Cm , Channel , R2 )
346+ end || _I <- lists :seq (0 , ? MAX_HANDLES - 1 )],
347+ ReqId = req_id (),
348+ {ok , <<? SSH_FXP_STATUS , ? UINT32 (ReqId ), ? UINT32 (? SSH_FX_FAILURE ),
349+ ? UINT32 (MsgLen ), Msg :MsgLen /binary ,
350+ ? UINT32 (LangTagLen ), _LangTag :LangTagLen /binary >>, _ } =
351+ open_dir (PrivDir , Cm , Channel , ReqId ),
352+ ct :log (" Message: ~s " , [Msg ]),
353+ ok .
345354
346- % %--------------------------------------------------------------------
347355write_file (Config ) when is_list (Config ) ->
348356 PrivDir = proplists :get_value (priv_dir , Config ),
349357 FileName = filename :join (PrivDir , " test.txt" ),
@@ -645,27 +653,6 @@ relpath(Config) when is_list(Config) ->
645653 Root = Path
646654 end .
647655
648- % %--------------------------------------------------------------------
649- sshd_read_file (Config ) when is_list (Config ) ->
650- PrivDir = proplists :get_value (priv_dir , Config ),
651- FileName = filename :join (PrivDir , " test.txt" ),
652-
653- ReqId = 0 ,
654- {Cm , Channel } = proplists :get_value (sftp , Config ),
655-
656- {ok , <<? SSH_FXP_HANDLE , ? UINT32 (ReqId ), Handle /binary >>, _ } =
657- open_file (FileName , Cm , Channel , ReqId ,
658- ? ACE4_READ_DATA bor ? ACE4_READ_ATTRIBUTES ,
659- ? SSH_FXF_OPEN_EXISTING ),
660-
661- NewReqId = 1 ,
662-
663- {ok , <<? SSH_FXP_DATA , ? UINT32 (NewReqId ), ? UINT32 (_Length ),
664- Data /binary >>, _ } =
665- read_file (Handle , 100 , 0 , Cm , Channel , NewReqId ),
666-
667- {ok , Data } = file :read_file (FileName ).
668- % %--------------------------------------------------------------------
669656ver6_basic (Config ) when is_list (Config ) ->
670657 PrivDir = proplists :get_value (priv_dir , Config ),
671658 % FileName = filename:join(PrivDir, "test.txt"),
@@ -1087,3 +1074,12 @@ encode_file_type(Type) ->
10871074
10881075not_default_permissions () ->
10891076 8#600 . % % User read-write-only
1077+
1078+ req_id () ->
1079+ ReqId =
1080+ case get (req_id ) of
1081+ undefined -> 0 ;
1082+ I -> I
1083+ end ,
1084+ put (req_id , ReqId + 1 ),
1085+ ReqId .
0 commit comments