permisos - ¿Cómo obtener atributos extendidos de un archivo(UNIX/C)?
permisos de archivos en linux (2)
Lo siguiente es un código que eliminé de la implementación oficial de ls
dada por Apple que encontrarás aquí . El código es largo, así que haga CMD + F y busque "printlong".
#include <sys/types.h>
#include <sys/xattr.h>
#include <sys/types.h>
#include <sys/acl.h>
#include <stdio.h>
int main () {
acl_t acl = NULL;
acl_entry_t dummy;
ssize_t xattr = 0;
char str[10];
char * filename = "/Users/john/desktop/mutations.txt";
acl = acl_get_link_np(filename, ACL_TYPE_EXTENDED);
if (acl && acl_get_entry(acl, ACL_FIRST_ENTRY, &dummy) == -1) {
acl_free(acl);
acl = NULL;
}
xattr = listxattr(filename, NULL, 0, XATTR_NOFOLLOW);
if (xattr < 0)
xattr = 0;
str[1] = ''/0'';
if (xattr > 0)
str[0] = ''@'';
else if (acl != NULL)
str[0] = ''+'';
else
str[0] = '' '';
printf("%s/n", str);
}
Dependiendo del archivo utilizado, el resultado será un espacio en blanco, @, o + exactamente de la misma manera que ls -l
muestra. Espero que esto ayude !
Cuando ls -l
en la línea de comandos, a veces aparece un símbolo @
o +
junto a los permisos del archivo (por cierto, estoy en OS X), como se muestra a continuación:
-rw-r-----@ 1 john staff 6731 Sep 28 01:10 mutations.txt
drwxr-xr-x+ 71 john staff 2414 Mar 25 18:16 ..
Sé cómo obtener los bits de permiso usando la estructura stat
, pero no creo que estos valores de permisos extendidos estén allí. ¿Puede alguien señalarme en la dirección correcta cómo obtener estos valores a través de una API C o POSIX?
EDITAR :
Intenté lo siguiente:
#include <sys/types.h>
#include <sys/xattr.h>
#include <sys/types.h>
int main () {
char l[1024];
listxattr("/Users/john/desktop/mutations.txt", l, 1024, XATTR_SHOWCOMPRESSION);
printf("%s/n", l);
}
y obtuve como salida:
com.apple.metadata:kMDItemWhereFroms
¿Todavía estás tratando de entender cómo convertir esto en @
o +
?
@
significa que el archivo tiene atributos extendidos. Use listxattr()
para obtener una lista de los nombres de todos los atributos extendidos, y getxattr()
para obtener el valor de un atributo en particular. Si listxattr
devuelve un resultado distinto de cero, mostraría @
para indicar esto.
Los atributos extendidos no están en POSIX, pero esta API está disponible en Linux y OS X, al menos.
Puede encontrar un ejemplo de cómo usar estas funciones aquí .
+
significa que el archivo tiene una lista de control de acceso. En algunos sistemas de archivos, esto se almacena como un atributo extendido especial; en otros se almacena por separado. Para listas de control de acceso, vea acl(5)
para una referencia, y puede encontrar un programa de ejemplo que lo muestra aquí .