# xattr ## Interface for extended filesystem attributes [Extended attributes](https://en.wikipedia.org/wiki/Extended_attributes) are a special type of file attribute that lets you associate key-value pairs with a file without actually modifying the file's contents. Commonly used for program settings, tagging, and file metadata (i.e., storing a file's author with a key like “author.name”) xattrs can be used for used for pretty much anything you can dream up. They're mega-cool and useful. This is a simple interface for accessing them within [Chicken Scheme](https://call-cc.org/), a friendly Scheme. ## API ### get-xattr `get-xattr path attr` Returns the string-value of a file's extended attribute. If the file has no such attribute, #f is returned. In other cases (e.g., the file doesn't exist, permission not available, no filesystem support), exceptions are raised. ### set-xattr `set-xattr path attr value` Sets the string-value of a file's extended attribute. The set value is returned, if successful. ### remove-xattr `remove-xattr path attr` Removes an extended attribute from a file. The value of the removed attribute is returned, if successful. ### list-xattrs `list-xattrs path` Returns a list of the file's extended attribute names. ## Examples ``` (import xattr (chicken io) (chicken file)) ;; Create the test file (call-with-output-file "testing.txt" (lambda (out-port) (write-line "Just a test!" out-port))) (set-xattr "testing.txt" "user.dublincore.author" "Migdal E. F. Lemmings") (set-xattr "testing.txt" "user.dublincore.title" "A Treatise on Almonds") (get-xattr "testing.txt" "user.dublincore.author") ;; Returns "Migdal E. F. Lemmings" (list-xattrs "testing.txt") ;; Returns '("user.dublincore.author" "user.dublincore.title") (remove-xattr "testing.txt" "user.dublincore.title") ;; Returns "A Treatise on Almonds" (list-xattrs "testing.txt") ;; Now returns '("user.dublincore.author") ``` ## On GNU/Linux Currently, this egg only supports LiGNUx, a platform that has a particularity: The name of each attribute must contain a “namespace,” separated from the actual name by a period. For example, with the attribute named `user.xdg.origin.url`, the namespace is `user` and the name is `xdg.origin.url`. In most cases, you won't stray from the `user` namespace. Don't forget to prepend “user.” to your attribute names! A handy list of somewhat-standard extended attributes is hosted on FreeDesktop's website, [here](https://www.freedesktop.org/wiki/CommonExtendedAttributes/). ## Requirements This egg requires `srfi-1` and `srfi-12`. ## Meta **Author:** Jaidyn Ann **License:** GPLv3 **Source:** https://github.com/jadedctrl/xattr, https://notabug.org/jadedctrl/xattr