[mqtt] Implements mqtt publish tooling
This commit is contained in:
		
							
								
								
									
										3
									
								
								vendor/github.com/containerd/continuity/sysx/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/containerd/continuity/sysx/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
This package is for internal use only. It is intended to only have
 | 
			
		||||
temporary changes before they are upstreamed to golang.org/x/sys/
 | 
			
		||||
(a.k.a. https://github.com/golang/sys).
 | 
			
		||||
							
								
								
									
										128
									
								
								vendor/github.com/containerd/continuity/sysx/file_posix.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								vendor/github.com/containerd/continuity/sysx/file_posix.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,128 @@
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The containerd Authors.
 | 
			
		||||
 | 
			
		||||
   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 sysx
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"os"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
 | 
			
		||||
	"github.com/containerd/continuity/syscallx"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Readlink returns the destination of the named symbolic link.
 | 
			
		||||
// If there is an error, it will be of type *PathError.
 | 
			
		||||
func Readlink(name string) (string, error) {
 | 
			
		||||
	for len := 128; ; len *= 2 {
 | 
			
		||||
		b := make([]byte, len)
 | 
			
		||||
		n, e := fixCount(syscallx.Readlink(fixLongPath(name), b))
 | 
			
		||||
		if e != nil {
 | 
			
		||||
			return "", &os.PathError{Op: "readlink", Path: name, Err: e}
 | 
			
		||||
		}
 | 
			
		||||
		if n < len {
 | 
			
		||||
			return string(b[0:n]), nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Many functions in package syscall return a count of -1 instead of 0.
 | 
			
		||||
// Using fixCount(call()) instead of call() corrects the count.
 | 
			
		||||
func fixCount(n int, err error) (int, error) {
 | 
			
		||||
	if n < 0 {
 | 
			
		||||
		n = 0
 | 
			
		||||
	}
 | 
			
		||||
	return n, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// fixLongPath returns the extended-length (\\?\-prefixed) form of
 | 
			
		||||
// path when needed, in order to avoid the default 260 character file
 | 
			
		||||
// path limit imposed by Windows. If path is not easily converted to
 | 
			
		||||
// the extended-length form (for example, if path is a relative path
 | 
			
		||||
// or contains .. elements), or is short enough, fixLongPath returns
 | 
			
		||||
// path unmodified.
 | 
			
		||||
//
 | 
			
		||||
// See https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx#maxpath
 | 
			
		||||
func fixLongPath(path string) string {
 | 
			
		||||
	// Do nothing (and don't allocate) if the path is "short".
 | 
			
		||||
	// Empirically (at least on the Windows Server 2013 builder),
 | 
			
		||||
	// the kernel is arbitrarily okay with < 248 bytes. That
 | 
			
		||||
	// matches what the docs above say:
 | 
			
		||||
	// "When using an API to create a directory, the specified
 | 
			
		||||
	// path cannot be so long that you cannot append an 8.3 file
 | 
			
		||||
	// name (that is, the directory name cannot exceed MAX_PATH
 | 
			
		||||
	// minus 12)." Since MAX_PATH is 260, 260 - 12 = 248.
 | 
			
		||||
	//
 | 
			
		||||
	// The MSDN docs appear to say that a normal path that is 248 bytes long
 | 
			
		||||
	// will work; empirically the path must be less then 248 bytes long.
 | 
			
		||||
	if len(path) < 248 {
 | 
			
		||||
		// Don't fix. (This is how Go 1.7 and earlier worked,
 | 
			
		||||
		// not automatically generating the \\?\ form)
 | 
			
		||||
		return path
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// The extended form begins with \\?\, as in
 | 
			
		||||
	// \\?\c:\windows\foo.txt or \\?\UNC\server\share\foo.txt.
 | 
			
		||||
	// The extended form disables evaluation of . and .. path
 | 
			
		||||
	// elements and disables the interpretation of / as equivalent
 | 
			
		||||
	// to \. The conversion here rewrites / to \ and elides
 | 
			
		||||
	// . elements as well as trailing or duplicate separators. For
 | 
			
		||||
	// simplicity it avoids the conversion entirely for relative
 | 
			
		||||
	// paths or paths containing .. elements. For now,
 | 
			
		||||
	// \\server\share paths are not converted to
 | 
			
		||||
	// \\?\UNC\server\share paths because the rules for doing so
 | 
			
		||||
	// are less well-specified.
 | 
			
		||||
	if len(path) >= 2 && path[:2] == `\\` {
 | 
			
		||||
		// Don't canonicalize UNC paths.
 | 
			
		||||
		return path
 | 
			
		||||
	}
 | 
			
		||||
	if !filepath.IsAbs(path) {
 | 
			
		||||
		// Relative path
 | 
			
		||||
		return path
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	const prefix = `\\?`
 | 
			
		||||
 | 
			
		||||
	pathbuf := make([]byte, len(prefix)+len(path)+len(`\`))
 | 
			
		||||
	copy(pathbuf, prefix)
 | 
			
		||||
	n := len(path)
 | 
			
		||||
	r, w := 0, len(prefix)
 | 
			
		||||
	for r < n {
 | 
			
		||||
		switch {
 | 
			
		||||
		case os.IsPathSeparator(path[r]):
 | 
			
		||||
			// empty block
 | 
			
		||||
			r++
 | 
			
		||||
		case path[r] == '.' && (r+1 == n || os.IsPathSeparator(path[r+1])):
 | 
			
		||||
			// /./
 | 
			
		||||
			r++
 | 
			
		||||
		case r+1 < n && path[r] == '.' && path[r+1] == '.' && (r+2 == n || os.IsPathSeparator(path[r+2])):
 | 
			
		||||
			// /../ is currently unhandled
 | 
			
		||||
			return path
 | 
			
		||||
		default:
 | 
			
		||||
			pathbuf[w] = '\\'
 | 
			
		||||
			w++
 | 
			
		||||
			for ; r < n && !os.IsPathSeparator(path[r]); r++ {
 | 
			
		||||
				pathbuf[w] = path[r]
 | 
			
		||||
				w++
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	// A drive's root directory needs a trailing \
 | 
			
		||||
	if w == len(`\\?\c:`) {
 | 
			
		||||
		pathbuf[w] = '\\'
 | 
			
		||||
		w++
 | 
			
		||||
	}
 | 
			
		||||
	return string(pathbuf[:w])
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										52
									
								
								vendor/github.com/containerd/continuity/sysx/generate.sh
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								vendor/github.com/containerd/continuity/sysx/generate.sh
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,52 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
#   Copyright The containerd Authors.
 | 
			
		||||
 | 
			
		||||
#   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.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
set -e
 | 
			
		||||
 | 
			
		||||
mksyscall="$(go env GOROOT)/src/syscall/mksyscall.pl"
 | 
			
		||||
 | 
			
		||||
fix() {
 | 
			
		||||
	sed 's,^package syscall$,package sysx,' \
 | 
			
		||||
		| sed 's,^import "unsafe"$,import (\n\t"syscall"\n\t"unsafe"\n),' \
 | 
			
		||||
		| gofmt -r='BytePtrFromString -> syscall.BytePtrFromString' \
 | 
			
		||||
		| gofmt -r='Syscall6 -> syscall.Syscall6' \
 | 
			
		||||
		| gofmt -r='Syscall -> syscall.Syscall' \
 | 
			
		||||
		| gofmt -r='SYS_GETXATTR -> syscall.SYS_GETXATTR' \
 | 
			
		||||
		| gofmt -r='SYS_LISTXATTR -> syscall.SYS_LISTXATTR' \
 | 
			
		||||
		| gofmt -r='SYS_SETXATTR -> syscall.SYS_SETXATTR' \
 | 
			
		||||
		| gofmt -r='SYS_REMOVEXATTR -> syscall.SYS_REMOVEXATTR' \
 | 
			
		||||
		| gofmt -r='SYS_LGETXATTR -> syscall.SYS_LGETXATTR' \
 | 
			
		||||
		| gofmt -r='SYS_LLISTXATTR -> syscall.SYS_LLISTXATTR' \
 | 
			
		||||
		| gofmt -r='SYS_LSETXATTR -> syscall.SYS_LSETXATTR' \
 | 
			
		||||
		| gofmt -r='SYS_LREMOVEXATTR -> syscall.SYS_LREMOVEXATTR'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if [ "$GOARCH" == "" ] || [ "$GOOS" == "" ]; then
 | 
			
		||||
	echo "Must specify \$GOARCH and \$GOOS"
 | 
			
		||||
	exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
mkargs=""
 | 
			
		||||
 | 
			
		||||
if [ "$GOARCH" == "386" ] || [ "$GOARCH" == "arm" ]; then
 | 
			
		||||
	mkargs="-l32"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
for f in "$@"; do
 | 
			
		||||
	$mksyscall $mkargs "${f}_${GOOS}.go" | fix > "${f}_${GOOS}_${GOARCH}.go"
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										23
									
								
								vendor/github.com/containerd/continuity/sysx/nodata_linux.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								vendor/github.com/containerd/continuity/sysx/nodata_linux.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The containerd Authors.
 | 
			
		||||
 | 
			
		||||
   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 sysx
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"syscall"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const ENODATA = syscall.ENODATA
 | 
			
		||||
							
								
								
									
										24
									
								
								vendor/github.com/containerd/continuity/sysx/nodata_solaris.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								vendor/github.com/containerd/continuity/sysx/nodata_solaris.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The containerd Authors.
 | 
			
		||||
 | 
			
		||||
   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 sysx
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"syscall"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// This should actually be a set that contains ENOENT and EPERM
 | 
			
		||||
const ENODATA = syscall.ENOENT
 | 
			
		||||
							
								
								
									
										25
									
								
								vendor/github.com/containerd/continuity/sysx/nodata_unix.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								vendor/github.com/containerd/continuity/sysx/nodata_unix.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
			
		||||
// +build darwin freebsd
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The containerd Authors.
 | 
			
		||||
 | 
			
		||||
   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 sysx
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"syscall"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const ENODATA = syscall.ENOATTR
 | 
			
		||||
							
								
								
									
										125
									
								
								vendor/github.com/containerd/continuity/sysx/xattr.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										125
									
								
								vendor/github.com/containerd/continuity/sysx/xattr.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,125 @@
 | 
			
		||||
// +build linux darwin
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The containerd Authors.
 | 
			
		||||
 | 
			
		||||
   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 sysx
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"syscall"
 | 
			
		||||
 | 
			
		||||
	"golang.org/x/sys/unix"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Listxattr calls syscall listxattr and reads all content
 | 
			
		||||
// and returns a string array
 | 
			
		||||
func Listxattr(path string) ([]string, error) {
 | 
			
		||||
	return listxattrAll(path, unix.Listxattr)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Removexattr calls syscall removexattr
 | 
			
		||||
func Removexattr(path string, attr string) (err error) {
 | 
			
		||||
	return unix.Removexattr(path, attr)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Setxattr calls syscall setxattr
 | 
			
		||||
func Setxattr(path string, attr string, data []byte, flags int) (err error) {
 | 
			
		||||
	return unix.Setxattr(path, attr, data, flags)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Getxattr calls syscall getxattr
 | 
			
		||||
func Getxattr(path, attr string) ([]byte, error) {
 | 
			
		||||
	return getxattrAll(path, attr, unix.Getxattr)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// LListxattr lists xattrs, not following symlinks
 | 
			
		||||
func LListxattr(path string) ([]string, error) {
 | 
			
		||||
	return listxattrAll(path, unix.Llistxattr)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// LRemovexattr removes an xattr, not following symlinks
 | 
			
		||||
func LRemovexattr(path string, attr string) (err error) {
 | 
			
		||||
	return unix.Lremovexattr(path, attr)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// LSetxattr sets an xattr, not following symlinks
 | 
			
		||||
func LSetxattr(path string, attr string, data []byte, flags int) (err error) {
 | 
			
		||||
	return unix.Lsetxattr(path, attr, data, flags)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// LGetxattr gets an xattr, not following symlinks
 | 
			
		||||
func LGetxattr(path, attr string) ([]byte, error) {
 | 
			
		||||
	return getxattrAll(path, attr, unix.Lgetxattr)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const defaultXattrBufferSize = 5
 | 
			
		||||
 | 
			
		||||
type listxattrFunc func(path string, dest []byte) (int, error)
 | 
			
		||||
 | 
			
		||||
func listxattrAll(path string, listFunc listxattrFunc) ([]string, error) {
 | 
			
		||||
	var p []byte // nil on first execution
 | 
			
		||||
 | 
			
		||||
	for {
 | 
			
		||||
		n, err := listFunc(path, p) // first call gets buffer size.
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if n > len(p) {
 | 
			
		||||
			p = make([]byte, n)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		p = p[:n]
 | 
			
		||||
 | 
			
		||||
		ps := bytes.Split(bytes.TrimSuffix(p, []byte{0}), []byte{0})
 | 
			
		||||
		var entries []string
 | 
			
		||||
		for _, p := range ps {
 | 
			
		||||
			s := string(p)
 | 
			
		||||
			if s != "" {
 | 
			
		||||
				entries = append(entries, s)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return entries, nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type getxattrFunc func(string, string, []byte) (int, error)
 | 
			
		||||
 | 
			
		||||
func getxattrAll(path, attr string, getFunc getxattrFunc) ([]byte, error) {
 | 
			
		||||
	p := make([]byte, defaultXattrBufferSize)
 | 
			
		||||
	for {
 | 
			
		||||
		n, err := getFunc(path, attr, p)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			if errno, ok := err.(syscall.Errno); ok && errno == syscall.ERANGE {
 | 
			
		||||
				p = make([]byte, len(p)*2) // this can't be ideal.
 | 
			
		||||
				continue                   // try again!
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// realloc to correct size and repeat
 | 
			
		||||
		if n > len(p) {
 | 
			
		||||
			p = make([]byte, n)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return p[:n], nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										67
									
								
								vendor/github.com/containerd/continuity/sysx/xattr_unsupported.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								vendor/github.com/containerd/continuity/sysx/xattr_unsupported.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,67 @@
 | 
			
		||||
// +build !linux,!darwin
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The containerd Authors.
 | 
			
		||||
 | 
			
		||||
   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 sysx
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"runtime"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var unsupported = errors.New("extended attributes unsupported on " + runtime.GOOS)
 | 
			
		||||
 | 
			
		||||
// Listxattr calls syscall listxattr and reads all content
 | 
			
		||||
// and returns a string array
 | 
			
		||||
func Listxattr(path string) ([]string, error) {
 | 
			
		||||
	return []string{}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Removexattr calls syscall removexattr
 | 
			
		||||
func Removexattr(path string, attr string) (err error) {
 | 
			
		||||
	return unsupported
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Setxattr calls syscall setxattr
 | 
			
		||||
func Setxattr(path string, attr string, data []byte, flags int) (err error) {
 | 
			
		||||
	return unsupported
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Getxattr calls syscall getxattr
 | 
			
		||||
func Getxattr(path, attr string) ([]byte, error) {
 | 
			
		||||
	return []byte{}, unsupported
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// LListxattr lists xattrs, not following symlinks
 | 
			
		||||
func LListxattr(path string) ([]string, error) {
 | 
			
		||||
	return []string{}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// LRemovexattr removes an xattr, not following symlinks
 | 
			
		||||
func LRemovexattr(path string, attr string) (err error) {
 | 
			
		||||
	return unsupported
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// LSetxattr sets an xattr, not following symlinks
 | 
			
		||||
func LSetxattr(path string, attr string, data []byte, flags int) (err error) {
 | 
			
		||||
	return unsupported
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// LGetxattr gets an xattr, not following symlinks
 | 
			
		||||
func LGetxattr(path, attr string) ([]byte, error) {
 | 
			
		||||
	return []byte{}, nil
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user