Je regarde le kauth tech note, mais ce n'est pas à ce sujet spécifiquement. C'est plus une question générale de conception d'API.Pourquoi les appels polymorphes (tels que l'écouteur dans kauth) ont-ils des arguments anonymes plutôt qu'un pointeur opaque et des fonctions d'accès?
Le champ d'application pour un auditeur est:
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
);
Le arg0
... arg3
dépendent de la portée (à savoir le contexte). Pour citer la documentation:
La signification des paramètres restants dépend de la portée. dans les sections suivantes ... Par exemple, pour le champ VFS (KAUTH_SCOPE_VNODE), arg1 est une référence à la vnode (de type vnode_t) qui est en cours opérés
Je suppose qu'il ya une bonne raison pour cela conception, mais je ne peux pas le voir. Que faire si je veux ajouter des arguments plus tard? Que faire si je veux passer en types de tailles différentes (dans ce cas, uintptr_t
est typedefed à unsigned long
mais si je voulais passer dans une structure plus grande?).
Un exemple de ce genre de question peut être vu dans le même document:
IMPORTANT: Lors du contrôle des informations d'identification associés à une demande, utilisez toujours les fonctions accesseurs définies dans sys/kauth.h. Soyez particulièrement prudent lors des tests d'appartenance à un groupe. Dans Tiger un utilisateur peut être dans beaucoup de groupes (beaucoup plus que la limite traditionnelle de 16) et les groupes peuvent être imbriqués. Si vous voulez tester si un utilisateur est membre d'un groupe, utilisez kauth_cred_ismember_gid.
Si j'exécutaient une fonction API qui peut être appelée avec des arguments différents dans des contextes différents, je passerais dans un type opaque (à savoir un void *
) et de fournir un ensemble de fonctions pour extraire les données. Les fonctions changent avec l'API, futureproof. Donc, quelqu'un peut-il donner un aperçu de la raison pour laquelle les auteurs ont pu choisir cette conception pour les arguments restants? Est-ce purement la vitesse (les chemins de code de kauth sont incroyablement chauds après tout)?