aboutsummaryrefslogtreecommitdiff
path: root/filesystem/path.go
diff options
context:
space:
mode:
authorJoe Richey joerichey@google.com <joerichey@google.com>2017-05-23 18:45:58 -0700
committerJoe Richey joerichey@google.com <joerichey@google.com>2017-05-31 12:40:13 -0700
commitf4f4f606718497a2f660cdb737b812e035f55311 (patch)
treeb07b963d9b623467986842fa54db9d84470275d5 /filesystem/path.go
parentbc66b8a56ee7ae4f703cf30502aff8b7d68953d0 (diff)
filesystem: creating the directories and files
This commit adds in the filesystem subpackage. The goal of this package is to provide and interface for adding to and removing from the metadata storage for a given filesystem. This is primarily done in filesystem.go. To facilitate this functionality, mountpoint.go exposes an interface for querying the system about the current mounted filesystems and their information. Note that this operation is done with a lazy loading mechanism. To refer to other filesystems, we use link files that can be parsed by libblkid. The README is also updated to account for this new dependancy. This package uses the FSError type under the hood so that error messages will include the filesystem name, but callers can still check for specific error instances. Change-Id: I74fe4e84b8e3a5b73f1337c35307ffe0bf7cdea9
Diffstat (limited to 'filesystem/path.go')
-rw-r--r--filesystem/path.go83
1 files changed, 83 insertions, 0 deletions
diff --git a/filesystem/path.go b/filesystem/path.go
new file mode 100644
index 0000000..3be1859
--- /dev/null
+++ b/filesystem/path.go
@@ -0,0 +1,83 @@
+/*
+ * path.go - Utility functions for dealing with filesystem paths
+ *
+ * Copyright 2017 Google Inc.
+ * Author: Joe Richey (joerichey@google.com)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package filesystem
+
+import (
+ "log"
+ "os"
+ "path/filepath"
+)
+
+// We only check the unix permissions and the sticky bit
+const permMask = os.ModeSticky | os.ModePerm
+
+// cannonicalizePath turns path into an absolute path without symlinks.
+func cannonicalizePath(path string) (string, error) {
+ path, err := filepath.Abs(path)
+ if err != nil {
+ return "", err
+ }
+
+ return filepath.EvalSymlinks(path)
+}
+
+// loggedStat runs os.Stat, but it logs the error if stat returns any error
+// other than nil or IsNotExist.
+func loggedStat(name string) (os.FileInfo, error) {
+ info, err := os.Stat(name)
+ if err != nil && !os.IsNotExist(err) {
+ log.Print(err)
+ }
+ return info, err
+}
+
+// isDir returns true if the path exists and is that of a directory.
+func isDir(path string) bool {
+ info, err := loggedStat(path)
+ return err == nil && info.IsDir()
+}
+
+// isDevice returns true if the path exists and is that of a directory.
+func isDevice(path string) bool {
+ info, err := loggedStat(path)
+ return err == nil && info.Mode()&os.ModeDevice != 0
+}
+
+// isDirCheckPerm returns true if the path exists and is a directory. If the
+// specified permissions and sticky bit of mode do not match the path, and error
+// is logged.
+func isDirCheckPerm(path string, mode os.FileMode) bool {
+ info, err := loggedStat(path)
+ // Check if directory
+ if err != nil || !info.IsDir() {
+ return false
+ }
+ // Check for bad permissions
+ if info.Mode()&permMask != mode&permMask {
+ log.Printf("directory %s has incorrect permissions", path)
+ }
+ return true
+}
+
+// isRegularFile returns true if the path exists and is that of a regular file.
+func isRegularFile(path string) bool {
+ info, err := loggedStat(path)
+ return err == nil && info.Mode().IsRegular()
+}