Системное программирование в UNIX средствами Free Pascal

       

Идентификаторы пользователя и группы


С каждым процессом связаны истинные идентификаторы пользователя и группы. Это всегда идентификатор пользователя и текущий идентификатор группы запустившего процесс пользователя.

Действующие идентификаторы пользователя и группы используются для определения возможности доступа процесса к файлу. Чаще всего, эти идентификаторы совпадают с истинными идентификаторами пользователя и группы. Равенство нарушается, если процесс или один из его предков имеет установленные биты доступа set-user-id или set-group-id. Например, если для файла программы установлен бит set-user-id, то при запуске программы на выполнение при помощи вызова ехес действующим идентификатором пользователя становится идентификатор владельца файла, а не запустившего процесс пользователя.

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

uses linux;

var

  uid, euid, gid, egid : longint;

begin

  (* Получить истинный идентификатор пользователя *)

  uid := getuid;

  (* Получить действующий идентификатор пользователя *)

  euid := geteuid;

  (* Получить истинный идентификатор группы *)

  gid := getgid;



  (* Получить действующий идентификатор группы *)

  egid := getegid;

end.

Для задания действующих идентификаторов пользователя и группы процесса также существуют два вызова:

uses stdio;

var

  newuid, newgid:longint;

.

.

.

(* Задать действующий идентификатор пользователя *)

status := setuid(newuid);

(* Задать действующий идентификатор группы *)

status := setgid(newgid);

Процесс, запущенный непривилегированным пользователем (то есть любым пользователем, кроме суперпользователя) может менять действующие идентификаторы пользователя и группы только на истинные.[6]

Суперпользователю, как всегда, предоставляется полная свобода. Обе процедуры возвращают нулевое значение в случае успеха, и -1 – в случае неудачи.

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



Содержание раздела