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.