4343 open_file_dir_v6 /1 ,
4444 read_dir /1 ,
4545 read_file /1 ,
46+ max_path /1 ,
4647 real_path /1 ,
4748 relative_path /1 ,
4849 relpath /1 ,
7273-define (REG_ATTERS , <<0 ,0 ,0 ,0 ,1 >>).
7374-define (UNIX_EPOCH , 62167219200 ).
7475-define (MAX_HANDLES , 10 ).
76+ -define (MAX_PATH , 200 ).
7577-define (is_set (F , Bits ), ((F ) band (Bits )) == (F )).
7678
7779% %--------------------------------------------------------------------
@@ -85,6 +87,7 @@ all() ->
8587 [open_close_file ,
8688 open_close_dir ,
8789 read_file ,
90+ max_path ,
8891 read_dir ,
8992 write_file ,
9093 rename_file ,
@@ -178,7 +181,9 @@ init_per_testcase(TestCase, Config) ->
178181 {sftpd_vsn , 6 }])],
179182 ssh :daemon (0 , [{subsystems , SubSystems }|Options ]);
180183 _ ->
181- SubSystems = [ssh_sftpd :subsystem_spec ([{max_handles , ? MAX_HANDLES }])],
184+ SubSystems = [ssh_sftpd :subsystem_spec (
185+ [{max_handles , ? MAX_HANDLES },
186+ {max_path , ? MAX_PATH }])],
182187 ssh :daemon (0 , [{subsystems , SubSystems }|Options ])
183188 end ,
184189
@@ -334,6 +339,24 @@ read_file(Config) when is_list(Config) ->
334339 ct :log (" Message: ~s " , [Msg ]),
335340 ok .
336341
342+ % %--------------------------------------------------------------------
343+ max_path (Config ) when is_list (Config ) ->
344+ PrivDir = proplists :get_value (priv_dir , Config ),
345+ FileName = filename :join (PrivDir , " test.txt" ),
346+ {Cm , Channel } = proplists :get_value (sftp , Config ),
347+ % % verify max_path limit
348+ LongFileName =
349+ filename :join (PrivDir ,
350+ " t" ++ lists :flatten (lists :duplicate (? MAX_PATH , " e" )) ++ " st.txt" ),
351+ {ok , _ } = file :copy (FileName , LongFileName ),
352+ ReqId1 = req_id (),
353+ {ok , <<? SSH_FXP_STATUS , ? UINT32 (ReqId1 ), ? UINT32 (? SSH_FX_NO_SUCH_PATH ),
354+ _ /binary >>, _ } =
355+ open_file (LongFileName , Cm , Channel , ReqId1 ,
356+ ? ACE4_READ_DATA bor ? ACE4_READ_ATTRIBUTES ,
357+ ? SSH_FXF_OPEN_EXISTING ).
358+
359+ % %--------------------------------------------------------------------
337360read_dir (Config ) when is_list (Config ) ->
338361 PrivDir = proplists :get_value (priv_dir , Config ),
339362 {Cm , Channel } = proplists :get_value (sftp , Config ),
@@ -397,35 +420,33 @@ rename_file(Config) when is_list(Config) ->
397420 PrivDir = proplists :get_value (priv_dir , Config ),
398421 FileName = filename :join (PrivDir , " test.txt" ),
399422 NewFileName = filename :join (PrivDir , " test1.txt" ),
400- ReqId = 0 ,
423+ LongFileName =
424+ filename :join (PrivDir ,
425+ " t" ++ lists :flatten (lists :duplicate (? MAX_PATH , " e" )) ++ " st.txt" ),
401426 {Cm , Channel } = proplists :get_value (sftp , Config ),
402-
403- {ok , <<? SSH_FXP_STATUS , ? UINT32 (ReqId ),
404- ? UINT32 (? SSH_FX_OK ), _ /binary >>, _ } =
405- rename (FileName , NewFileName , Cm , Channel , ReqId , 6 , 0 ),
406-
407- NewReqId = ReqId + 1 ,
408-
409- {ok , <<? SSH_FXP_STATUS , ? UINT32 (NewReqId ),
410- ? UINT32 (? SSH_FX_OK ), _ /binary >>, _ } =
411- rename (NewFileName , FileName , Cm , Channel , NewReqId , 6 ,
412- ? SSH_FXP_RENAME_OVERWRITE ),
413-
414- NewReqId1 = NewReqId + 1 ,
415- file :copy (FileName , NewFileName ),
416-
417- % % No overwrite
418- {ok , <<? SSH_FXP_STATUS , ? UINT32 (NewReqId1 ),
419- ? UINT32 (? SSH_FX_FILE_ALREADY_EXISTS ), _ /binary >>, _ } =
420- rename (FileName , NewFileName , Cm , Channel , NewReqId1 , 6 ,
421- ? SSH_FXP_RENAME_NATIVE ),
422-
423- NewReqId2 = NewReqId1 + 1 ,
424-
425- {ok , <<? SSH_FXP_STATUS , ? UINT32 (NewReqId2 ),
426- ? UINT32 (? SSH_FX_OP_UNSUPPORTED ), _ /binary >>, _ } =
427- rename (FileName , NewFileName , Cm , Channel , NewReqId2 , 6 ,
428- ? SSH_FXP_RENAME_ATOMIC ).
427+ Version = 6 ,
428+ [begin
429+ case Action of
430+ {Code , AFile , BFile , Flags } ->
431+ ReqId = req_id (),
432+ ct :log (" ReqId = ~p ,~n Code = ~p ,~n AFile = ~p ,~n BFile = ~p ,~n Flags = ~p " ,
433+ [ReqId , Code , AFile , BFile , Flags ]),
434+ {ok , <<? SSH_FXP_STATUS , ? UINT32 (ReqId ), ? UINT32 (Code ), _ /binary >>, _ } =
435+ rename (AFile , BFile , Cm , Channel , ReqId , Version , Flags );
436+ {file_copy , AFile , BFile } ->
437+ {ok , _ } = file :copy (AFile , BFile )
438+ end
439+ end ||
440+ Action <-
441+ [{? SSH_FX_OK , FileName , NewFileName , 0 },
442+ {? SSH_FX_OK , NewFileName , FileName , ? SSH_FXP_RENAME_OVERWRITE },
443+ {file_copy , FileName , NewFileName },
444+ % % no overwrite
445+ {? SSH_FX_FILE_ALREADY_EXISTS , FileName , NewFileName , ? SSH_FXP_RENAME_NATIVE },
446+ {? SSH_FX_OP_UNSUPPORTED , FileName , NewFileName , ? SSH_FXP_RENAME_ATOMIC },
447+ % % max_path
448+ {? SSH_FX_NO_SUCH_PATH , FileName , LongFileName , 0 }]],
449+ ok .
429450
430451% %--------------------------------------------------------------------
431452mk_rm_dir (Config ) when is_list (Config ) ->
0 commit comments