Подробнее о вызове chmod
Системный вызов fstat расширяет использование вызова chmod, поскольку позволяет предварительно узнать значение кода доступа к файлу, что дает возможность изменять отдельные биты, а не менять весь код доступа целиком.
Следующая программа addx демонстрирует сказанное. Она вначале вызывает fstat для получения режима доступа к файлу из списка аргументов вызова программы. В случае успешного завершения вызова программа изменяет существующие права доступа так, чтобы файл был доступен для выполнения его владельцем. Эта программа может быть полезна для придания командным файлам, составленным пользователем, статуса исполняемых файлов.
(* Программа addx разрешает доступ на выполнение файла *)
uses linux,stdio;
const XPERM=0100; (* Право на выполнение для владельца *)
var
k:integer;
statbuf:tstat;
begin
(* Выполнить для всех файлов в списке аргументов *)
for k := 1 to paramcount do
begin
(* Получить текущий код доступа к файлу *)
if not fstat(paramstr(k), statbuf) then
begin
writeln('addx: ошибка вызова stat для ',paramstr(k));
continue;
end;
(*
Попытаться разрешить доступ на выполнение
при помощи оператора побитового ИЛИ
*)
statbuf.mode := statbuf.mode or octal(XPERM);
if not chmod (paramstr(k), statbuf.mode) then
writeln('addx: ошибка изменения прав доступа для файла ', paramstr(k));
end; (* Конец цикла *)
halt(0);
end.
Наиболее интересный момент заключается здесь в способе изменения кода доступа файла при помощи побитового оператора ИЛИ. Это гарантирует, что устанавливается бит, заданный определением XPERM. Фактически мы могли бы расписать этот оператор в виде:
statbuf.mode := statbuf.mode or octal(XPERM);
Для ясности использована более короткая форма. Можно было бы также использовать вместо XPERM предусмотренную в системе постоянную STAT_IXUSR.
Упражнение 3.11. Приведенную задачу можно решить проще. Если вы знаете, как это сделать, напишите эквивалент этой программы при помощи командного интерпретатора.
Упражнение 3.12. Напишите свою версию команды chmod, используя ее описание в справочном руководстве вашей системы UNIX.