• # qhookjk

    Posté par (courriel, site web personnel) . En réponse au message Sélection du DNS en fonction du nom à résoudre. Évalué à 10.

    Alors c'est pas vraiment documenté mais le resolver de la glibc donne accès à des hooks pré et post-résolution. Dans res_send.c :
     503 res_sendhookact act;
     504 
     505 struct sockaddr_in *nsap4;
     506 nsap4 = (struct sockaddr_in *) nsap;
     507 act = (*statp->qhook)(&nsap4, &buf, &buflen,
     508 ans, anssiz, &resplen);
     509 nsap = (struct sockaddr_in6 *) nsap4;
     510 switch (act) {
     511 case res_goahead:
     512 done = 1;
     513 break;
     514 case res_nextns:
     515 __res_iclose(statp, false);
     516 goto next_ns;
     517 case res_done:
     518 return (resplen);
     519 case res_modified:
     520 /* give the hook another try */
     521 if (++loops < 42) /*doug adams*/
     522 break;
     523 /*FALLTHROUGH*/
     524 case res_error:
     525 /*FALLTHROUGH*/
     526 default:
     527 return (-1);
     528 }
    Donc le truc c'est de placer le pointeur vers ta fonction qui va pouvoir faire un peu ce qu'elle veut, y compris décider d'utiliser l'un ou l'autre serveur de nom selon des critères arbitraires tels que le contenu de la requête. Soit tu va écrire dans _res.qhook directement, soit tu utilises res_send_setqhook() :
    197 void
    198 res_send_setqhook(res_send_qhook hook) {
    199 _res.qhook = hook;
    200 }
    Pour la déclaration de la fonction que tu vas écrire, voir resolv.h :
     71 typedef enum { res_goahead, res_nextns, res_modified, res_done, res_error }
     72 res_sendhookact;
     73 
     74 typedef res_sendhookact (*res_send_qhook) (struct sockaddr_in * const *__ns,
     75 const u_char **__query,
     76 int *__querylen,
     77 u_char *__ans,
     78 int __anssiz,
     79 int *__resplen);
     ..
    104 struct __res_state {
    ...
    126 res_send_qhook qhook; /* query hook */
    Donc une fois que tu as écrit ton myresolvhook.so, tu peux l'injecter partout avec LD_PRELOAD. Une alternative sur un système qui dispose du patch utrace serait d'utiliser stap -g. Et si t'as rien compris, utilise juste un serveur DNS.

    pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.