summaryrefslogtreecommitdiff
path: root/internal/io/fs/permissions/permission_linuxacl.go
diff options
context:
space:
mode:
authorPaul Buetow <git@mx.buetow.org>2020-12-29 08:34:04 +0000
committerPaul Buetow <git@mx.buetow.org>2020-12-29 08:34:04 +0000
commit0099a7ab9e1d28300c69c3b50b4ebe1cde9a8cbc (patch)
treec9f0dfa884927079de309b68c48224f4b0f00d0d /internal/io/fs/permissions/permission_linuxacl.go
parentcab8f9f1e1576dbe42b6e88a5c9c3d14b00d9a37 (diff)
Make Linux ACL support optional, as it requires CGo and makes the binary less portable
Diffstat (limited to 'internal/io/fs/permissions/permission_linuxacl.go')
-rw-r--r--internal/io/fs/permissions/permission_linuxacl.go35
1 files changed, 35 insertions, 0 deletions
diff --git a/internal/io/fs/permissions/permission_linuxacl.go b/internal/io/fs/permissions/permission_linuxacl.go
new file mode 100644
index 0000000..7d2d7ca
--- /dev/null
+++ b/internal/io/fs/permissions/permission_linuxacl.go
@@ -0,0 +1,35 @@
+// +build linuxacl
+
+package permissions
+
+/*
+#include "permission_linuxacl.h"
+#cgo LDFLAGS: -L. -lacl
+*/
+import "C"
+
+import (
+ "errors"
+ "unsafe"
+)
+
+// ToRead checks whether user has Linux file system permissions to read a given file.
+func ToRead(user, filePath string) (bool, error) {
+ cUser := C.CString(user)
+ cFilePath := C.CString(filePath)
+
+ defer C.free(unsafe.Pointer(cUser))
+ defer C.free(unsafe.Pointer(cFilePath))
+
+ cOk, err := C.permission_to_read(cUser, cFilePath)
+ if cOk == 1 {
+ return true, nil
+ }
+
+ if err != nil {
+ // err contains errno message
+ return false, err
+ }
+
+ return false, errors.New("User without permission to read file")
+}