aboutsummaryrefslogtreecommitdiff
path: root/ext4/feature_flag.go
diff options
context:
space:
mode:
authorJoe Richey joerichey@google.com <joerichey@google.com>2017-10-06 14:25:07 -0700
committerJoseph Richey <joerichey94@gmail.com>2017-10-19 02:22:23 -0700
commitb96f72d63641c8dcfe5e142ecd5d6c9f9a7d5778 (patch)
treebc15a81c4af5cf75dbf3aa6ed7c9d21418b5226f /ext4/feature_flag.go
parent7d16a9fb37b8a6204d76f187444330b8faae4e4e (diff)
ext4: start refactor
Diffstat (limited to 'ext4/feature_flag.go')
-rw-r--r--ext4/feature_flag.go82
1 files changed, 66 insertions, 16 deletions
diff --git a/ext4/feature_flag.go b/ext4/feature_flag.go
index 4c64e0a..4b588d6 100644
--- a/ext4/feature_flag.go
+++ b/ext4/feature_flag.go
@@ -1,3 +1,22 @@
+/*
+ * feature_flag.go - Changes encryption flag for an ext4 filesystem.
+ *
+ * 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 main
/*
@@ -10,27 +29,58 @@ package main
import "C"
import (
"fmt"
- "unsafe"
+
+ "github.com/google/fscrypt/filesystem"
)
-// isExt4EncryptionEnabled returns true if the provided ext4 filesystem (as a
-// path to a device or mountpoint) has the encrypt feature flag enabled.
-func isExt4EncryptionEnabled(path string) bool {
- cPath := C.CString(path)
- defer C.free(unsafe.Pointer(cPath))
+// Ext4Filesystem wraps the C structures returned from libext2fs.
+type Ext4Filesystem struct {
+ ptr C.ext2_filsys
+ mounted bool
+ retVal C.errcode_t
+}
- var fs C.ext2_filsys
- ret := C.ext2fs_open(cPath, 0, 0, 0, C.unix_io_manager, &fs)
- if ret != 0 {
- panic(fmt.Errorf("Got error code %v when opening %s", ret, path))
+// NewExt4Filesystem creates a new Ext4Filesystem from a mountpoint path. Fail
+// if the path is not the mountpoint of an ext4 filesystem or cannot be opened.
+func NewExt4Filesystem(mountpoint string) (*Ext4Filesystem, error) {
+ mount, err := filesystem.FindMount(set.Arg(1))
+ if err != nil {
+ return nil, err
}
+ if mount.Filesystem != "ext4" {
+ err := fmt.Errorf("%q is not an ext4 filesystem (type %q)", mount.Path, mount.Filesystem)
+ return nil, err
+ }
+ if mount.Device == "" {
+ err := fmt.Errorf("underlying device for %q is invalid", mount.Filesystem)
+ return nil, err
+ }
+ return nil, nil
+}
- hasEncryption := C.ext2fs_has_feature_encrypt(fs.super)
- return hasEncryption != 0
+// HasValidBlockSize returns true if the filesystem has the same block size as
+// the system's page size.
+func (fs *Ext4Filesystem) HasValidBlockSize() bool {
+ return true
}
-// enableExt4Encryption enables encryption on the filesystem at the specified
-// path.
+// IsEncryptionEnabled return true if the "encrypt" feature flag is set.
+func (fs *Ext4Filesystem) IsEncryptionEnabled() bool {
+ return C.ext2fs_has_feature_encrypt(fs.ptr.super) != 0
+}
+
+// EnableEncryption sets the "encrypt" feature flag and writes the appropriate
+// information in the superblock to allow filesystem encryption.
+func (fs *Ext4Filesystem) EnableEncryption() error {
+ return nil
+}
-// disableExt4Encryption disables encryption on the filesystem at the specified
-// path. Note that this operation is not supported and can cause data loss.
+// DisableEncryption removes the "encrypt" feature flag.
+func (fs *Ext4Filesystem) DisableEncryption() error {
+ return nil
+}
+
+// Close safely closes, frees, and runs cleanup f9r the filesystem.
+func (fs *Ext4Filesystem) Close() error {
+ return nil
+}