вот программа, вроде делал по example из мануала, но выдает какие-то нулевые адреса, посмотрите пожалуйста, в чем проблема:
cat resolver.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <ctype.h>
#include <linux/in.h>
#include <sysexits.h>
#define DNS_FILE_NAME ./dnsseeds.conf
#define LEN_OF_DNS 250
#define xstr(s) str(s)
#define str(s) #s
typedef struct stuffs_s stuffs_t;
struct stuffs_s {
char *line;
};
void trim_comments(char *);
void free_stuffs(stuffs_t *);
void trim_spaces(char *);
int EF_ALIGNMENT = 0;
int EF_PROTECT_FREE = 1;
int main(void)
{
int ret;
size_t len = LEN_OF_DNS;
ssize_t n;
FILE *seeds;
struct addrinfo hints, *res, *next;
stuffs_t *stuffs;
if ((stuffs = calloc(1, sizeof(stuffs_t))) == NULL) {
perror("calloc");
exit(EX__BASE);
}
if ((stuffs->line = malloc(sizeof(char) * LEN_OF_DNS)) == NULL) {
perror("malloc");
free_stuffs(stuffs);
exit(EX__BASE);
}
if ((seeds = fopen(xstr(DNS_FILE_NAME), "r")) == NULL) {
perror("fopen");
free_stuffs(stuffs);
exit(EX__BASE);
}
while ((n = getline(&stuffs->line, &len, seeds)) != -1) {
*(stuffs->line + n - 1) = '\0';
trim_comments(stuffs->line);
if (*stuffs->line == '\0')
continue;
printf("name is: %s\n", stuffs->line);
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_flags = AI_PASSIVE;
hints.ai_socktype = SOCK_DGRAM;
hints.ai_family = AF_UNSPEC;
if ((ret = getaddrinfo(stuffs->line, NULL, &hints, &res)) != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(ret));
free_stuffs(stuffs);
exit(EX__BASE);
}
for(next = res; next != NULL; next = next->ai_next) {
printf("%s ", inet_ntoa(((struct sockaddr_in *)next->ai_addr)->sin_addr));
printf("\n");
}
printf("\n");
freeaddrinfo(res);
}
fclose(seeds);
free_stuffs(stuffs);
exit(EX_OK);
}
void free_stuffs(stuffs_t *stuffs)
{
if (stuffs)
free(stuffs);
}
void trim_spaces(char *line)
{
while (*line)
if (isspace(*line))
memmove(line, line + 1, strlen(line));
else
line++;
}
void trim_comments(char *line)
{
char *ind;
trim_spaces(line);
ind = index(line, '#');
if (ind)
*ind = '\0';
}
вот файл dnsseeds.conf
google.com
вот такой вывод программы получаю:
$ ./a.out
name is: google.com
142.251.36.46
0.0.0.0
откуда берется 0.0.0.0, подскажите пожалуйста