misc.go 2.11 KB
Newer Older
1
// Random odds and ends.
Han-Wen Nienhuys's avatar
Han-Wen Nienhuys committed
2 3 4 5

package fuse

import (
6
	"flag"
Han-Wen Nienhuys's avatar
Han-Wen Nienhuys committed
7
	"fmt"
8
	"log"
9
	"os"
10
	"reflect"
11
	"strings"
12
	"syscall"
13
	"time"
14
	"unsafe"
Han-Wen Nienhuys's avatar
Han-Wen Nienhuys committed
15 16
)

17
func (code Status) String() string {
Han-Wen Nienhuys's avatar
Han-Wen Nienhuys committed
18 19 20 21 22 23 24
	if code <= 0 {
		return []string{
			"OK",
			"NOTIFY_POLL",
			"NOTIFY_INVAL_INODE",
			"NOTIFY_INVAL_ENTRY",
		}[-code]
25
	}
26
	return fmt.Sprintf("%d=%v", int(code), syscall.Errno(code))
27 28
}

Han-Wen Nienhuys's avatar
Han-Wen Nienhuys committed
29 30 31 32
func (code Status) Ok() bool {
	return code == OK
}

33 34
// Convert error back to Errno based errors.
func ToStatus(err error) Status {
35 36
	switch err {
	case nil:
Han-Wen Nienhuys's avatar
Han-Wen Nienhuys committed
37
		return OK
38 39 40 41 42 43 44 45
	case os.ErrPermission:
		return EPERM
	case os.ErrExist:
		return Status(syscall.EEXIST)
	case os.ErrNotExist:
		return ENOENT
	case os.ErrInvalid:
		return EINVAL
Han-Wen Nienhuys's avatar
Han-Wen Nienhuys committed
46
	}
47
	
Han-Wen Nienhuys's avatar
Han-Wen Nienhuys committed
48 49 50 51
	switch t := err.(type) {
	case syscall.Errno:
		return Status(t)
	case *os.SyscallError:
52
		return Status(t.Err.(syscall.Errno))
Han-Wen Nienhuys's avatar
Han-Wen Nienhuys committed
53 54 55 56 57 58 59
	case *os.PathError:
		return ToStatus(t.Err)
	case *os.LinkError:
		return ToStatus(t.Err)
	}
	log.Println("can't convert error type:", err)
	return ENOSYS
Han-Wen Nienhuys's avatar
Han-Wen Nienhuys committed
60 61
}

62 63 64 65
func splitDuration(dt time.Duration, secs *uint64, nsecs *uint32) {
	ns := int64(dt)
	*nsecs = uint32(ns % 1e9)
	*secs = uint64(ns / 1e9)
66
}
67

68 69 70
func ModeToType(mode uint32) uint32 {
	return (mode & 0170000) >> 12
}
71

72
func CheckSuccess(e error) {
73
	if e != nil {
74
		log.Panicf("Unexpected error: %v", e)
75 76 77
	}
}

78
// Thanks to Andrew Gerrand for this hack.
Han-Wen Nienhuys's avatar
Han-Wen Nienhuys committed
79 80
func asSlice(ptr unsafe.Pointer, byteCount uintptr) []byte {
	h := &reflect.SliceHeader{uintptr(ptr), int(byteCount), int(byteCount)}
81 82
	return *(*[]byte)(unsafe.Pointer(h))
}
Han-Wen Nienhuys's avatar
Han-Wen Nienhuys committed
83

84
func Version() string {
85 86 87 88
	if version != nil {
		return *version
	}
	return "unknown"
89
}
90 91 92 93 94 95 96 97 98 99 100

func ReverseJoin(rev_components []string, sep string) string {
	components := make([]string, len(rev_components))
	for i, v := range rev_components {
		components[len(rev_components)-i-1] = v
	}
	return strings.Join(components, sep)
}

func CurrentOwner() *Owner {
	return &Owner{
Han-Wen Nienhuys's avatar
Han-Wen Nienhuys committed
101 102
		Uid: uint32(os.Getuid()),
		Gid: uint32(os.Getgid()),
103 104
	}
}
105 106 107 108 109

func VerboseTest() bool {
	flag := flag.Lookup("test.v")
	return flag != nil && flag.Value.String() == "true"
}
110

Han-Wen Nienhuys's avatar
Han-Wen Nienhuys committed
111 112 113
func init() {
	p := syscall.Getpagesize()
	if p != PAGESIZE {
Han-Wen Nienhuys's avatar
Han-Wen Nienhuys committed
114
		log.Panicf("page size incorrect: %d", p)
Han-Wen Nienhuys's avatar
Han-Wen Nienhuys committed
115 116
	}
}