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 ,
7170-define (SSH_TIMEOUT , 5000 ).
7271-define (REG_ATTERS , <<0 ,0 ,0 ,0 ,1 >>).
7372-define (UNIX_EPOCH , 62167219200 ).
74-
75- -define (is_set (F , Bits ),
76- ((F ) band (Bits )) == (F )).
73+ -define (MAX_HANDLES , 10 ).
74+ -define (is_set (F , Bits ), ((F ) band (Bits )) == (F )).
7775
7876% %--------------------------------------------------------------------
7977% % Common Test interface functions -----------------------------------
@@ -97,8 +95,7 @@ all() ->
9795 links ,
9896 ver3_rename ,
9997 ver3_open_flags ,
100- relpath ,
101- sshd_read_file ,
98+ relpath ,
10299 ver6_basic ,
103100 access_outside_root ,
104101 root_with_cwd ,
@@ -180,7 +177,7 @@ init_per_testcase(TestCase, Config) ->
180177 {sftpd_vsn , 6 }])],
181178 ssh :daemon (0 , [{subsystems , SubSystems }|Options ]);
182179 _ ->
183- SubSystems = [ssh_sftpd :subsystem_spec ([])],
180+ SubSystems = [ssh_sftpd :subsystem_spec ([{ max_handles , ? MAX_HANDLES } ])],
184181 ssh :daemon (0 , [{subsystems , SubSystems }|Options ])
185182 end ,
186183
@@ -316,33 +313,44 @@ open_close_dir(Config) when is_list(Config) ->
316313read_file (Config ) when is_list (Config ) ->
317314 PrivDir = proplists :get_value (priv_dir , Config ),
318315 FileName = filename :join (PrivDir , " test.txt" ),
316+ {Cm , Channel } = proplists :get_value (sftp , Config ),
317+ [begin
318+ R1 = req_id (),
319+ {ok , <<? SSH_FXP_HANDLE , ? UINT32 (R1 ), Handle /binary >>, _ } =
320+ open_file (FileName , Cm , Channel , R1 , ? ACE4_READ_DATA bor ? ACE4_READ_ATTRIBUTES ,
321+ ? SSH_FXF_OPEN_EXISTING ),
322+ R2 = req_id (),
323+ {ok , <<? SSH_FXP_DATA , ? UINT32 (R2 ), ? UINT32 (_Length ), Data /binary >>, _ } =
324+ read_file (Handle , 100 , 0 , Cm , Channel , R2 ),
325+ {ok , Data } = file :read_file (FileName )
326+ end || _I <- lists :seq (0 , ? MAX_HANDLES - 1 )],
327+ ReqId = req_id (),
328+ {ok , <<? SSH_FXP_STATUS , ? UINT32 (ReqId ), ? UINT32 (? SSH_FX_FAILURE ),
329+ ? UINT32 (MsgLen ), Msg :MsgLen /binary ,
330+ ? UINT32 (LangTagLen ), _LangTag :LangTagLen /binary >>, _ } =
331+ open_file (FileName , Cm , Channel , ReqId , ? ACE4_READ_DATA bor ? ACE4_READ_ATTRIBUTES ,
332+ ? SSH_FXF_OPEN_EXISTING ),
333+ ct :log (" Message: ~s " , [Msg ]),
334+ ok .
319335
320- ReqId = 0 ,
321- {Cm , Channel } = proplists :get_value (sftp , Config ),
322-
323- {ok , <<? SSH_FXP_HANDLE , ? UINT32 (ReqId ), Handle /binary >>, _ } =
324- open_file (FileName , Cm , Channel , ReqId ,
325- ? ACE4_READ_DATA bor ? ACE4_READ_ATTRIBUTES ,
326- ? SSH_FXF_OPEN_EXISTING ),
327-
328- NewReqId = 1 ,
329-
330- {ok , <<? SSH_FXP_DATA , ? UINT32 (NewReqId ), ? UINT32 (_Length ),
331- Data /binary >>, _ } =
332- read_file (Handle , 100 , 0 , Cm , Channel , NewReqId ),
333-
334- {ok , Data } = file :read_file (FileName ).
335-
336- % %--------------------------------------------------------------------
337336read_dir (Config ) when is_list (Config ) ->
338337 PrivDir = proplists :get_value (priv_dir , Config ),
339338 {Cm , Channel } = proplists :get_value (sftp , Config ),
340- ReqId = 0 ,
341- {ok , <<? SSH_FXP_HANDLE , ? UINT32 (ReqId ), Handle /binary >>, _ } =
342- open_dir (PrivDir , Cm , Channel , ReqId ),
343- ok = read_dir (Handle , Cm , Channel , ReqId ).
339+ [begin
340+ R1 = req_id (),
341+ {ok , <<? SSH_FXP_HANDLE , ? UINT32 (R1 ), Handle /binary >>, _ } =
342+ open_dir (PrivDir , Cm , Channel , R1 ),
343+ R2 = req_id (),
344+ ok = read_dir (Handle , Cm , Channel , R2 )
345+ end || _I <- lists :seq (0 , ? MAX_HANDLES - 1 )],
346+ ReqId = req_id (),
347+ {ok , <<? SSH_FXP_STATUS , ? UINT32 (ReqId ), ? UINT32 (? SSH_FX_FAILURE ),
348+ ? UINT32 (MsgLen ), Msg :MsgLen /binary ,
349+ ? UINT32 (LangTagLen ), _LangTag :LangTagLen /binary >>, _ } =
350+ open_dir (PrivDir , Cm , Channel , ReqId ),
351+ ct :log (" Message: ~s " , [Msg ]),
352+ ok .
344353
345- % %--------------------------------------------------------------------
346354write_file (Config ) when is_list (Config ) ->
347355 PrivDir = proplists :get_value (priv_dir , Config ),
348356 FileName = filename :join (PrivDir , " test.txt" ),
@@ -644,27 +652,6 @@ relpath(Config) when is_list(Config) ->
644652 Root = Path
645653 end .
646654
647- % %--------------------------------------------------------------------
648- sshd_read_file (Config ) when is_list (Config ) ->
649- PrivDir = proplists :get_value (priv_dir , Config ),
650- FileName = filename :join (PrivDir , " test.txt" ),
651-
652- ReqId = 0 ,
653- {Cm , Channel } = proplists :get_value (sftp , Config ),
654-
655- {ok , <<? SSH_FXP_HANDLE , ? UINT32 (ReqId ), Handle /binary >>, _ } =
656- open_file (FileName , Cm , Channel , ReqId ,
657- ? ACE4_READ_DATA bor ? ACE4_READ_ATTRIBUTES ,
658- ? SSH_FXF_OPEN_EXISTING ),
659-
660- NewReqId = 1 ,
661-
662- {ok , <<? SSH_FXP_DATA , ? UINT32 (NewReqId ), ? UINT32 (_Length ),
663- Data /binary >>, _ } =
664- read_file (Handle , 100 , 0 , Cm , Channel , NewReqId ),
665-
666- {ok , Data } = file :read_file (FileName ).
667- % %--------------------------------------------------------------------
668655ver6_basic (Config ) when is_list (Config ) ->
669656 PrivDir = proplists :get_value (priv_dir , Config ),
670657 % FileName = filename:join(PrivDir, "test.txt"),
@@ -1078,3 +1065,12 @@ encode_file_type(Type) ->
10781065
10791066not_default_permissions () ->
10801067 8#600 . % % User read-write-only
1068+
1069+ req_id () ->
1070+ ReqId =
1071+ case get (req_id ) of
1072+ undefined -> 0 ;
1073+ I -> I
1074+ end ,
1075+ put (req_id , ReqId + 1 ),
1076+ ReqId .
0 commit comments