summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2005-08-05 23:51:50 +0000
committerLennart Poettering <lennart@poettering.net>2005-08-05 23:51:50 +0000
commite1792064898bbce2c4d7574ada82a06f5e19d47f (patch)
treec78959aca285aaa06427edc2398bd16376949f13
parent6dc69c9a94e128f6703ddfcc38c253f0c8cc9d7b (diff)
* require automake 1.9
* bump version number * fix a lot of problems detected after compilation with excessive warnings * merge patch from Sean Meiners, adding search list support * update for newer avahi git-svn-id: file:///home/lennart/svn/public/nss-mdns/trunk@82 0ee8848e-81ea-0310-a63a-f631d1a40d77
-rwxr-xr-xbootstrap.sh10
-rw-r--r--configure.ac6
-rw-r--r--src/Makefile.am6
-rw-r--r--src/avahi-test.c12
-rw-r--r--src/avahi.c43
-rw-r--r--src/avahi.h1
-rw-r--r--src/dns.c32
-rw-r--r--src/dns.h4
-rw-r--r--src/mdns-test.c2
-rw-r--r--src/nss-test.c6
-rw-r--r--src/nss.c319
-rw-r--r--src/query.c8
12 files changed, 338 insertions, 111 deletions
diff --git a/bootstrap.sh b/bootstrap.sh
index a9feb8b..5c51524 100755
--- a/bootstrap.sh
+++ b/bootstrap.sh
@@ -17,6 +17,8 @@
# along with nss-mdns; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+VERSION=1.9
+
run_versioned() {
local P
type -p "$1-$2" &> /dev/null && P="$1-$2" || local P="$1"
@@ -27,7 +29,7 @@ run_versioned() {
if [ "x$1" = "xam" ] ; then
set -ex
- run_versioned automake 1.8 -a -c --foreign
+ run_versioned automake "$VERSION" -a -c --foreign
./config.status
else
set -ex
@@ -35,13 +37,13 @@ else
rm -rf autom4te.cache
rm -f config.cache
- run_versioned aclocal 1.8
+ run_versioned aclocal "$VERSION"
libtoolize -c --force
autoheader
- run_versioned automake 1.8 -a -c --foreign
+ run_versioned automake "$VERSION" -a -c --foreign
autoconf -Wall
- CFLAGS="-g -O0" ./configure --sysconfdir=/etc "$@"
+ CFLAGS="$CFLAGS -g -O0" ./configure --sysconfdir=/etc --localstatedir=/var "$@"
make clean
fi
diff --git a/configure.ac b/configure.ac
index e8d42ce..c50c10c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -21,15 +21,17 @@
# USA.
AC_PREREQ(2.57)
-AC_INIT([nss-mdns],[0.5],[mzaffzqaf (at) 0pointer (dot) de])
+AC_INIT([nss-mdns],[0.6],[mzaffzqaf (at) 0pointer (dot) de])
AC_CONFIG_SRCDIR([src/query.c])
AC_CONFIG_HEADERS([config.h])
-AM_INIT_AUTOMAKE([foreign -Wall])
+AM_INIT_AUTOMAKE([foreign 1.9 -Wall])
AC_SUBST(PACKAGE_URL, [http://0pointer.de/lennart/projects/nss-mdns/])
ac_default_prefix="/"
+AC_GNU_SOURCE
+
# Checks for programs.
AC_PROG_CC
AC_PROG_CPP
diff --git a/src/Makefile.am b/src/Makefile.am
index ac24af2..6e537cf 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -17,7 +17,11 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
# USA.
-AM_CFLAGS=-D_GNU_SOURCE -DMDNS_ALLOW_FILE=\"$(sysconfdir)/mdns.allow\"
+AM_CFLAGS = \
+ -DMDNS_ALLOW_FILE=\"$(sysconfdir)/mdns.allow\" \
+ -DRESOLV_CONF_FILE=\"$(sysconfdir)/resolv.conf\" \
+ -DAVAHI_SOCKET=\"$(localstatedir)/run/avahi-daemon/socket\"
+
#-DNDEBUG=1
# This cool debug trap works on i386/gcc only
diff --git a/src/avahi-test.c b/src/avahi-test.c
index e66421e..b1be16d 100644
--- a/src/avahi-test.c
+++ b/src/avahi-test.c
@@ -29,17 +29,17 @@ int main(int argc, char *argv[]) {
char t[256];
int r;
- if ((r = avahi_resolve_name(AF_INET, argc >= 2 ? argv[1] : "whiskey.local", data)) == 0)
+ if ((r = avahi_resolve_name(AF_INET, argc >= 2 ? argv[1] : "cocaine.local", data)) == 0)
printf("AF_INET: %s\n", inet_ntop(AF_INET, data, t, sizeof(t)));
else
printf("AF_INET: failed (%i).\n", r);
- if ((r = avahi_resolve_name(AF_INET6, argc >= 2 ? argv[1] : "whiskey.local", data)) == 0)
- printf("AF_INET6: %s\n", inet_ntop(AF_INET6, data, t, sizeof(t)));
- else
- printf("AF_INET6: failed (%i).\n", r);
+/* if ((r = avahi_resolve_name(AF_INET6, argc >= 2 ? argv[1] : "cocaine.local", data)) == 0) */
+/* printf("AF_INET6: %s\n", inet_ntop(AF_INET6, data, t, sizeof(t))); */
+/* else */
+/* printf("AF_INET6: failed (%i).\n", r); */
- if ((r = avahi_resolve_address(AF_INET6, data, t, sizeof(t))) == 0)
+ if ((r = avahi_resolve_address(AF_INET, data, t, sizeof(t))) == 0)
printf("REVERSE: %s\n", t);
else
printf("REVERSE: failed (%i).\n", r);
diff --git a/src/avahi.c b/src/avahi.c
index cd4db00..96ce615 100644
--- a/src/avahi.c
+++ b/src/avahi.c
@@ -19,6 +19,9 @@
USA.
***/
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
#include <sys/socket.h>
#include <string.h>
@@ -32,7 +35,7 @@
#include "avahi.h"
#include "util.h"
-#define AVAHI_SOCKET "/var/run/avahi/socket"
+#define WHITESPACE " \t"
static FILE *open_socket(void) {
int fd = -1;
@@ -67,7 +70,7 @@ fail:
int avahi_resolve_name(int af, const char* name, void* data) {
FILE *f;
- char *e, *p;
+ char *p;
int ret = -1;
char ln[256];
@@ -88,9 +91,22 @@ int avahi_resolve_name(int af, const char* name, void* data) {
}
p = ln+1;
- p += strspn(p, "\t ");
- e = p + strcspn(p, "\n\r\t ");
- *e = 0;
+ p += strspn(p, WHITESPACE);
+
+ /* Skip interface */
+ p += strcspn(p, WHITESPACE);
+ p += strspn(p, WHITESPACE);
+
+ /* Skip protocol */
+ p += strcspn(p, WHITESPACE);
+ p += strspn(p, WHITESPACE);
+
+ /* Skip host name */
+ p += strcspn(p, WHITESPACE);
+ p += strspn(p, WHITESPACE);
+
+ /* Cut off end of line */
+ *(p + strcspn(p, "\n\r\t ")) = 0;
if (inet_pton(af, p, data) <= 0)
goto finish;
@@ -107,7 +123,7 @@ finish:
int avahi_resolve_address(int af, const void *data, char* name, size_t name_len) {
FILE *f;
- char *e, *p;
+ char *p;
int ret = -1;
char a[256], ln[256];
@@ -127,9 +143,18 @@ int avahi_resolve_address(int af, const void *data, char* name, size_t name_len)
}
p = ln+1;
- p += strspn(p, "\t ");
- e = p + strcspn(p, "\n\r\t ");
- *e = 0;
+ p += strspn(p, WHITESPACE);
+
+ /* Skip interface */
+ p += strcspn(p, WHITESPACE);
+ p += strspn(p, WHITESPACE);
+
+ /* Skip protocol */
+ p += strcspn(p, WHITESPACE);
+ p += strspn(p, WHITESPACE);
+
+ /* Cut off end of line */
+ *(p + strcspn(p, "\n\r\t ")) = 0;
strncpy(name, p, name_len-1);
name[name_len-1] = 0;
diff --git a/src/avahi.h b/src/avahi.h
index 79d1c86..5315b80 100644
--- a/src/avahi.h
+++ b/src/avahi.h
@@ -22,7 +22,6 @@
USA.
***/
-
#include <inttypes.h>
#include <sys/types.h>
diff --git a/src/dns.c b/src/dns.c
index b32dc2f..61c66d8 100644
--- a/src/dns.c
+++ b/src/dns.c
@@ -46,16 +46,16 @@ void dns_packet_free(struct dns_packet *p) {
free(p);
}
-void dns_packet_set_field(struct dns_packet *p, unsigned index, uint16_t v) {
- assert(p && index < 2*6);
+void dns_packet_set_field(struct dns_packet *p, unsigned idx, uint16_t v) {
+ assert(p && idx < 2*6);
- ((uint16_t*) p->data)[index] = htons(v);
+ ((uint16_t*) p->data)[idx] = htons(v);
}
-uint16_t dns_packet_get_field(struct dns_packet *p, unsigned index) {
- assert(p && index < 2*6);
+uint16_t dns_packet_get_field(struct dns_packet *p, unsigned idx) {
+ assert(p && idx < 2*6);
- return ntohs(((uint16_t*) p->data)[index]);
+ return ntohs(((uint16_t*) p->data)[idx]);
}
uint8_t* dns_packet_append_name(struct dns_packet *p, const char *name) {
@@ -161,7 +161,7 @@ int dns_packet_check_valid_response(struct dns_packet *p) {
}
-static ssize_t consume_labels(struct dns_packet *p, size_t index, char *ret_name, size_t l) {
+static ssize_t consume_labels(struct dns_packet *p, size_t idx, char *ret_name, size_t l) {
ssize_t ret = 0;
int compressed = 0;
int first_label = 1;
@@ -170,13 +170,13 @@ static ssize_t consume_labels(struct dns_packet *p, size_t index, char *ret_name
for (;;) {
uint8_t n;
- if (index+1 > p->size)
+ if (idx+1 > p->size)
return -1;
- n = p->data[index];
+ n = p->data[idx];
if (!n) {
- index++;
+ idx++;
if (!compressed)
ret++;
@@ -188,11 +188,11 @@ static ssize_t consume_labels(struct dns_packet *p, size_t index, char *ret_name
} else if (n <= 63) {
/* Uncompressed label */
- index++;
+ idx++;
if (!compressed)
ret++;
- if (index + n > p->size)
+ if (idx + n > p->size)
return -1;
if ((size_t) n + 1 > l)
@@ -204,8 +204,8 @@ static ssize_t consume_labels(struct dns_packet *p, size_t index, char *ret_name
} else
first_label = 0;
- memcpy(ret_name, p->data + index, n);
- index += n;
+ memcpy(ret_name, p->data + idx, n);
+ idx += n;
ret_name += n;
l -= n;
@@ -214,10 +214,10 @@ static ssize_t consume_labels(struct dns_packet *p, size_t index, char *ret_name
} else if ((n & 0xC0) == 0xC0) {
/* Compressed label */
- if (index+2 > p->size)
+ if (idx+2 > p->size)
return -1;
- index = ((size_t) (p->data[index] & ~0xC0)) << 8 | p->data[index+1];
+ idx = ((size_t) (p->data[idx] & ~0xC0)) << 8 | p->data[idx+1];
if (!compressed)
ret += 2;
diff --git a/src/dns.h b/src/dns.h
index 13e0f1d..54803ab 100644
--- a/src/dns.h
+++ b/src/dns.h
@@ -32,8 +32,8 @@ struct dns_packet {
struct dns_packet* dns_packet_new(void);
void dns_packet_free(struct dns_packet *p);
-void dns_packet_set_field(struct dns_packet *p, unsigned index, uint16_t v);
-uint16_t dns_packet_get_field(struct dns_packet *p, unsigned index);
+void dns_packet_set_field(struct dns_packet *p, unsigned idx, uint16_t v);
+uint16_t dns_packet_get_field(struct dns_packet *p, unsigned idx);
uint8_t *dns_packet_append_uint16(struct dns_packet *p, uint16_t v);
uint8_t *dns_packet_append_name(struct dns_packet *p, const char *name);
diff --git a/src/mdns-test.c b/src/mdns-test.c
index e3c7981..81c0625 100644
--- a/src/mdns-test.c
+++ b/src/mdns-test.c
@@ -30,7 +30,7 @@
#include "query.h"
static void ipv4_func(const ipv4_address_t *ipv4, void *userdata) {
- fprintf(stderr, "IPV4: %s\n", inet_ntoa(*(struct in_addr*) &ipv4->address));
+ fprintf(stderr, "IPV4: %s\n", inet_ntoa(*(const struct in_addr*) &ipv4->address));
}
static void ipv6_func(const ipv6_address_t *ipv6, void *userdata) {
diff --git a/src/nss-test.c b/src/nss-test.c
index 78aecde..6418566 100644
--- a/src/nss-test.c
+++ b/src/nss-test.c
@@ -32,7 +32,7 @@
int main(int argc, char *argv[]) {
struct hostent *he;
in_addr_t **a;
- char *arg= argc > 1 ? argv[1] : "whiskey.local";
+ const char *arg= argc > 1 ? argv[1] : "cocaine.local";
uint8_t t[256];
if (inet_pton(AF_INET, arg, &t) > 0)
@@ -64,8 +64,8 @@ int main(int argc, char *argv[]) {
fprintf(stderr, "addresses:");
for (a = (in_addr_t**) he->h_addr_list; *a; a++) {
- char t[256];
- fprintf(stderr, " %s", inet_ntop(he->h_addrtype, *a, t, sizeof(t)));
+ char txt[256];
+ fprintf(stderr, " %s", inet_ntop(he->h_addrtype, *a, txt, sizeof(txt)));
}
fprintf(stderr, "\n");
diff --git a/src/nss.c b/src/nss.c
index c54db7b..e8746fe 100644
--- a/src/nss.c
+++ b/src/nss.c
@@ -1,22 +1,22 @@
/* $Id$ */
/***
- This file is part of nss-mdns.
+ This file is part of nss-mdns.
- nss-mdns is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published
- by the Free Software Foundation; either version 2 of the License,
- or (at your option) any later version.
+ nss-mdns is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 2 of the License,
+ or (at your option) any later version.
- nss-mdns is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
+ nss-mdns is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with nss-mdns; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- USA.
+ You should have received a copy of the GNU Lesser General Public License
+ along with nss-mdns; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ USA.
***/
#ifdef HAVE_CONFIG_H
@@ -31,6 +31,7 @@
#include <sys/socket.h>
#include <nss.h>
#include <stdio.h>
+#include <stdlib.h>
#include "query.h"
@@ -50,6 +51,9 @@
#define _nss_mdns_gethostbyaddr_r _nss_mdns6_gethostbyaddr_r
#endif
+/* the resolv conf page states that they only support 6 domains */
+#define MAX_SEARCH_DOMAINS 6
+
struct userdata {
int count;
int data_len; /* only valid when doing reverse lookup */
@@ -149,6 +153,110 @@ static int verify_name_allowed(const char *name) {
return valid;
}
+static char **alloc_domains(unsigned ndomains) {
+ char **domains;
+
+ if (!(domains = malloc(sizeof(char*) * ndomains)))
+ return NULL;
+
+ /* initialize them all to 0 */
+ memset(domains, 0, sizeof(char*) * ndomains);
+ return domains;
+}
+
+static void free_domains(char **domains) {
+ char **p;
+
+ if (!domains)
+ return;
+
+ for(p = domains; *p; p++)
+ free(*p);
+
+ free(domains);
+}
+
+static char** parse_domains(const char *domains_in) {
+ /* leave room for the NULL terminator */
+ char **domains_out;
+ const char *start = domains_in;
+ unsigned domain = 0;
+
+ if (!(domains_out = alloc_domains(MAX_SEARCH_DOMAINS+1)))
+ return NULL;
+
+ while (domain < MAX_SEARCH_DOMAINS) {
+ const char *end;
+ char *tmp;
+ size_t domain_len;
+
+ end = start + strcspn(start, " \t\r\n");
+ domain_len = (end - start);
+
+ if (!(tmp = malloc(domain_len + 1)))
+ break;
+
+ memcpy(tmp, start, domain_len);
+ tmp[domain_len] = '\0';
+
+ domains_out[domain++] = tmp;
+
+ end += strspn(end," \t\r\n");
+
+ if (!*end)
+ break;
+
+ start = end;
+ }
+
+ return domains_out;
+}
+
+static char** get_search_domains(void) {
+ FILE *f = 0;
+ char **domains = NULL;
+
+ /* according to the resolv.conf man page (in Linux) the LOCALDOMAIN
+ environment variable should override the settings in the resolv.conf file */
+ char *line = getenv("LOCALDOMAIN");
+ if (line && *line != 0)
+ return parse_domains(line);
+
+ if (!(f = fopen(RESOLV_CONF_FILE, "r")))
+ return NULL;
+
+ while (!feof(f)) {
+ char *start = NULL;
+ char ln[512];
+
+ if (!fgets(ln, sizeof(ln), f))
+ break;
+
+ start = ln + strspn(ln, " \t\r\n");
+
+ if (strncmp(start, "search", 6) && strncmp(start, "domain", 6))
+ continue;
+
+ if (start[6] != ' ' && start[6] != '\t')
+ continue;
+
+ /* scan to the end of the keyword ('search' or 'domain' currently) */
+ start += strcspn(start, " \t\r\n");
+
+ /* find the begining of the first domain in the list */
+ start += strspn(start, " \t\r\n");
+
+ /* the resolv.conf manpage also states that 'search' and 'domain' are mutually exclusive
+ and that the last one wins. */
+ free_domains(domains);
+ domains = parse_domains(start);
+ }
+
+ fclose(f);
+
+ return domains;
+}
+
enum nss_status _nss_mdns_gethostbyname2_r(
const char *name,
int af,
@@ -160,12 +268,14 @@ enum nss_status _nss_mdns_gethostbyname2_r(
struct userdata u;
enum nss_status status = NSS_STATUS_UNAVAIL;
- int fd = -1, r, i;
- size_t address_length, l, index, astart;
+ int fd = -1, i;
+ size_t address_length, l, idx, astart;
void (*ipv4_func)(const ipv4_address_t *ipv4, void *userdata);
void (*ipv6_func)(const ipv6_address_t *ipv6, void *userdata);
+ int name_allowed;
#ifdef ENABLE_AVAHI
+ int avahi_works = 1;
uint8_t data[128];
#endif
@@ -184,13 +294,6 @@ enum nss_status _nss_mdns_gethostbyname2_r(
goto finish;
}
- if (! verify_name_allowed(name)) {
- *errnop = ENOENT;
- *h_errnop = HOST_NOT_FOUND;
- status = NSS_STATUS_NOTFOUND;
- goto finish;
- }
-
address_length = af == AF_INET ? sizeof(ipv4_address_t) : sizeof(ipv6_address_t);
if (buflen <
sizeof(char*)+ /* alias names */
@@ -218,51 +321,143 @@ enum nss_status _nss_mdns_gethostbyname2_r(
ipv6_func = af == AF_INET6 ? ipv6_callback : NULL;
#endif
+ name_allowed = verify_name_allowed(name);
+
#ifdef ENABLE_AVAHI
- if ((r = avahi_resolve_name(af, name, data)) == 0) {
- if (af == AF_INET && ipv4_func)
- ipv4_func((ipv4_address_t*) data, &u);
- if (af == AF_INET6 && ipv4_func)
- ipv6_func((ipv6_address_t*)data, &u);
- } else if (r > 0) {
- *errnop = ETIMEDOUT;
- *h_errnop = HOST_NOT_FOUND;
- goto finish;
+ if (avahi_works && name_allowed) {
+ int r;
+
+ if ((r = avahi_resolve_name(af, name, data)) < 0)
+ avahi_works = 0;
+ else if (r == 0) {
+ if (af == AF_INET && ipv4_func)
+ ipv4_func((ipv4_address_t*) data, &u);
+ if (af == AF_INET6 && ipv6_func)
+ ipv6_func((ipv6_address_t*)data, &u);
+ }
+
}
-
+
+ if (u.count == 0 && avahi_works && !ends_with(name, ".")) {
+ char **domains;
+
+ if ((domains = get_search_domains())) {
+ char **p;
+
+ /* Try to concatenate host names */
+ for (p = domains; *p; p++) {
+ int fullnamesize;
+ char *fullname;
+
+ fullnamesize = strlen(name) + strlen(*p) + 2;
+
+ if (!(fullname = malloc(fullnamesize)))
+ break;
+
+ snprintf(fullname, fullnamesize, "%s.%s", name, *p);
+
+ if (verify_name_allowed(fullname)) {
+ int r;
+
+ r = avahi_resolve_name(af, fullname, data);
+ free(fullname);
+
+ if (r < 0) {
+ avahi_works = 0;
+ break;
+ } else if (r == 0) {
+ if (af == AF_INET && ipv4_func)
+ ipv4_func((ipv4_address_t*) data, &u);
+ if (af == AF_INET6 && ipv6_func)
+ ipv6_func((ipv6_address_t*)data, &u);
+ break;
+ }
+
+ } else
+ free(fullname);
+ }
+
+ free_domains(domains);
+ }
+ }
+
+
+ if (u.count == 0 && !avahi_works) {
#endif
- if (u.count == 0) {
if ((fd = mdns_open_socket()) < 0) {
-
*errnop = errno;
*h_errnop = NO_RECOVERY;
goto finish;
}
-
- if ((r = mdns_query_name(fd, name, ipv4_func, ipv6_func, &u)) < 0) {
- *errnop = ETIMEDOUT;
- *h_errnop = HOST_NOT_FOUND;
- goto finish;
+
+ if (name_allowed)
+ /* Ignore return value */
+ mdns_query_name(fd, name, ipv4_func, ipv6_func, &u);
+
+ if (u.count == 0 && !ends_with(name, ".")) {
+ char **domains;
+
+ /* Try the search domains if the user did not use a traling '.' */
+
+ if ((domains = get_search_domains())) {
+ char **p;
+
+ for (p = domains; *p; p++) {
+ int fullnamesize = 0;
+ char *fullname = NULL;
+
+ fullnamesize = strlen(name) + strlen(*p) + 2;
+ if (!(fullname = malloc(fullnamesize)))
+ break;
+
+ snprintf(fullname, fullnamesize, "%s.%s", name, *p);
+
+ if (verify_name_allowed(fullname)) {
+
+ /* Ignore return value */
+ mdns_query_name(fd, fullname, ipv4_func, ipv6_func, &u);
+
+ if (u.count > 0) {
+ /* We found somethings, so let's quit */
+ free(fullname);
+ break;
+ }
+ }
+
+ free(fullname);
+ }
+
+ free_domains(domains);
+ }
}
+
+#ifdef ENABLE_AVAHI
}
-
+#endif
+
+ if (u.count == 0) {
+ *errnop = ETIMEDOUT;
+ *h_errnop = HOST_NOT_FOUND;
+ goto finish;
+ }
+
/* Alias names */
*((char**) buffer) = NULL;
result->h_aliases = (char**) buffer;
- index = sizeof(char*);
+ idx = sizeof(char*);
/* Official name */
- strcpy(buffer+index, name);
- result->h_name = buffer+index;
- index += strlen(name)+1;
+ strcpy(buffer+idx, name);
+ result->h_name = buffer+idx;
+ idx += strlen(name)+1;
result->h_addrtype = af;
result->h_length = address_length;
/* Check if there's enough space for the addresses */
- if (buflen < index+u.data_len+sizeof(char*)*(u.count+1)) {
+ if (buflen < idx+u.data_len+sizeof(char*)*(u.count+1)) {
*errnop = ERANGE;
*h_errnop = NO_RECOVERY;
status = NSS_STATUS_TRYAGAIN;
@@ -270,17 +465,17 @@ enum nss_status _nss_mdns_gethostbyname2_r(
}
/* Addresses */
- astart = index;
+ astart = idx;
l = u.count*address_length;
memcpy(buffer+astart, &u.data, l);
- index += l;
+ idx += l;
/* Address array */
for (i = 0; i < u.count; i++)
- ((char**) (buffer+index))[i] = buffer+astart+address_length*i;
- ((char**) (buffer+index))[i] = NULL;
+ ((char**) (buffer+idx))[i] = buffer+astart+address_length*i;
+ ((char**) (buffer+idx))[i] = NULL;
- result->h_addr_list = (char**) (buffer+index);
+ result->h_addr_list = (char**) (buffer+idx);
status = NSS_STATUS_SUCCESS;
@@ -326,7 +521,7 @@ enum nss_status _nss_mdns_gethostbyaddr_r(
struct userdata u;
enum nss_status status = NSS_STATUS_UNAVAIL;
int fd = -1, r;
- size_t address_length, index, astart;
+ size_t address_length, idx, astart;
#ifdef ENABLE_AVAHI
char t[256];
#endif
@@ -389,13 +584,13 @@ enum nss_status _nss_mdns_gethostbyaddr_r(
if (af == AF_INET)
#endif
#ifndef NSS_IPV6_ONLY
- r = mdns_query_ipv4(fd, (ipv4_address_t*) addr, name_callback, &u);
+ r = mdns_query_ipv4(fd, (const ipv4_address_t*) addr, name_callback, &u);
#endif
#if ! defined(NSS_IPV6_ONLY) && ! defined(NSS_IPV4_ONLY)
else
#endif
#ifndef NSS_IPV4_ONLY
- r = mdns_query_ipv6(fd, (ipv6_address_t*) addr, name_callback, &u);
+ r = mdns_query_ipv6(fd, (const ipv6_address_t*) addr, name_callback, &u);
#endif
if (r < 0) {
@@ -408,7 +603,7 @@ enum nss_status _nss_mdns_gethostbyaddr_r(
/* Alias names */
*((char**) buffer) = NULL;
result->h_aliases = (char**) buffer;
- index = sizeof(char*);
+ idx = sizeof(char*);
assert(u.count > 0 && u.data.name[0]);
if (buflen <
@@ -424,22 +619,22 @@ enum nss_status _nss_mdns_gethostbyaddr_r(
}
/* Official name */
- strcpy(buffer+index, u.data.name[0]);
- result->h_name = buffer+index;
- index += strlen(u.data.name[0])+1;
+ strcpy(buffer+idx, u.data.name[0]);
+ result->h_name = buffer+idx;
+ idx += strlen(u.data.name[0])+1;
result->h_addrtype = af;
result->h_length = address_length;
/* Address */
- astart = index;
+ astart = idx;
memcpy(buffer+astart, addr, address_length);
- index += address_length;
+ idx += address_length;
/* Address array */
- ((char**) (buffer+index))[0] = buffer+astart;
- ((char**) (buffer+index))[1] = NULL;
- result->h_addr_list = (char**) (buffer+index);
+ ((char**) (buffer+idx))[0] = buffer+astart;
+ ((char**) (buffer+idx))[1] = NULL;
+ result->h_addr_list = (char**) (buffer+idx);
status = NSS_STATUS_SUCCESS;
diff --git a/src/query.c b/src/query.c
index 32401fc..8079a3d 100644
--- a/src/query.c
+++ b/src/query.c
@@ -171,13 +171,13 @@ static int send_dns_packet(int fd, struct dns_packet *p) {
}
for (i = 0, n = ifconf.ifc_len/sizeof(struct ifreq); i < n; i++) {
- struct sockaddr_in *sa;
+ struct sockaddr_in *ifsa;
u_int32_t s_addr;
/* Check if this is the loopback device or any other invalid interface */
- sa = (struct sockaddr_in*) &ifreq[i].ifr_addr;
- s_addr = htonl(sa->sin_addr.s_addr);
- if (sa->sin_family != AF_INET ||
+ ifsa = (struct sockaddr_in*) &ifreq[i].ifr_addr;
+ s_addr = htonl(ifsa->sin_addr.s_addr);
+ if (ifsa->sin_family != AF_INET ||
s_addr == INADDR_LOOPBACK ||
s_addr == INADDR_ANY ||
s_addr == INADDR_BROADCAST)