access(2) comprueba los permisos de usuario para un fichero

SINOPSIS

#include <unistd.h>


int access(const char *pathname, int mode);

DESCRIPCIÓN

access comprueba si al proceso se le permitiría leer, escribir o comprobar la existencia del fichero (u otro objeto del sistema de ficheros) cuyo nombre es pathname. Si pathname es un enlace simbólico se comprueban los permisos del fichero referenciado por dicho enlace simbólico.

mode es una máscara compuesta por uno o más de los siguientes elementos: R_OK, W_OK, X_OK y F_OK.

R_OK, W_OK y X_OK se utilizan para la comprobación de lectura, escritura o ejecución del fichero, respectivamente. F_OK se utiliza para ver si se permite la mera comprobación de la existencia del fichero. Esto depende de los permisos de los directorios que aparecen en el camino hasta el fichero, tal como se da en pathname, y de los permisos de los directorios y ficheros referenciados por los enlaces simbólicos que se pueden encontrar a lo largo del camino.

La comprobación se realiza con los uid y gid reales del proceso, en lugar de utilizar los identificadores efectivos, tal como se hace cuando realmente se intenta una operación. Esto permite a los programas con el bit SETUID activo determinar fácilmente la autoridad del usuario invocador.

Sólo se comprueban los bits de acceso, no el tipo de fichero o sus contenidos. Por lo tanto, si encontramos que un directorio se puede "escribir", probablemente esto significa que se pueden crear ficheros en el directorio, no que el directorio se pueda escribir como se hace con un fichero. Similarmente, podemos encontrar un fichero DOS como "ejecutable" y, aún así, puede fallar una llamada a execve(2).

Si el proceso tiene los privilegios apropiados, una implementación puede indicar éxito para X_OK aun si ninguno de los bits de permiso de ejecución del fichero están activos.

VALOR DEVUELTO

Si ha habido éxito (se han concedido todos los permisos solicitados) la función devuelve un valor 0. Si se ha producido un error (al menos, uno de los bits de mode ha interrogado por un permiso que ha sido denegado, o ha ocurrido algún otro tipo de error), la función devuelve -1 y a errno se le asigna un valor adecuado.

ERRORES

access fallará si:
EACCES
Se denegaría el acceso solicitado al fichero o se deniega el permiso de búsqueda para uno de los directorios en pathname.
ELOOP
Se han encontrado demasiados enlaces simbólicos al resolver pathname.
ENAMETOOLONG
pathname es demasiado largo.
ENOENT
Un directorio componente de pathname es accesible pero no existe o es un enlace simbólico colgado.
ENOTDIR
Un componente usado como directorio en pathname no es, de hecho, un directorio.
EROFS
Se ha solicitado permiso de escritura para un fichero en un sistema de ficheros de sólo lectura.

access puede fallar si:

EFAULT
pathname apunta fuera del espacio de direcciones al que tiene acceso."
EINVAL
mode se ha especificado incorrectamente
ENOMEM
No hay suficiente memoria disponible en el núcleo.
EIO
Ha ocurrido un error de E/S.
ENOMEM
Memoria del núcleo insuficiente.
ETXTBSY
Se requiere acceso de escritura para un ejecutable que está siendo ejecutado.

RESTRICCIONES

access regresa un error si falla cualquiera de los tipos de acceso especificados en la llamada a la función, aunque los otros tipos tuvieran éxito.

access no puede funcionar correctamente sobre sistemas de ficheros NFS que tengan activa la aplicación del UID, porque la aplicación del UID se realiza en el servidor y se oculta a los clientes que comprueban los permisos.

Usar access para comprobar si un usuario está autorizado a, por ejemplo, abrir un fichero antes de que realmente lo haga usando open(2), crea un agujero de seguridad ya que el usuario podría explotar el breve intervalo de tiempo que hay entre la comprobación y la apertura del fichero para manipularlo.

CONFORME A

SVID, AT&T, POSIX, X/OPEN, BSD 4.3