mirror of https://github.com/pkg/sftp.git
commit
ae8947fdf9
12
client.go
12
client.go
|
@ -655,14 +655,18 @@ func (c *Client) Join(elem ...string) string { return path.Join(elem...) }
|
|||
// is not empty.
|
||||
func (c *Client) Remove(path string) error {
|
||||
err := c.removeFile(path)
|
||||
if err, ok := err.(*StatusError); ok {
|
||||
switch err.Code {
|
||||
// some servers, *cough* osx *cough*, return EPERM, not ENODIR.
|
||||
// serv-u returns ssh_FX_FILE_IS_A_DIRECTORY
|
||||
case sshFxPermissionDenied, sshFxFailure, sshFxFileIsADirectory:
|
||||
// EPERM is converted to os.ErrPermission so it is not a StatusError
|
||||
if err, ok := err.(*StatusError); ok {
|
||||
switch err.Code {
|
||||
case sshFxFailure, sshFxFileIsADirectory:
|
||||
return c.RemoveDirectory(path)
|
||||
}
|
||||
}
|
||||
if os.IsPermission(err) {
|
||||
return c.RemoveDirectory(path)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
|
@ -1363,6 +1367,8 @@ func normaliseError(err error) error {
|
|||
return io.EOF
|
||||
case sshFxNoSuchFile:
|
||||
return os.ErrNotExist
|
||||
case sshFxPermissionDenied:
|
||||
return os.ErrPermission
|
||||
case sshFxOk:
|
||||
return nil
|
||||
default:
|
||||
|
|
|
@ -453,16 +453,13 @@ func TestClientCreateFailed(t *testing.T) {
|
|||
defer sftp.Close()
|
||||
|
||||
f, err := ioutil.TempFile("", "sftptest-createfailed")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
require.NoError(t, err)
|
||||
|
||||
defer f.Close()
|
||||
defer os.Remove(f.Name())
|
||||
|
||||
f2, err := sftp.Create(f.Name())
|
||||
if err1, ok := err.(*StatusError); !ok || err1.Code != sshFxPermissionDenied {
|
||||
t.Fatalf("Create: want: %v, got %#v", sshFxPermissionDenied, err)
|
||||
}
|
||||
require.True(t, os.IsPermission(err))
|
||||
if err == nil {
|
||||
f2.Close()
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue