Friday 30 July 2004
gethostname et FQDN
Plusieurs programmes ont besoin d'avoir le FQDN de l'hôte sur lequel ils tournent, notamment lorsqu'ils communiquent avec des programmes ou des personnes utilisant une autre machine. Le réflexe naturel est d'utiliser gethostname
. Seulement voilà : gethostname
peut parfois retourner le nom de l'hôte, sans le domaine. Ainsi, il est possible que gethostname renvoie 3rivieres
alors que je souhaite obtenir 3rivieres.vuntz.net
. Et le problème est qu'il n'y a pas de recette miracle pour obtenir directement 3rivieres.vuntz.net
. Il faut mettre les mains dans le cambouis. Voici un petit exemple de code qui montre comment faire.
#include <errno.h> #include <netdb.h> #include <stdio.h> #include <string.h> #include <unistd.h> #ifndef HOST_NAME_MAX #define HOST_NAME_MAX 255 #endif static void is_fqdn (char *display, char *name) { if (strchr (name, '.') != NULL) { if (strncasecmp (name, "localhost", 9) == 0) { printf ("%s is a FQDN, but it's localhost: " "%s\n", display, name); } else { printf ("%s is a FQDN: %s\n", display, name); } } else { printf ("%s isn't a FQDN: %s\n", display, name); } } int main (int argc, char **argv) { char hostname[HOST_NAME_MAX]; struct hostent *he; char **alias; char buffer[64]; if (gethostname (hostname, HOST_NAME_MAX)) { perror("gethostname"); return 1; } /* man gethostname(2): we don't know if hostname is NUL-terminated */ hostname[HOST_NAME_MAX - 1] = '\0'; is_fqdn ("gethostname return value", hostname); he = gethostbyname (hostname); if (he == NULL) { herror ("gethostbyname"); return 1; } is_fqdn ("The name returned by gethostbyname", he->h_name); alias = he->h_aliases; while (alias && *alias) { snprintf (buffer, 64, "Alias %d returned by gethostbyname", alias + 1 - he->h_aliases); is_fqdn (buffer, *alias); alias++; } return 0; }
Allez, maintenant, j'envoie un petit patch aux auteurs de libspf2 pour pouvoir fermer mon bug.
Comments
1. Laurent [30/07/2004@14:00]
2. Vincent [30/07/2004@14:34]
3. Vincent [30/07/2004@15:19]
4. Laurent [31/07/2004@08:58]
5. Vincent [01/08/2004@17:26]