Я смотрю техническую заметку kauth , но это не совсем так. Это более общий вопрос разработки API.
Область для слушателя:
static int MyListener(
kauth_cred_t credential,
void * idata,
kauth_action_t action,
uintptr_t arg0,
uintptr_t arg1,
uintptr_t arg2,
uintptr_t arg3
);
arg0
... arg3
зависит от области действия (то есть контекста). Цитировать документацию:
Значение остальных параметров зависит от объема. в последующих разделах ... Например, для области VFS (KAUTH_SCOPE_VNODE) arg1 является ссылкой на vnode (типа vnode_t), с которым работает
Я предполагаю, что есть веская причина для этого дизайна, но я не вижу его. Что если я хочу добавить аргументы позже? Что если я захочу передать типы другого размера (в этом случае uintptr_t
определяется по типу unsigned long
, но что, если я хочу передать более крупную структуру?).
Пример такого рода проблемы можно увидеть в том же документе:
ВАЖНО: При проверке учетных данных, связанных с запросом, всегда используйте функции доступа, определенные в sys / kauth.h. Будьте особенно осторожны при тестировании на членство в группе. В Tiger пользователь может быть во множестве групп (намного больше, чем традиционный предел 16), и группы могут быть вложенными. Если вы хотите проверить, является ли пользователь членом группы, используйте kauth_cred_ismember_gid.
Если бы я реализовывал функцию API, которую можно вызывать с разными аргументами в разных контекстах, я бы передавал непрозрачный тип (то есть void *
) и предоставлял набор функций для извлечения данных из него. Функции меняются с API, будущее.
Итак, кто-нибудь может объяснить, почему авторы выбрали этот дизайн для оставшихся аргументов? Это чисто скорость (в конце концов, пути кода каута невероятно горячие)?