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

3.1.4. Маска создания файла и системный вызов umask

Как уже было отмечено в главе 2, первоначально права доступа к файлу задаются в момент его создания при помощи вызова fdcreat или fdopen в расширенной форме, например:

filedes := fdopen('datafile', Open_CREAT, ocatl(0644));

С каждым процессом связано значение, называемое маской создания файла (file creation mask). Эта маска используется для автоматического выключения битов прав доступа при создании файлов, независимо от режима, заданного соответствующим вызовом fdcreat или fdopen. Это полезно для защиты всех создаваемых за время существования процесса файлов, так как предотвращается случайное включение лишних прав доступа.

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

Таким образом, с точки зрения программиста, оператор

filedes := fdopen(pathname, Open_CREAT, mode);

эквивалентен оператору

filedes := fdopen(pathname, Open_CREAT, (not mask) and mode);

где переменная mask содержит текущее значение маски создания файла, not – это оператор побитового отрицания, а and – оператор побитового И.

Например, если значение маски равно 04+02+01=07, то права доступа, обычно задаваемые этими значениями, при создании файла выключаются. Поэтому файл, создаваемый при помощи оператора

filedes := fdopen(pathname, Open_CREAT, octal(0644));

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

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

Описание

uses linux;

Function Umask(Mask:Integer):Integer;

Например:

var

oldmask:integer;

.

.

.

oldmask := umask(octal(022));

Значение octal(022) запрещает присваивание файлу прав доступа на запись всем, кроме владельца файла. После вызова в переменную oldmask будет помещено предыдущее значение маски.

Поэтому, если вы хотите быть абсолютно уверены, что файлы создаются именно с кодами доступа, заданными в вызовах fdcreat или fdopen, вам следует вначале вызвать umask с нулевым аргументом. Так как все биты в маске создания файла будут равны нулю, ни один из битов в коде доступа, передаваемом вызовам fdopen или fdcreat, не будет сброшен. В следующем примере этот подход используется для создания файла с заданным кодом доступа, а затем восстанавливается старая маска создания файла. Программа возвращает дескриптор файла, полученный в результате вызова fdopen.

uses linux,stdio;

function specialcreat(pathname:string;mode:longint):integer;

var

oldu,filedes:integer;

begin

(* Установить маску создания файла равной нулю *)

oldu:=umask(0);

if oldu = -1 then

begin

perror('Ошибка сохранения старой маски');

specialcreat:=-1;

exit;

end;

(* Создать файл *)

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

if (filedes = -1) then

perror ('Ошибка открытия файла');

(* Восстановить прежний режим доступа к файлу *)

if (umask (oldu) = -1) then

perror ('Ошибка восстановления старой маски');

(* Вернуть дескриптор файла *)

specialcreat:=filedes;

end;

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