commit | 492d80d4d3ca98a570e259ea1e11d123b78b1cfa | [log] [tgz] |
---|---|---|
author | Greg <gco@jazzhaiku.com> | Tue Feb 01 16:46:49 2022 -0800 |
committer | GitHub <noreply@github.com> | Wed Feb 02 01:46:49 2022 +0100 |
tree | 257f26150b233127795af815f33d44469db38be0 | |
parent | 27812d2286ce17bc3588c23aafd6415a83ad3a8a [diff] |
Fix closing file descriptors twice (#62) Closing the fd's in this code after using them to create new os.File objects results in the fd being closed twice with disastrous results in multi-threaded code. os.File already arranges for its finalizer to close the fd. Found via restic tests.
Extended attribute support for Go (linux + darwin + freebsd + netbsd + solaris).
“Extended attributes are name:value pairs associated permanently with files and directories, similar to the environment strings associated with a process. An attribute may be defined or undefined. If it is defined, its value may be empty or non-empty.” See more...
SetWithFlags
allows to additionally pass system flags to be forwarded to the underlying calls. FreeBSD and NetBSD do not support this and the parameter will be ignored.
The L
variants of all functions (LGet/LSet/...
) are identical to Get/Set/...
except that they do not reference a symlink that appears at the end of a path. See GoDoc for details.
const path = "/tmp/myfile" const prefix = "user." if err := xattr.Set(path, prefix+"test", []byte("test-attr-value")); err != nil { log.Fatal(err) } var list []string if list, err = xattr.List(path); err != nil { log.Fatal(err) } var data []byte if data, err = xattr.Get(path, prefix+"test"); err != nil { log.Fatal(err) } if err = xattr.Remove(path, prefix+"test"); err != nil { log.Fatal(err) } // One can also specify the flags parameter to be passed to the OS. if err := xattr.SetWithFlags(path, prefix+"test", []byte("test-attr-value"), xattr.XATTR_CREATE); err != nil { log.Fatal(err) }