2009-05-23 8 views
1

Je tente de créer un wrapper autour de libdnet pour le langage de programmation D . Le problème que j'ai rencontré est de ne pas savoir quels sont les types soulignés pour eth_addr_t, ip_addr_t, et ip6_addr_t pendant que convertit addr.h. Le dernier type de mystère est sockaddrQu'est-ce que eth_addr_t et amis dans libdnet

Et je m'intéresse aussi à la raison pour laquelle il y a une boucle do while qui est toujours false.

#define addr_pack(addr, type, bits, data, len) do { \ 
    (addr)->addr_type = type; \ 
    (addr)->addr_bits = bits; \ 
    memmove((addr)->addr_data8, (char *)data, len); \ 
} while (0) 

est-il nécessaire pour C pour exécuter le code dans la macro?

Répondre

1

Ceci est une macro de définition pour le préprocesseur c. Ces backslashes à la fin est parce que c'est toute sa définition qui s'étend sur plusieurs lignes. Une boucle while while est comme une boucle while à l'exception de l'évaluation qui se fait à la fin, ce qui permet de toujours l'exécuter au moins une fois. Dans ce cas, le développeur a utilisé cette boucle while comme une sorte de hack pour permettre à son code d'être mis dans sa propre portée.

De eth.h dans le même répertoire:

typedef struct eth_addr { 
     uint8_t   data[ETH_ADDR_LEN]; 
} eth_addr_t; 

ip.h:

typedef uint32_t  ip_addr_t; 

ip6.h:

typedef struct ip6_addr { 
     uint8_t   data[IP6_ADDR_LEN]; 
} ip6_addr_t; 

honeyd-1.1.1/utilisé/WinSock.h:

/* 
* Structure used by kernel to store most 
* addresses. 
*/ 
struct sockaddr { 
     u_short sa_family;    /* address family */ 
     char sa_data[14];   /* up to 14 bytes of direct address */ 
}; 
+0

Merci, passé beaucoup de temps en utilisant grep et Google hier, je ne savais pas ce que je cherchais. Aussi je pense que le sockaddr que je cherche est de sys/socket.h –

0

Avez-vous jeté un oeil à htod? Il est supposé convertir automatiquement les fichiers .h en d déclarations.