Разработка приложений в среде Linux - [201]

Шрифт
Интервал

, >/bin/tcsh, >bin/zsh и так далее. Однако элементы, используемые для других целей, могут иметь другие оболочки, >/bin/false применяется для элементов >passwd, которые не используются для регистрации пользователей. Специализированные оболочки часто служат для целей, рассмотрение которых выходит за рамки настоящей книги.

Структура, которая представляет элементы в >/etc/group (или в эквивалентных базах данных), определена в >.

>struct group {

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

> char * gr_passwd; /* Пароль */

> __gid_t gr_gid;   /* Идентификатор группы */

> char ** gr_mem;   /* Список членов */

>};

• >gr_name представляет уникальное имя группы.

• >gr_passwd представляет пароль (обычно неиспользуемый). К нему применимы те же требования, что и к >pw_passwd, только в еще большей степени.

• >gr_gid представляет номер (обычно неуникальный), который ядро использует для идентификации группы.

• >gr_mem представляет список членов группы, разделенных запятыми. Это список имен пользователей, которые присваиваются этой группе на вторичной основе (см. главу 10).

Существуют две общих причины, по которым производится доступ к системным идентификационным базам данных: если ядро получает номер, а вам необходимо имя, или если какой-то пользователь или какая-то программа предоставляют вам имя, а вы должны сообщить ядру номер. Предусмотрены две функции поиска числовых идентификаторов, >getpwuid() и >getgrgid(), которые принимают целочисленный идентификатор и возвращают указатель на структуру, содержащую информацию из соответствующей системной базы данных. Точно так же имеются две функции, которые производят поиск имен, >getpwnam() и >getgrnam(), и они возвращают те же две структуры.

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

>  4: #include

>  5: #include

>  6: #include

>  7: #include

>  8: #include

>  9: #include

> 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) {

> 68:    gid_list = malloc(gid_size * sizeof(gid_t));

> 69:    getgroups(gid_size, gid_list);

> 70:

> 71:    for (i = 0; i < gid_size; i++) {

> 72:     if (!(gp = getgrgid(gid_list[i])))

> 73:      die("Группа не существует");

> 74:     printf("%s%d(%s)", (i == 0) ? " groups=" : ",",


Рекомендуем почитать
Это ваше Fido

Одно из немногих изданий на русском языке, которое посвящено старейшей глобальной компьютерной сети "Fidonet". Сатирический справочник о жизни и смерти самого древнего сетевого сообщества, которое до сих пор существует среди нас.


Безопасность информационных систем

В пособии излагаются основные тенденции развития организационного обеспечения безопасности информационных систем, а также подходы к анализу информационной инфраструктуры организационных систем и решению задач обеспечения безопасности компьютерных систем.Для студентов по направлению подготовки 230400 – Информационные системы и технологии (квалификация «бакалавр»).


UNIX — универсальная среда программирования

В книге американских авторов — разработчиков операционной системы UNIX — блестяще решена проблема автоматизации деятельности программиста, системной поддержки его творчества, выходящей за рамки языков программирования. Профессионалам открыт богатый "встроенный" арсенал системы UNIX. Многочисленными примерами иллюстрировано использование языка управления заданиями shell.Для программистов-пользователей операционной системы UNIX.


QNX/UNIX: Анатомия параллелизма

Книга адресована программистам, работающим в самых разнообразных ОС UNIX. Авторы предлагают шире взглянуть на возможности параллельной организации вычислительного процесса в традиционном программировании. Особый акцент делается на потоках (threads), а именно на тех возможностях и сложностях, которые были привнесены в технику параллельных вычислений этой относительно новой парадигмой программирования. На примерах реальных кодов показываются приемы и преимущества параллельной организации вычислительного процесса.


Виртуальные  машины: несколько компьютеров в  одном

Применение виртуальных машин дает различным категориям пользователей — от начинающих до IT-специалистов — множество преимуществ. Это и повышенная безопасность работы, и простота развертывания новых платформ, и снижение стоимости владения. И потому не случайно сегодня виртуальные машины переживают второе рождение.В книге рассмотрены три наиболее популярных на сегодняшний день инструмента, предназначенных для создания виртуальных машин и управления ими: Virtual PC 2004 компании Microsoft, VMware Workstation от компании VMware и относительно «свежий» продукт — Parallels Workstation, созданный в компании Parallels.


Недокументированные и малоизвестные возможности Windows XP

Книга содержит подробные сведения о таких недокументированных или малоизвестных возможностях Windows XP, как принципы работы с программами rundll32.exe и regsvr32.exe, написание скриптов сервера сценариев Windows и создание INF-файлов. В ней приведено описание оснасток, изложены принципы работы с консолью управления mmc.exe и параметрами реестра, которые изменяются с ее помощью. Кроме того, рассмотрено большое количество средств, позволяющих выполнить тонкую настройку Windows XP.Эта книга предназначена для опытных пользователей и администраторов, которым интересно узнать о нестандартных возможностях Windows.