Хорошо, во-первых, я не слишком уверен, что вы пытаетесь выполнить - вы сказали, что вам нужно получить uid, но getpwuid предназначен для поиска другой информации на основе uid. Возможно, вы хотите получить getpwnam, который ищет в зависимости от имени пользователя? И тогда вам нужно использовать uid для другой функции?
В любом случае все, что я скажу ниже, относится как к getpwnam, так и к getpwuid - просто замените аргумент uid на аргумент username.
Вы немного перепутали документацию. Почти цитата из справочной страницы:
struct passwd *getpwuid(uid_t uid);
int getpwuid_r(uid_t uid, struct passwd *pwbuf, char *buf, size_t buflen, struct passwd **pwbufp);
Функция getpwuid () возвращает указатель на структуру, содержащую разбитые поля записи в базе данных паролей, которая соответствует идентификатору пользователя uid.
Функция getpwuid_r () получает ту же информацию, но сохраняет полученную структуру passwd в пространстве, на которое указывает pwbuf.
Звучит так, будто вы просто немного размыты в отношении указателей в целом. Однако вам не нужно слишком беспокоиться об этой работе, это звучит так, как будто для ваших целей может подойти более простая версия:
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);
...
}
Обратите внимание, что в этом случае вам не нужно выделять память для указателя, потому что getpwuid возвращает указатель на структуру с выделенной памятью и сохраненной информацией.
Полное определение структуры (имена других членов) находится на странице руководства.
Вторая форма, getpwuid_r, лучше подходит для более тщательной обработки ошибок и управления памятью, но если все, что вам нужно, это быстрый поиск, то все будет в порядке.