fixed gethostname() and freeaddrinfo() calls (#73)

* util: Fix gethostname() and freeaddrinfo() calls

I was passing the wrong size to the 'gethostname()' call because the
'hostname' is now dynamically allocated and cannot use 'sizeof' to get
its size.  This mistake causes that the obtained hostname is empty.

The 'freeaddrinfo()' was placed at the wrong place.  Fix it.

Fallback to '_POSIX_HOST_NAME_MAX' if 'sysconf()' fails.

Always null-terminate the 'hostname'.

* util: Simplify hostname() as no need to call getaddrinfo()

There is no need to call 'getaddrinfo()' to determine the hostname of
the machine, gethostname() is enough.  This simplify the 'hostname()'
a lot.

Trim a trailing whitespace by the way.
This commit is contained in:
Aaron LI 2018-10-06 23:06:21 +08:00 committed by Cylgom
parent 9b2b6fd70b
commit 360bcb941a
1 changed files with 17 additions and 32 deletions

View File

@ -6,7 +6,6 @@
#include <string.h>
#include <unistd.h>
// hostname
#include <limits.h>
#include <stdio.h>
#include <sys/types.h>
@ -17,49 +16,35 @@
#include <sys/ioctl.h>
#include <linux/vt.h>
char* hostname_backup;
static char* hostname_backup = NULL;
void hostname(char** out)
{
struct addrinfo hints;
struct addrinfo* info;
char* hostname;
char* dot;
int host_name_max;
int result;
if ((host_name_max = sysconf(_SC_HOST_NAME_MAX)) == -1)
if (hostname_backup != NULL)
{
perror("sysconf(_SC_HOST_NAME_MAX)");
exit(1);
*out = hostname_backup;
return;
}
if ((hostname = malloc(host_name_max+1)) == NULL)
int maxlen = sysconf(_SC_HOST_NAME_MAX);
if (maxlen < 0)
{
maxlen = _POSIX_HOST_NAME_MAX;
}
if ((hostname_backup = malloc(maxlen + 1)) == NULL)
{
perror("malloc");
exit(1);
}
gethostname(hostname, sizeof(hostname));
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_CANONNAME;
result = getaddrinfo(hostname, "http", &hints, &info);
if ((result == 0) && (info != NULL))
if (gethostname(hostname_backup, maxlen) < 0)
{
dot = strchr(info->ai_canonname, '.');
*out = strndup(info->ai_canonname, dot - info->ai_canonname);
perror("gethostname");
exit(1);
}
else
{
*out = strdup("");
}
hostname_backup = *out;
freeaddrinfo(info);
free(hostname);
hostname_backup[maxlen] = '\0';
*out = hostname_backup;
}
void free_hostname()