forked from snapcore/snapd
-
Notifications
You must be signed in to change notification settings - Fork 0
/
unlink.go
72 lines (64 loc) · 1.95 KB
/
unlink.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// -*- Mode: Go; indent-tabs-mode: t -*-
/*
* Copyright (C) 2018 Canonical Ltd
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package osutil
import (
"os"
"syscall"
"github.com/snapcore/snapd/osutil/sys"
)
// UnlinkMany removes multiple files from a single directory.
//
// If dirname is not a directory, this will fail.
//
// This will abort at the first removal error (but ENOENT is ignored).
//
// Filenames must refer to files. They don't necessarily have to be
// relative paths to the given dirname, but if they aren't why are you
// using this function?
//
// Errors are *os.PathError, for convenience
func UnlinkMany(dirname string, filenames []string) error {
dirfd, err := syscall.Open(dirname, syscall.O_RDONLY|syscall.O_CLOEXEC|syscall.O_DIRECTORY|sys.O_PATH, 0)
if err != nil {
return &os.PathError{
Op: "open",
Path: dirname,
Err: err,
}
}
defer syscall.Close(dirfd)
return unlinkMany(dirfd, filenames)
}
func unlinkMany(dirfd int, filenames []string) error {
var err error
for _, filename := range filenames {
if err = sysUnlinkat(dirfd, filename); err != nil && err != syscall.ENOENT {
return &os.PathError{
Op: "remove",
Path: filename,
Err: err,
}
}
}
return nil
}
// UnlinkManyAt is like UnlinkMany but takes an open directory *os.File
// instead of a dirname.
func UnlinkManyAt(dir *os.File, filenames []string) error {
return unlinkMany(int(dir.Fd()), filenames)
}