2009-10-22 15 views
5

He hecho algunas investigaciones y todavía estoy luchando con la estructura passwd.Programación Unix. No estoy seguro de cómo usar la estructura passwd

http://www.opengroup.org/onlinepubs/000095399/basedefs/pwd.h.html

necesito para obtener el ID de usuario, sin embargo no creo que estoy usando entender en absoluto.

int getpwuid_r (uid_t, struct passwd *, char *, size_t, struct passwd **);

Esta llamada a método devuelve un punto a una estructura que contendrá todos los datos que necesito. Estoy bastante confundido sobre los parámetros.

struct passwd. ¿Debo declarar esto primero? struct passwd passwd?

Estoy completamente perdido en cómo usar esto.

Por último, una vez que llene mi puntero. ¿Qué llamadas usaré para obtener los datos? Gracias por cualquier ayuda.

Respuesta

6

En la firma getpwuid_r:

int getpwuid_r(uid_t uid, struct passwd *pwbuf, char *buf, 
    size_t buflen, struct passwd **pwbufp); 

uid es un parámetro de entrada - es el UID del usuario que desea buscar. El resto son esencialmente parámetros de salida: la estructura apuntada por pwbuf se rellenará con la información de contraseña, y el puntero apuntado por pwbufp se establecerá en el valor de pwbuf si la llamada fue exitosa (y NULL si no lo fue). El par de parámetros buf y buflen especifica un búfer proporcionado por el usuario que se utilizará para almacenar las cadenas señaladas por los miembros de la estructura struct passwd que se devuelve.

Se podría utilizarlo como tal (esto se ve el usuario con UID 101):

struct passwd pwent; 
    struct passwd *pwentp; 
    char buf[1024]; 

    if (getpwuid_r(101, &pwent, buf, sizeof buf, &pwentp)) 
    { 
      perror("getpwuid_r"); 
    } 
    else 
    { 
      printf("Username: %s\n", pwent.pw_name); 
      printf("Real Name: %s\n", pwent.pw_gecos); 
      printf("Home Directory: %s\n", pwent.pw_dir); 
    } 

Si instread que desea buscar un usuario por su nombre para encontrar su identificación, use getpwnam_r y examinar el pw_uid campo de la estructura devuelta.

+0

Niza, que utiliza getpwuid, y se utiliza getpwuid_r. ¡Afortunadamente la respuesta que el OP está buscando es una de estas! – Cascabel

1

Está bien, antes que nada, no estoy muy seguro de lo que está tratando de lograr: dijo que necesita obtener el uid, pero getpwuid es para buscar otra información basada en uid. ¿Quizás querías getpwnam, que busca según el nombre de usuario? ¿Y luego necesitas usar el uid para otra función?

En cualquier caso, todo lo que digo a continuación se aplica tanto a getpwnam como a getpwuid; simplemente intercambie el argumento uid por el argumento de nombre de usuario.

Ha mezclado su documentación un poco. Una casi cita de la página del manual:

struct passwd *getpwuid(uid_t uid); 

int getpwuid_r(uid_t uid, struct passwd *pwbuf, char *buf, size_t buflen, struct passwd **pwbufp); 

El getpwuid() devuelve un puntero a una estructura que contiene los campos de salida del registro en la base de datos de contraseña que coincida con el UID ID de usuario.

La función getpwuid_r() obtiene la misma información, pero almacena la estructura de contraseñas recuperada en el espacio apuntado por pwbuf.

Parece que simplemente es un poco confuso con los punteros en general. Sin embargo, usted no tiene que preocuparse demasiado para este trabajo suena como para sus propósitos la versión más simple puede ser muy bien:

struct passwd * my_passwd; 
my_passwd = getpwuid(uid); 
// or: 
// my_passwd = getpwnam(username); 

if (my_passwd == NULL) { 
    // the lookup failed - handle the error! 
} else { 
    // the lookup succeeded - do your thing 
    printf("User name: %s\n", my_passwd->pw_name); 
    printf("User password: %s\n", my_passwd->pw_passwd); 
    ... 
} 

Nótese que en este caso no es necesario asignar memoria para el puntero , porque getpwuid devuelve un puntero a la estructura con la memoria asignada y la información almacenada.

La definición completa de la estructura (nombres de otros miembros) se encuentra en la página de manual.

La segunda forma, getpwuid_r, es mejor para un manejo de errores y gestión de memoria más cuidadosos, pero si todo lo que necesita hacer es una búsqueda rápida, esto debería estar bien.

+0

Aprecio toda la ayuda que todos han ofrecido. Debería estar bien ahora. Alguien me lo explicó de manera diferente y originalmente estaba en el camino correcto para empezar. En caso de que se esté preguntando tengo un proyecto de programación Unix que necesita mostrar todos los permisos de usuario para todos los archivos en su directorio. –

2

En primer lugar, si desea obtener el UID, entonces presumiblemente tiene el nombre de usuario a mano, en cuyo caso debe usar getpwnam_r(). Esta función se utiliza exactamente como getpwuid_r(), excepto que se le pasa un nombre (char *) como primer parámetro.

En segundo lugar, no es necesario declarar `struct password'. Se declara cuando se incluye pwd.h.

En tercer lugar, la firma exacta de la función es:

int getpwnam_r(const char *name, struct passwd *pwd, 
       char *buf, size_t buflen, struct passwd **result); 

En lo anterior, las personas con discapacidad es un parámetrosalida que es donde la función devuelve el ingreso de contraseña, si se encuentra

..

Por último, hay un ejemplo completo de cómo usar getpwnam_r en la página de manual de Linux getpwnam_r, accesible here.

1: http://manpages.ubuntu.com/manpages/jaunty/en/man3/getpwnam.3.html aquí

Cuestiones relacionadas