Für den Zugriff auf Extended Attributes hat macOS die Syscalls listxattr, getxattr, setxattr und removexattr. Sie heißen genauso wie die Linux-Syscalls und funktionieren auch fast genauso, nur haben sie ein paar Parameter für Options mehr. Die Syscalls finden sich im Header sys/xattr.h.
Um den Inhalt eines Attributs zu erhalten, benutzen wir den Syscall getxattr
:
ssize_t
getxattr(const char *path, const char *name, void *value, size_t size,
u_int32_t position,
int options);
Dabei gibt man den Dateipfad, den Namen des Attributs, einen Pointer auf einen Buffer sowie dessen Größe an. Wie im vorherigen Artikel erwähnt, haben macOS Extended Attributes keinen Namespace, daher ist name ein frei wählbarer Name. Mit value und size gibt man einen vorher allozierten Puffer und seine Größe an. Falls value NULL
ist, wird von der Funktion nur die Länge des Inhalts zurück gegeben. Der Parameter position funktioniert nicht mit allen Typen von Attributen und sollte daher 0 sein. Der Parameter options kann abgesehn von 0 noch XATTR_NOFOLLOW
oder XATTR_SHOWCOMPRESSION
sein.
char *buf = malloc(1024);
ssize_t attrlen = ("file.txt", "myattribute", buf, 1024, 0, 0);
if(attrlen > 0) {
printf("myattribute: %.*s\n", (int)attrlen, buf);
}
Attribute hinzufügen oder verändern geht mit setxattr.
int setxattr(const char *path, const char *name, void *value, size_t size,
u_int32_t position,
int options);
position sollte auch hier wieder 0 sein. Bei den options gibt es wieder XATTR_NOFOLLOW
und die interessanten Options XATTR_CREATE, um zu erzwingen, dass das Attribut nur gesetzt wird, falls es noch nicht existiert, oder XATTR_REPLACE
, um nur den Inhalt eines bereits existierenden Attributs zu ändern.
char *value = "Hello World!";
setxattr("file.txt", "myattribute", value, strlen(value), 0, 0);
Alle existierenden Attribute auflisten geht mit listxattr.
ssize_t listxattr(const char *path, char *namebuf, size_t size, int options);
Dies schreibt in den vorher allozierten Buffer die Namen aller Attribute, getrennt durch ein 0-Byte. Hier findet sich ein Beispielprogramm, welches alle Attribute einer Datei auflistet.
Kommentare