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.
Niza, que utiliza getpwuid, y se utiliza getpwuid_r. ¡Afortunadamente la respuesta que el OP está buscando es una de estas! – Cascabel