github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/mounter/mounter_osx.go (about) 1 // Copyright 2015 Keybase, Inc. All rights reserved. Use of 2 // this source code is governed by the included BSD license. 3 4 //go:build darwin 5 // +build darwin 6 7 package mounter 8 9 import ( 10 "regexp" 11 "strings" 12 "syscall" 13 ) 14 15 // IsMounted returns true if directory is mounted (by kbfuse) 16 func IsMounted(dir string, log Log) (bool, error) { 17 mountInfo, err := getMountInfo(dir) 18 if err != nil { 19 return false, err 20 } 21 22 log.Debug("Mount info: %s", mountInfo) 23 if strings.Contains(mountInfo, "@kbfuse") { 24 return true, nil 25 } 26 27 return false, nil 28 } 29 30 // 31 // Below is from bazil/fuse fstestutil 32 // 33 34 var reBackslash = regexp.MustCompile(`\\(.)`) 35 36 // unescapeBackslash removes backslash-escaping. The escaped characters are not 37 // mapped in any way; that is, unescape(`\n` ) == `n`. 38 func unescapeBackslash(s string) string { 39 return reBackslash.ReplaceAllString(s, `$1`) 40 } 41 42 // cstr converts a nil-terminated C string into a Go string 43 func cstr(ca []int8) string { 44 s := make([]byte, 0, len(ca)) 45 for _, c := range ca { 46 if c == 0x00 { 47 break 48 } 49 s = append(s, byte(c)) 50 } 51 return string(s) 52 } 53 54 func getMountInfo(mnt string) (string, error) { 55 var st syscall.Statfs_t 56 err := syscall.Statfs(mnt, &st) 57 if err != nil { 58 return "", err 59 } 60 return unescapeBackslash(cstr(st.Mntfromname[:])), nil 61 }