github.com/docker/docker@v299999999.0.0-20200612211812-aaf470eca7b5+incompatible/pkg/system/xattrs_linux.go (about)

     1  package system // import "github.com/docker/docker/pkg/system"
     2  
     3  import "golang.org/x/sys/unix"
     4  
     5  // Lgetxattr retrieves the value of the extended attribute identified by attr
     6  // and associated with the given path in the file system.
     7  // It will returns a nil slice and nil error if the xattr is not set.
     8  func Lgetxattr(path string, attr string) ([]byte, error) {
     9  	// Start with a 128 length byte array
    10  	dest := make([]byte, 128)
    11  	sz, errno := unix.Lgetxattr(path, attr, dest)
    12  
    13  	for errno == unix.ERANGE {
    14  		// Buffer too small, use zero-sized buffer to get the actual size
    15  		sz, errno = unix.Lgetxattr(path, attr, []byte{})
    16  		if errno != nil {
    17  			return nil, errno
    18  		}
    19  		dest = make([]byte, sz)
    20  		sz, errno = unix.Lgetxattr(path, attr, dest)
    21  	}
    22  
    23  	switch {
    24  	case errno == unix.ENODATA:
    25  		return nil, nil
    26  	case errno != nil:
    27  		return nil, errno
    28  	}
    29  
    30  	return dest[:sz], nil
    31  }
    32  
    33  // Lsetxattr sets the value of the extended attribute identified by attr
    34  // and associated with the given path in the file system.
    35  func Lsetxattr(path string, attr string, data []byte, flags int) error {
    36  	return unix.Lsetxattr(path, attr, data, flags)
    37  }