2009-11-06 4 views
5

Existe-t-il une fonction dans C sous Linux permettant d'interroger l'enregistrement MX (comme gethostbyname)?Interrogation de l'enregistrement MX dans C linux

+0

Ceci est un double d'un double. –

+0

Veuillez ne pas enlever ceci. D'autres postes n'ont pas de réponses complètes. Celui-ci rectifie complètement le problème. – avd

Répondre

7

Lien avec -lresolv (BIND libresolv).

#include <arpa/inet.h> 
#include <resolv.h> 
#include <string.h> 

int resolvmx(const char *name, char **mxs, int limit) { 
    unsigned char response[NS_PACKETSZ]; /* big enough, right? */ 
    ns_msg handle; 
    ns_rr rr; 
    int mx_index, ns_index, len; 
    char dispbuf[4096]; 

    if ((len = res_search(name, C_IN, T_MX, response, sizeof(response))) < 0) { 
     /* WARN: res_search failed */ 
     return -1; 
    } 

    if (ns_initparse(response, len, &handle) < 0) { 
     /* WARN: ns_initparse failed */ 
     return 0; 
    } 

    len = ns_msg_count(handle, ns_s_an); 
    if (len < 0) 
     return 0; 

    for (mx_index = 0, ns_index = 0; 
      mx_index < limit && ns_index < len; 
      ns_index++) { 
     if (ns_parserr(&handle, ns_s_an, ns_index, &rr)) { 
      /* WARN: ns_parserr failed */ 
      continue; 
     } 
     ns_sprintrr (&handle, &rr, NULL, NULL, dispbuf, sizeof (dispbuf)); 
     if (ns_rr_class(rr) == ns_c_in && ns_rr_type(rr) == ns_t_mx) { 
      char mxname[MAXDNAME]; 
      dn_expand(ns_msg_base(handle), ns_msg_base(handle) + ns_msg_size(handle), ns_rr_rdata(rr) + NS_INT16SZ, mxname, sizeof(mxname)); 
      mxs[mx_index++] = strdup(mxname); 
     } 
    } 

    return mx_index; 
} 
+0

Avons-nous besoin d'une bibliothèque externe pour exécuter ce programme? – avd

+0

Comme je l'ai déjà mentionné: cela nécessite 'libresolv', qui provient à l'origine du projet BIND (mais glibc en a une copie). – ephemient

+0

Comment installer cette bibliothèque? Ne pouvons-nous faire une requête MX sans bibliothèque externe? – avd

1

Je veux juste ajouter à la réponse ci-dessus. Je recevais des erreurs de compilation. Après avoir cherché, j'ai eu un forum sur la façon de compiler. Première utilisation principale fonction que (pour dire gmail.com)

main(){ 
char *mxs[10]; 
int a; 
printf("%d\n",a=resolvmx("gmail.com",mxs,10)); 
printf("%s\n",mxs[a-1]); 
} 

puis Compile comme

gcc <pname.c> /usr/lib/libresolv.a (instead of gcc pname.c -lresolv) 
+0

S'il vous manque '/ usr/lib/libresolv.so', vous devriez toujours utiliser' -Wl, -Bstatic -lresolv' au lieu de pointer directement vers 'libresolv.a'. – ephemient

+0

mais les options ci-dessus ne fonctionnent pas – avd

+0

Il n'est pas nécessaire de spécifier le chemin d'accès à la bibliothèque. Le problème que vous voyez probablement est qu'il existe des bibliothèques qui sont liées après '-lresolv' pour lesquelles aucune version statique n'est disponible. Donc, vous pouvez le faire à la place: '-Wl, -Bstatic -lresolv -Wl, -Bdynamic', ou plus succinctement:' -static -lresolv -dynamic'. – jxh