Скачиваний:
56
Добавлен:
08.01.2014
Размер:
2.6 Mб
Скачать

3.1.5. Вызовfdopen и права доступа к файлу

Если вызов fdopen используется для открытия существующего файла на чтение или запись, то система проверяет, разрешен ли запрошенный процессом режим доступа (только для чтения, только для записи или для чтения-записи), проверяя права доступа к файлу. Если режим не разрешен, вызов fdopen вернет значение -1, указывающее на ошибку, а переменная linuxerror будет содержать код ошибки Sys_EACCES, означающий: нет доступа (permission denied).

Если для создания файла используется расширенная форма вызова fdopen, то использование флагов Open_CREAT, Open_TRUNC и Open_EXCL позволяет по-разному работать с существующими файлами. Примеры использования вызова fdopen с заданием прав доступа к файлу:

filedes := fdopen(pathname, Open_WRONLY or Open_CREAT or Open_TRUNC, octal(0600));

и:

filedes := fdopen(pathname, Open_WRONLY or Open_CREAT or Open_EXCL, octal(0600));

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

Упражнение 3.5.

А. Предположим, что действующий идентификатор пользовать euid процесса равен 100, а его действующий идентификатор группы egid равен 200. Владельцем файла testfile являет пользователь с идентификатором 101, а идентификатор группы файла gid равен 200. Для каждого возможного режима доступа (только для чтения, только для записи, для записи-чтения) определите, будет ли успешным вызов open, если файл testfile имеет следующие права доступа:

rwxr-xrwx r-xrwxr-x rwx--x--- rwsrw-r--

--s--s--x ---rwx--- ---r-x--x

В. Что произойдет, если real user-id (действующий идентификатор пользователя) процесса равен 101, a real group-id (действующий идентификатор группы) равен 201?

3.1.6. Определение доступности файла при помощи вызова access

Системный вызов access определяет, может ли процесс получить доступ к файлу в соответствии с истинным (real), а не действующим (effective) идентификатором пользователя (и группы) процесса. Такой вызов позволяет процессу, получившему права при помощи бита STAT_ISUID, определить настоящие права пользователя, запустившего это процесс, что облегчает написание безопасных программ.

Описание

uses linux;

Function Access(PathName:Pathstr; AMode:integer):Boolean;

Как мы уже видели, существует несколько режимов доступа к файлу, поэтому параметр amode содержит значение, указывающее на интересующий нас метод доступа. Параметр amode может принимать следующие значения, определенные в модуле linux:

R_OK – имеет ли вызывающий процесс доступ на чтение;

W_ОК – имеет ли вызывающий процесс доступ на запись;

Х_ОК – может ли вызывающий процесс выполнить файл.

Аргумент amode не конкретизирует, к какой категории пользователей относится вопрос, так как вызов access сообщает права доступа к файлу конкретного пользователя, имеющего ruid и rgid текущего процесса. Переменная amode также может принимать значение F_OK, в этом случае проверяется лишь существование файла. Как обычно, параметр pathname задает имя файла.

Значение, возвращаемое вызовом access, либо равно нулю (доступ разрешен) или -1 (доступ не разрешен). В последнем случае переменная linuxerror будет содержать значение кода ошибки. Значение Sys_EACCES, например, означает, что запрошенный режим доступа к файлу не разрешен, а значение Sys_ENOENT показывает, что указанного файла просто не существует.

Следующий пример программы использует вызов access для проверки, разрешено ли пользователю чтение файла при любом значении бита STAT_ISUID исполняемого файла этой программы:

(* Пример использования вызова access *)

uses linux,stdio;

const

filename = 'afile';

begin

if not access (filename, R_OK) then

begin

writeln(stderr, 'Пользователь не имеет доступа на чтение к файлу ', filename);

halt(1);

end;

writeln(filename, ' доступен для чтения, продолжаем');

(* Остальная программа *)

end.

Упражнение 3.6. Напишите программу whatable, которая будет сообщать, можете ли вы выполнять чтение, запись или выполнение заданного файла. Если доступ невозможен, программа whatable должна сообщать почему (используйте коды, ошибок, возвращаемых в переменной linuxerror).

Соседние файлы в папке Полищук, Семериков. Системное программирование в UNIX средствами Free Pascal