viernes, 5 de marzo de 2010

sys_access y sys_sethostname

PERMISOS DE ACCESOS A ARCHIVOS

NOMBRE

       access - comprueba los permisos de usuario para un archivo
 

SINOPSIS

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

DESCRIPCIÓN

       access comprueba si al proceso se le permitirá leer, escribir o comprobar

la existencia de un archivo(u otro objeto del sistema de archivos)cuyo nombre es
pathname. Si pathname es un enlace simbólico (Una liga simbólica es una indicador
que hace referencia a un archivo, o para decirlo más simple es un archivo que hace
referencia a otro archivo) se comprueban los permisos del archivo referenciado por
dicho enlace simbólico.

De acuerdo con modo, que está definido en #include ,

pueden ser:

  • R_OK -prueba el permiso de lectura.
  • W_OK -prueba el permiso de escritura.
  • X_OK -prueba el permiso de ejecución o búsqueda.
  • F_OK -prueba si se permite la comprobación de la existencia del fichero.
Estos, dependen de los permisos de los directorios que aparecen  en  el

camino hasta el archivo, tal como se da en pathname, y de los permisos de
los directorios y archivos 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.
 

Se implementa mediante el procedimiento do_access que toma el i-node del archivo

y llama al procedimiento interno forbidden, para ver si el acceso al fichero

está prohibido.

do_access

Realiza la llamada al sistema access (name, mode).

Esto se comprueba con los identificadores reales del proceso

Variables importantes:

· rip, puntero al nodo i del archivo en cuestión.

· r, valor entero que indica el resultado de la operación.

Algoritmo:

1. Se comprueba si el modo de acceso es correcto (por seguridad), si no se

retorna un error.

2. Toma el nombre del archivo (fetch_name) y lo pone en el user_path.

3. Obtiene el nodo-i del user_path (eat_path) y lo coloca en la variable

rip del tipo inode.

4. Checa los permisos (forbidden), comprobando si el modo está permitido

mirando su nodo-i.

5. Devuelve el i-node a la tabla de i-nodes (put_inode).

6. Retorna el resultado de forbbiden que indica si modo está permitido o no.

EJEMPLO

/*==========================================================*

* do_access *

*==========================================================*/

PUBLIC int do_access()

{

struct inode *rip;

register int r;

/* Primero se comprueba si el modo es correcto */

if ( (mode & ~(R_OK | W_OK | X_OK)) != 0 && mode != F_OK)

return (EINVAL);

/* Obtenemos el i-node del archivo cuyo acceso se va a

chequear, si es posible. */

if(fetch_name(name, name_length, M3) != OK) return(err_code);

if((rip = eat_path(user_path)) == NIL_INODE) return(err_code);

/* Chequea los permisos. */

r = forbidden(rip, (mode_t) mode);

put_inode(rip);

/* Retorna si el modo está permitido o no */

return(r);

}

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, un 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 un errno se le asigna un valor adecuado.
 

ERRORES

       access fallar si:
 
       EACCES 
Se denegara 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 simblico 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 archivos de solo lectura.
 
 
       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.
 
       ETXTBSY
Se requiere acceso de  escritura  para  un  ejecutable  que  este

siendo ejecutado.
 

IMPORTANTE

        Abrir un archivo antes de que se haga la comprobación, 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.
 

NOMBRE DE HOST

NOMBRE

gethostname, sethostname - obtiene / asigna el nombre de host

SINÓPSIS

# include

sethostname (const char * name, size_t len);

sethostname (): _BSD_SOURCE | | (_XOPEN_SOURCE & & _

XOPEN_SOURCE <500)

DESCRIPCIÓN

Estas llamadas al sistema se utilizan para acceder o para

cambiar el nombre de host del procesador actual.

sethostname () establece el nombre de host en el valor

dado en el carácter nombre de la matriz. El argumento len

especifica el número de bytes en el nombre. (Así, el nombre

no requiere un byte nulo de terminación.)

VALOR DEVUELTO

En caso de éxito, se devuelve cero. En caso de error,

se devuelve -1, y errno se le asigna un valor apropiado.

ERRORES

EFAULT

Nombre es una dirección no válida.

EINVAL

len es negativo o, para sethostname (), len es más grande

que el tamaño máximo permitido.

ENAMETOOLONG

len es más pequeño que el tamaño real.

EPERM

Para sethostname (), la persona que llama no tiene

permisos de administrador.

REFERENCIA

www.man.cx/access(2)/es


No hay comentarios:

Publicar un comentario