mirror of
				https://github.com/vbatts/tar-split.git
				synced 2025-10-27 00:36:43 +00:00 
			
		
		
		
	xattr: simple wrapper for syscalls
Signed-off-by: Vincent Batts <vbatts@hashbangbash.com>
This commit is contained in:
		
							parent
							
								
									ec1977017d
								
							
						
					
					
						commit
						2d3aea8623
					
				
					 3 changed files with 86 additions and 0 deletions
				
			
		
							
								
								
									
										35
									
								
								xattr/xattr.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								xattr/xattr.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,35 @@ | ||||||
|  | // +build linux | ||||||
|  | 
 | ||||||
|  | package xattr | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"strings" | ||||||
|  | 	"syscall" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Get returns the extended attributes (xattr) on file `path`, for the given `name`. | ||||||
|  | func Get(path, name string) ([]byte, error) { | ||||||
|  | 	dest := make([]byte, 1024) | ||||||
|  | 	i, err := syscall.Getxattr(path, name, dest) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return dest[:i], nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Set sets the extended attributes (xattr) on file `path`, for the given `name` and `value` | ||||||
|  | func Set(path, name string, value []byte) error { | ||||||
|  | 	return syscall.Setxattr(path, name, value, 0) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // List returns a list of all the extended attributes (xattr) for file `path` | ||||||
|  | func List(path string) ([]string, error) { | ||||||
|  | 	dest := make([]byte, 1024) | ||||||
|  | 	i, err := syscall.Listxattr(path, dest) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return strings.Split(strings.TrimRight(string(dest[:i]), nilByte), nilByte), nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | const nilByte = "\x00" | ||||||
							
								
								
									
										38
									
								
								xattr/xattr_test.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								xattr/xattr_test.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,38 @@ | ||||||
|  | package xattr | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"bytes" | ||||||
|  | 	"io/ioutil" | ||||||
|  | 	"os" | ||||||
|  | 	"testing" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func TestXattr(t *testing.T) { | ||||||
|  | 	fh, err := ioutil.TempFile(".", "xattr.") | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Fatal(err) | ||||||
|  | 	} | ||||||
|  | 	defer os.Remove(fh.Name()) | ||||||
|  | 	if err := fh.Close(); err != nil { | ||||||
|  | 		t.Fatal(err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	expected := []byte("1234") | ||||||
|  | 	if err := Set(fh.Name(), "user.testing", expected); err != nil { | ||||||
|  | 		t.Fatal(fh.Name(), err) | ||||||
|  | 	} | ||||||
|  | 	l, err := List(fh.Name()) | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Error(fh.Name(), err) | ||||||
|  | 	} | ||||||
|  | 	if !(len(l) > 0) { | ||||||
|  | 		t.Errorf("%q: expected a list of at least 1; got %d", len(l)) | ||||||
|  | 	} | ||||||
|  | 	got, err := Get(fh.Name(), "user.testing") | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Fatal(fh.Name(), err) | ||||||
|  | 	} | ||||||
|  | 	if !bytes.Equal(got, expected) { | ||||||
|  | 		t.Errorf("%q: expected %q; got %q", fh.Name(), expected, got) | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										13
									
								
								xattr/xattr_unsupported.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								xattr/xattr_unsupported.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,13 @@ | ||||||
|  | // +build !linux | ||||||
|  | 
 | ||||||
|  | package xattr | ||||||
|  | 
 | ||||||
|  | func Get(path, name string) ([]byte, error) { | ||||||
|  | 	return nil, nil | ||||||
|  | } | ||||||
|  | func Set(path, name string, value []byte) error { | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | func List(path string) ([]string, error) { | ||||||
|  | 	return nil, nil | ||||||
|  | } | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue