Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах
Шрифт:

getpwent
полезна, когда нужно пройти через всю базу данных паролей. Например, может быть необходимо прочесть ее всю в память, отсортировать, а затем осуществить быстрый поиск с помощью
bsearch
. Это очень полезно для избежания множества линейных поисков, свойственных поиску по одному элементу за раз с помощью
getpwuid
или
getpwnam
.

ЗАМЕЧАНИЕ. Указатели, возвращаемые

getpwent
,
getpwnam
и
getpwuid
, все указывают на внутренние
static
данные. Поэтому следует сделать копию их содержимого, если нужно сохранить сведения.

Хорошенько рассмотрите определение

struct passwd
. Члены, представляющие символьные строки, являются указателями, они также указывают на внутренние
static
данные, и если вы собираетесь скопировать структуру, не забудьте также скопировать и данные, на которые указывает каждый член структуры.

6.3.2. База данных групп

Формат базы данных групп

/etc/group
подобен формату
/etc/passwd
, но с меньшим числом полей.

$ grep arnold /etc/group

mail:x:12:mail,postfix,arnold

uucp:x:14:uucp,arnold

floppy:x:19:arnold

devel:x:42:miriam,arnold

arnold:x:2076:arnold

Опять-таки на одну группу отводится одна строка, с полями, разделенными двоеточием. Поля следующие.

Имя группы

Это имя группы, как оно отображается в '

ls -l
' или в любом другом контексте, когда требуется имя группы.

Пароль группы

Историческое поле. Оно больше не используется.

ID группы

Как и для ID пользователя, должен быть уникальным для каждой группы.

Список пользователей

Разделенный запятыми список пользователей, являющихся членами группы.

В предыдущем примере мы видели, что пользователь

arnold
является членом нескольких групп. Это членство на практике отражается в том, что называют набором групп (group set). Помимо главных номеров ID пользователя и ID группы, которые есть у процессов, набор групп является набором номеров ID дополнительных групп, который имеет при себе каждый процесс. Система проверяет на соответствие с этими ID групп, ID группы файла при осуществлении проверки прав доступа. Эта тема более подробно обсуждается в разделе 11 «Разрешения и ID пользователя и группы».

API базы данных групп сходна с API для базы данных пользователей. Следующие функции определены в

<grp.h>
:

#include <sys/types.h> /* XSI */

#include <grp.h>

struct group *getgrent(void);

void setgrent(void);

void endgrent(void);

struct group *getgrnam(const char *name);

struct group *getgrgid(gid_t gid);

struct group соответствует записям в /etc/group:

struct group {

 char *gr_name; /* имя группы */

 char *gr_passwd; /* пароль группы */

 gid_t gr_gid; /* id группы */

 char **gr_mem; /* члены группы */

};

Поле

gr_mem
требует некоторого объяснения. Хотя оно объявлено в виде указателя на указатель (
char**
), лучше представить его как массив строк (наподобие
argv
). Последний элемент в массиве устанавливается в
NULL
. Когда в списке нет членов, первый элемент массива равен
NULL
.

ch06-groupinfo.с
демонстрирует, как использовать
struct group
и поле
gr_mem
. Программа принимает в командной строке имя единственного пользователя и печатает все записи групп, в которых появляется этот пользователь:

1 /* ch06-groupinfo.с --- Демонстрация getgrent и struct group */

2

3 #include <stdio.h>

4 #include <sys/types.h>

5 #include <grp.h>

6

7 extern void print_group(const struct group *gr);

8

9 /* main --- вывести строки групп для пользователя в argv[1] */

10

11 int

12 main(int argc, char **argv)

13 {

14 struct group *gr;

15 int i;

16

17 if (argc != 2) { /* Проверка аргументов */

18 fprintf(stderr, "usage: %s user\n", argv[0]);

19 exit(1);

20 }

21

22 while ((gr = getgrent) != NULL) /* Получить запись каждой группы: */

23 for (i = 0; gr->gr_mem[i] != NULL; i++) /* Рассмотреть каждый член */

24 if (strcmp(gr->gr_mem[i], argv[i]) == 0) /* Если пользователь найден... */

25 print_group(gr); /* Вывести запись */

26

27 endgrent;

28

29 exit(0);

30 }

Функция

main
сначала проверяет ошибки (строки 17–20). Основным компонентом программы является вложенный цикл. Внешний цикл (строка 22) перечисляет все записи базы данных группы. Внутренний цикл (строка 23) перечисляет всех членов массива
gr_mem
. Если один из членов соответствует имени из командной строки (строка 24), для печати записи вызывается
print_group
(строка 25):

Поделиться:
Популярные книги

Кодекс Охотника. Книга XXIX

Винокуров Юрий
29. Кодекс Охотника
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга XXIX

Главный рубильник. Расцвет и гибель информационных империй от радио до интернета

Ву Тим
Деловая литература:
о бизнесе популярно
5.00
рейтинг книги
Главный рубильник. Расцвет и гибель информационных империй от радио до интернета

Кадет Морозов

Шелег Дмитрий Витальевич
4. Живой лёд
Фантастика:
боевая фантастика
5.72
рейтинг книги
Кадет Морозов

Адвокат империи

Карелин Сергей Витальевич
1. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
фэнтези
5.75
рейтинг книги
Адвокат империи

Страж Кодекса. Книга V

Романов Илья Николаевич
5. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Страж Кодекса. Книга V

Зодчий. Книга I

Погуляй Юрий Александрович
1. Зодчий Империи
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Зодчий. Книга I

Цикл "Идеальный мир для Лекаря". Компиляция. Книги 1-30

Сапфир Олег
Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Цикл Идеальный мир для Лекаря. Компиляция. Книги 1-30

Я — Легион

Злобин Михаил
3. О чем молчат могилы
Фантастика:
боевая фантастика
7.88
рейтинг книги
Я — Легион

Ты - наша

Зайцева Мария
1. Наша
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Ты - наша

Эпоха Опустошителя. Том X

Павлов Вел
10. Вечное Ристалище
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Эпоха Опустошителя. Том X

Аландская Звезда

Перунов Антон
6. Константин
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Аландская Звезда

Имперец. Том 4

Романов Михаил Яковлевич
3. Имперец
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Имперец. Том 4

Хроники Тириса. Книга 3

Маханенко Василий Михайлович
3. Хроники Тириса
Фантастика:
боевая фантастика
космическая фантастика
фантастика: прочее
5.00
рейтинг книги
Хроники Тириса. Книга 3

Неучтенный элемент. Том 11

NikL
11. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 11