diff --git a/client.go b/client.go index e329ed5..cdd5669 100644 --- a/client.go +++ b/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) + // some servers, *cough* osx *cough*, return EPERM, not ENODIR. + // serv-u returns ssh_FX_FILE_IS_A_DIRECTORY + // EPERM is converted to os.ErrPermission so it is not a StatusError 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: + 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: diff --git a/client_integration_test.go b/client_integration_test.go index eda5d32..caf15cb 100644 --- a/client_integration_test.go +++ b/client_integration_test.go @@ -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() }