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

на главную

Жанры

Разработка приложений в среде 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) {

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

Ненаглядная жена его светлости

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

Кодекс Крови. Книга IХ

Борзых М.
9. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга IХ

В теле пацана 6

Павлов Игорь Васильевич
6. Великое плато Вита
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
В теле пацана 6

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

Винокуров Юрий
15. Кодекс Охотника
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XV

Брак по-драконьи

Ардова Алиса
Фантастика:
фэнтези
8.60
рейтинг книги
Брак по-драконьи

Горькие ягодки

Вайз Мариэлла
Любовные романы:
современные любовные романы
7.44
рейтинг книги
Горькие ягодки

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

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

Эксперимент

Юнина Наталья
Любовные романы:
современные любовные романы
4.00
рейтинг книги
Эксперимент

В теле пацана

Павлов Игорь Васильевич
1. Великое плато Вита
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
В теле пацана

Кодекс Крови. Книга III

Борзых М.
3. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга III

Шестое правило дворянина

Герда Александр
6. Истинный дворянин
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Шестое правило дворянина

Третий. Том 3

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий. Том 3

Боги, пиво и дурак. Том 3

Горина Юлия Николаевна
3. Боги, пиво и дурак
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Боги, пиво и дурак. Том 3

Live-rpg. эволюция-4

Кронос Александр
4. Эволюция. Live-RPG
Фантастика:
боевая фантастика
7.92
рейтинг книги
Live-rpg. эволюция-4