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() :
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.
# qhookjk
Posté par Krunch (courriel, site web personnel) . En réponse au message Sélection du DNS en fonction du nom à résoudre. Évalué à 10.
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.