Троан Эрик В.
Шрифт:
База данных пользователей | База данных групп | |
---|---|---|
Номер | getpwuid | getgrgid |
Имя | getpwnam | getgrnam |
Каждая из этих функций возвращает указатели на структуры. Структуры являются статическими и перезаписываются при последующем вызове функции, поэтому если вам по какой-либо причине нужно отслуживать структуру, потребуется сделать ее копию.
Четыре вышеупомянутых функции являются, по сути, сокращениями, предлагающими наиболее часто используемые функции для доступа к системным базам данных. Функции низкого уровня,
getpwent
и getgrent
, производят итерации по строкам в базе данных вместо поиска конкретной записи. Каждый раз при вызове одной из этих функций она будет считывать другой элемент из соответствующей системной базы данных, и возвращать его. После того как вы завершите чтение элементов, вызовите функцию endpwent
или endgrent
, чтобы закрыть файл. В качестве примера далее приводится функция
getpwuid
, записанная в отношении функции getpwent
. struct passwd * getpwuid(uid_t uid) {
struct passwd * pw;
while (pw = getpwent) {
if (!pw)
/* обнаружена ошибка; * сквозной проход для обработки ошибки */
break;
if (pw->pw_uid == uid) {
endpwent;
return(pw);
}
}
endpwent;
return NULL;
}
28.1.1. Пример: команда
id
Команда
id
использует многие из этих функций и предлагает несколько хороших примеров работы с ними. Она также использует некоторые функциональные возможности ядра, описанные в главе 10. 1: /* id.с */
2:
3: #include <grp.h>
4: #include <pwd.h>
5: #include <sys/types.h>
6: #include <stdlib.h>
7: #include <stdio.h>
8: #include <string.h>
9: #include <unistd.h>
10:
11: void usage (int die, char *error) {
12: fprintf(stderr, "Использование: id [<имя_пользователя>]\n") ;
13: if (error) fprintf(stderr, "%s\n", error);
14: if (die) exit(die);
15: }
16:
17: void die(char *error) {
18: if (error) fprintf(stderr, "%s\n", error);
19: exit(3);
20: }
21:
22: int main(int argc, const char *argv[]) {
23: struct passwd *pw;
24: struct group *gp;
25: int current_user = 0;
26: uid_t id;
27: int i;
28:
29: if (argc > 2)
30: usage(1, NULL);
31:
32: if (argc == 1) {
33: id = getuid;
34: current_user = 1;
35: if (!(pw = getpwuid(id)))
36: usage(1, "Имя пользователя не существует");
37: } else {
38: if (!(pw = getpwnam(argv[1])))
39: usage(1, "Имя пользователя не существует");
40: id = pw->pw_uid;
41: }
42:
43: printf("uid=%d(%s)", id, pw->pw_name);
44: if ((gp = getgrgid(pw->pw_gid)))
45: printf(" gid=%d(%s)", pw->pw_gid, gp->gr_name);
46: