Есть ли способ добавить к определенной группе функций вызов другой функции в C? - PullRequest
1 голос
/ 10 июля 2020

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

Итак, скажем, если одна из таких защищенных функций - fread(), я хочу, чтобы был сделан вызов: accessCheck(processId,fread) без необходимости вводить ее специально в том месте, где я хочу, чтобы вызов был сделан. Могу ли я каким-то образом определить fread() в каком-то месте, чтобы всегда было «protected», как это?

Это в C btw.

1 Ответ

0 голосов
/ 10 июля 2020

Вы можете определить макрос для каждой защищенной функции следующим образом:

#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 не рекурсивны.

...