Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учеб.пос.СП.doc
Скачиваний:
28
Добавлен:
31.03.2015
Размер:
1.33 Mб
Скачать
    1. Системные вызовы getpwuid, getgrgid и getlogin

Числовые идентификаторы группы и владельца получить несложно - они находятся в полях st_gid и st_uid структуры stat, но нам нужно преобразовать эти идентификаторы в имена. Для этих целей предназначены функции getgrgid и getpwuid, которые на самом деле не являются системными вызовами, так как вся необходимая им информация находится в файлах со списками пользователей и групп. Проблема в том, что стандарты никак не регламентируют местоположение этих файлов. Ниже приводится пример типичной записи из файла паролей ОС Solaris для пользователя marc:

$ grep marc /etc/passwd

marc:x:100:14::/home/marc:/bin/sh

Единственное, чего нет в файле паролей, так это самого пароля. Пароли хранятся в зашифрованном виде в другом файле, который доступен только суперпользователю. В данной системе пользователь marc входит в состав нескольких групп, но группой по умолчанию является группа 14:

$ grep 14 /etc/group

sysadmin::14:

getpwuid - возвращает запись из файла паролей

#include <pwd.h>

struct passwd * getpwuid(

uid_t uid /* числовой идентификатор пользователя */

);

/* Возвращает указатель на структуру или NULL в случае ошибки (код ошибки - в переменной errno) */

struct passwd - структура для возвращаемого значения getpwuid

struct passwd {

char *pw_name; /* имя пользователя (login) */

uid_t pw_uid; /* числовой идентификатор пользователя */

gid_t pw_gid; /* числовой идентификатор группы по умолчанию*/

char *pw_dir; /* домашний каталог */

char *pw_shell; /* командный интерпретатор по умолчанию */

};

getgrgid - возвращает запись из файла со списком групп

#include <grp.h>

struct group * getgrgid (

gid_t gid /* числовой идентификатор группы */

);

/* Возвращает указатель на структуру или NULL в случае ошибки (код ошибки - в переменной errno) */

struct group - структура для возвращаемого значения getgrgid

struct group {

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

gid_t gr_gid; /* числовой идентификатор группы */

char **gr_mem; /* массив-список членов группы */

};

В структурах указаны поля, которые определены стандартами. В каждой конкретной реализации эти структуры могут иметь дополнительные поля, за более точными сведениями следует обратиться к соответствующим заголовочным файлам.

Теперь можно использовать эти две функции для вывода имени пользователя и группы или просто числовых идентификаторов, если их имена неизвестны. Имена могут быть неизвестны, если анализируются файлы на сетевых файловых системах - в этом случае пользователь одной системы может отсутствовать на другой:

static void print_owner(const struct stat *statp)

{

struct passwd *pwd = getpwuid(statp->st_uid);

if (pwd == NULL)

printf(“ %-8ld”, (long)statp->st_uid);

else

printf(“ %-8s”, pwd->pw_name);

}

static void print_group(const struct stat *statp)

{

struct group *grp = getgrgid(statp->st_gid);

if (grp == NULL)

printf(“ %-8ld”, (long)statp->st_gid);

else

printf(“ %-8s”, grp->gr_name);

}

Следующая функция возвращает имя, под которым пользователь зарегистрировался в системе:

getlogin - возвращает имя, под которым пользователь зарегистрировался в системе

#include <unistd.h>

char * getlogin(void);

/* Возвращает структуру или NULL в случае ошибки (код ошибки - в переменной errno) */