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

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

Жанры

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:
База данных пользователей База данных групп
Номер
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:

 47: if (current_user) {

 48: gid_t *gid_list;

 49: int gid_size;

 50:

 51: if (getuid != geteuid) {

 52: id = geteuid;

 53: if (!(pw = getpwuid(id)))

 54: usage(1, "Имя пользователя не существует");

 55: printf(" euid=%d(%s)", id, pw->pw_name);

 56: }

 57:

 58: if (getgid != getegid) {

 59: id = getegid;

 60: if (!(gp = getgrgid(id)))

 61: usage(1, "Группа не существует");

 62: printf(" egid=%d(%s)", id, gp->gr_name);

 63: }

 64:

 65: /* использование интерфейса getgroups для получения текущих групп */

 66: gid_size = getgroups(0, NULL);

 67: if (gid_size) {

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

Дракон - не подарок

Суббота Светлана
2. Королевская академия Драко
Фантастика:
фэнтези
6.74
рейтинг книги
Дракон - не подарок

Бастард Императора. Том 8

Орлов Андрей Юрьевич
8. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 8

Чужая дочь

Зика Натаэль
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Чужая дочь

Эра Мангуста. Том 2

Третьяков Андрей
2. Рос: Мангуст
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эра Мангуста. Том 2

Идеальный мир для Лекаря 14

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

Один на миллион. Трилогия

Земляной Андрей Борисович
Один на миллион
Фантастика:
боевая фантастика
8.95
рейтинг книги
Один на миллион. Трилогия

Помещицы из будущего

Порохня Анна
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Помещицы из будущего

Шлейф сандала

Лерн Анна
Фантастика:
фэнтези
6.00
рейтинг книги
Шлейф сандала

Черный маг императора 2

Герда Александр
2. Черный маг императора
Фантастика:
юмористическая фантастика
попаданцы
аниме
6.00
рейтинг книги
Черный маг императора 2

Император

Рави Ивар
7. Прометей
Фантастика:
фэнтези
7.11
рейтинг книги
Император

Бандит 2

Щепетнов Евгений Владимирович
2. Петр Синельников
Фантастика:
боевая фантастика
5.73
рейтинг книги
Бандит 2

На границе империй. Том 9. Часть 2

INDIGO
15. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 2

Князь Серединного мира

Земляной Андрей Борисович
4. Страж
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Князь Серединного мира

Чайлдфри

Тоцка Тала
Любовные романы:
современные любовные романы
6.51
рейтинг книги
Чайлдфри