Вы можете определить макрос для каждой защищенной функции следующим образом:
#include <stdio.h>
#undef fread
#define fread(ptr, size, n, fp) \
(accessCheck(getpid(), (void (*)(void))fread ? (ssize_t)-1 : \
fread((ptr), (size), (n), (fp)))
Здесь getpid()
- это функция, которая возвращает текущий идентификатор процесса, а accessCheck
имеет прототип:
int accessCheck(pid_t pid, void (*fn)(void));
Здесь pid_t
- это тип идентификатора процесса. fn
является универсальным c указателем на функцию типа (void (*)(void))
. fn
, который не будет вызываться accessCheck
, будет проверяться только значение указателя. accessCheck
должен возвращать 0 в случае успеха или некоторое ненулевое значение в случае неудачи. В случае сбоя accessCheck
должен также установить errno
на подходящее значение.
Строки #include <stdio.h>
и #undef fread
обусловлены тем, что #include <stdio.h>
разрешено определять макрос fread
, который ведет себя так же, как функция fread
(хотя кажется маловероятным, что она это сделает), и мы хотим заменить этот макрос. Ссылки на fread
в тексте замены макроса допустимы, потому что макросы C не рекурсивны.