diff options
Diffstat (limited to 'lib/irs')
-rw-r--r-- | lib/irs/Makefile.in | 4 | ||||
-rw-r--r-- | lib/irs/api | 4 | ||||
-rw-r--r-- | lib/irs/getaddrinfo.c | 18 | ||||
-rw-r--r-- | lib/irs/include/irs/Makefile.in | 4 | ||||
-rw-r--r-- | lib/irs/include/irs/resconf.h | 14 | ||||
-rw-r--r-- | lib/irs/resconf.c | 93 |
6 files changed, 78 insertions, 59 deletions
diff --git a/lib/irs/Makefile.in b/lib/irs/Makefile.in index d3c47b0137aa..c59af263fe4b 100644 --- a/lib/irs/Makefile.in +++ b/lib/irs/Makefile.in @@ -1,4 +1,4 @@ -# Copyright (C) 2009, 2012 Internet Systems Consortium, Inc. ("ISC") +# Copyright (C) 2009, 2012, 2014 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above @@ -39,7 +39,7 @@ OBJS = context.@O@ \ # Alphabetically SRCS = context.c \ dnsconf.c \ - gai_sterror.c getaddrinfo.c getnameinfo.c \ + gai_strerror.c getaddrinfo.c getnameinfo.c \ resconf.c LIBS = @LIBS@ diff --git a/lib/irs/api b/lib/irs/api index 5c8dd5e14db7..e8130a2ceac4 100644 --- a/lib/irs/api +++ b/lib/irs/api @@ -4,6 +4,6 @@ # 9.8: 80-89, 120-129 # 9.9: 90-109 # 9.9-sub: 130-139 -LIBINTERFACE = 80 -LIBREVISION = 4 +LIBINTERFACE = 81 +LIBREVISION = 0 LIBAGE = 0 diff --git a/lib/irs/getaddrinfo.c b/lib/irs/getaddrinfo.c index 1de540f2962e..24d35bf691d9 100644 --- a/lib/irs/getaddrinfo.c +++ b/lib/irs/getaddrinfo.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009, 2012, 2013 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2009, 2012-2014 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -409,7 +409,7 @@ getaddrinfo(const char *hostname, const char *servname, * Convert to a V4 mapped address. */ struct in6_addr *a6 = (struct in6_addr *)abuf; - memcpy(&a6->s6_addr[12], &a6->s6_addr[0], 4); + memmove(&a6->s6_addr[12], &a6->s6_addr[0], 4); memset(&a6->s6_addr[10], 0xff, 2); memset(&a6->s6_addr[0], 0, 10); goto inet6_addr; @@ -446,7 +446,7 @@ getaddrinfo(const char *hostname, const char *servname, ai_list = ai; ai->ai_socktype = socktype; SIN(ai->ai_addr)->sin_port = port; - memcpy((char *)ai->ai_addr + addroff, abuf, addrsize); + memmove((char *)ai->ai_addr + addroff, abuf, addrsize); if ((flags & AI_CANONNAME) != 0) { #ifdef IRS_HAVE_SIN6_SCOPE_ID if (ai->ai_family == AF_INET6) @@ -789,8 +789,8 @@ process_answer(isc_task_t *task, isc_event_t *event) { RUNTIME_CHECK(result == ISC_R_SUCCESS); SIN(ai->ai_addr)->sin_port = resstate->head->ai_port; - memcpy(&SIN(ai->ai_addr)->sin_addr, - &rdata_a.in_addr, 4); + memmove(&SIN(ai->ai_addr)->sin_addr, + &rdata_a.in_addr, 4); dns_rdata_freestruct(&rdata_a); break; case AF_INET6: @@ -800,8 +800,8 @@ process_answer(isc_task_t *task, isc_event_t *event) { RUNTIME_CHECK(result == ISC_R_SUCCESS); SIN6(ai->ai_addr)->sin6_port = resstate->head->ai_port; - memcpy(&SIN6(ai->ai_addr)->sin6_addr, - &rdata_aaaa.in6_addr, 16); + memmove(&SIN6(ai->ai_addr)->sin6_addr, + &rdata_aaaa.in6_addr, 16); dns_rdata_freestruct(&rdata_aaaa); break; } @@ -1130,7 +1130,7 @@ add_ipv4(const char *hostname, int flags, struct addrinfo **aip, *aip = ai; ai->ai_socktype = socktype; SIN(ai->ai_addr)->sin_port = port; - memcpy(&SIN(ai->ai_addr)->sin_addr, v4_loop, 4); + memmove(&SIN(ai->ai_addr)->sin_addr, v4_loop, 4); return (0); } @@ -1153,7 +1153,7 @@ add_ipv6(const char *hostname, int flags, struct addrinfo **aip, *aip = ai; ai->ai_socktype = socktype; SIN6(ai->ai_addr)->sin6_port = port; - memcpy(&SIN6(ai->ai_addr)->sin6_addr, v6_loop, 16); + memmove(&SIN6(ai->ai_addr)->sin6_addr, v6_loop, 16); return (0); } diff --git a/lib/irs/include/irs/Makefile.in b/lib/irs/include/irs/Makefile.in index 63e7fd6be63f..eca98eb13671 100644 --- a/lib/irs/include/irs/Makefile.in +++ b/lib/irs/include/irs/Makefile.in @@ -1,4 +1,4 @@ -# Copyright (C) 2009, 2012 Internet Systems Consortium, Inc. ("ISC") +# Copyright (C) 2009, 2012, 2014 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above @@ -39,6 +39,8 @@ install:: installdirs done ${INSTALL_DATA} netdb.h ${DESTDIR}${includedir}/irs ${INSTALL_DATA} platform.h ${DESTDIR}${includedir}/irs + ${INSTALL_DATA} resconf.h ${DESTDIR}${includedir}/irs + ${INSTALL_DATA} types.h ${DESTDIR}${includedir}/irs distclean:: rm -f netdb.h platform.h diff --git a/lib/irs/include/irs/resconf.h b/lib/irs/include/irs/resconf.h index 78c87d51660d..dec110ad30fb 100644 --- a/lib/irs/include/irs/resconf.h +++ b/lib/irs/include/irs/resconf.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2009, 2014 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -46,7 +46,12 @@ isc_result_t irs_resconf_load(isc_mem_t *mctx, const char *filename, irs_resconf_t **confp); /*%< * Load the resolver configuration file 'filename' in the "resolv.conf" format, - * and create a new irs_resconf_t object from the configuration. + * and create a new irs_resconf_t object from the configuration. If the file + * is not found ISC_R_FILENOTFOUND is returned with the structure initialized + * as if file contained only: + * + * nameserver ::1 + * nameserver 127.0.0.1 * * Notes: * @@ -55,6 +60,11 @@ irs_resconf_load(isc_mem_t *mctx, const char *filename, irs_resconf_t **confp); * In addition, 'sortlist' is not actually effective; it's parsed, but * the application cannot use the configuration. * + * Returns: + * \li ISC_R_SUCCESS on success + * \li ISC_R_FILENOTFOUND if the file was not found. *confp will be valid. + * \li other on error. + * * Requires: * *\li 'mctx' is a valid memory context. diff --git a/lib/irs/resconf.c b/lib/irs/resconf.c index 88bdac1641d5..cb2400795549 100644 --- a/lib/irs/resconf.c +++ b/lib/irs/resconf.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009, 2011, 2012 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2009, 2011, 2012, 2014 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -224,7 +224,7 @@ add_server(isc_mem_t *mctx, const char *address_str, v4 = &((struct sockaddr_in *)res->ai_addr)->sin_addr; if (memcmp(v4, zeroaddress, 4) == 0) - memcpy(v4, loopaddress, 4); + memmove(v4, loopaddress, 4); } address = isc_mem_get(mctx, sizeof(*address)); @@ -238,7 +238,7 @@ add_server(isc_mem_t *mctx, const char *address_str, goto cleanup; } address->length = res->ai_addrlen; - memcpy(&address->type.ss, res->ai_addr, res->ai_addrlen); + memmove(&address->type.ss, res->ai_addr, res->ai_addrlen); ISC_LINK_INIT(address, link); ISC_LIST_APPEND(*nameservers, address, link); @@ -258,14 +258,14 @@ create_addr(const char *buffer, isc_netaddr_t *addr, int convert_zero) { unsigned char zeroaddress[] = {0, 0, 0, 0}; unsigned char loopaddress[] = {127, 0, 0, 1}; if (memcmp(&v4, zeroaddress, 4) == 0) - memcpy(&v4, loopaddress, 4); + memmove(&v4, loopaddress, 4); } addr->family = AF_INET; - memcpy(&addr->type.in, &v4, NS_INADDRSZ); + memmove(&addr->type.in, &v4, NS_INADDRSZ); addr->zone = 0; } else if (inet_pton(AF_INET6, buffer, &v6) == 1) { addr->family = AF_INET6; - memcpy(&addr->type.in6, &v6, NS_IN6ADDRSZ); + memmove(&addr->type.in6, &v6, NS_IN6ADDRSZ); addr->zone = 0; } else return (ISC_R_BADADDRESSFORM); /* Unrecognised format. */ @@ -483,7 +483,7 @@ irs_resconf_load(isc_mem_t *mctx, const char *filename, irs_resconf_t **confp) { FILE *fp = NULL; char word[256]; - isc_result_t rval, ret; + isc_result_t rval, ret = ISC_R_SUCCESS; irs_resconf_t *conf; int i, stopchar; @@ -507,45 +507,49 @@ irs_resconf_load(isc_mem_t *mctx, const char *filename, irs_resconf_t **confp) conf->search[i] = NULL; errno = 0; - if ((fp = fopen(filename, "r")) == NULL) { - isc_mem_put(mctx, conf, sizeof(*conf)); - return (ISC_R_INVALIDFILE); - } - - ret = ISC_R_SUCCESS; - do { - stopchar = getword(fp, word, sizeof(word)); - if (stopchar == EOF) { - rval = ISC_R_SUCCESS; - POST(rval); - break; - } - - if (strlen(word) == 0U) - rval = ISC_R_SUCCESS; - else if (strcmp(word, "nameserver") == 0) - rval = resconf_parsenameserver(conf, fp); - else if (strcmp(word, "domain") == 0) - rval = resconf_parsedomain(conf, fp); - else if (strcmp(word, "search") == 0) - rval = resconf_parsesearch(conf, fp); - else if (strcmp(word, "sortlist") == 0) - rval = resconf_parsesortlist(conf, fp); - else if (strcmp(word, "options") == 0) - rval = resconf_parseoption(conf, fp); - else { - /* unrecognised word. Ignore entire line */ - rval = ISC_R_SUCCESS; - stopchar = eatline(fp); + if ((fp = fopen(filename, "r")) != NULL) { + do { + stopchar = getword(fp, word, sizeof(word)); if (stopchar == EOF) { + rval = ISC_R_SUCCESS; + POST(rval); break; } - } - if (ret == ISC_R_SUCCESS && rval != ISC_R_SUCCESS) - ret = rval; - } while (1); - fclose(fp); + if (strlen(word) == 0U) + rval = ISC_R_SUCCESS; + else if (strcmp(word, "nameserver") == 0) + rval = resconf_parsenameserver(conf, fp); + else if (strcmp(word, "domain") == 0) + rval = resconf_parsedomain(conf, fp); + else if (strcmp(word, "search") == 0) + rval = resconf_parsesearch(conf, fp); + else if (strcmp(word, "sortlist") == 0) + rval = resconf_parsesortlist(conf, fp); + else if (strcmp(word, "options") == 0) + rval = resconf_parseoption(conf, fp); + else { + /* unrecognised word. Ignore entire line */ + rval = ISC_R_SUCCESS; + stopchar = eatline(fp); + if (stopchar == EOF) { + break; + } + } + if (ret == ISC_R_SUCCESS && rval != ISC_R_SUCCESS) + ret = rval; + } while (1); + + fclose(fp); + } else { + switch (errno) { + case ENOENT: + break; + default: + isc_mem_put(mctx, conf, sizeof(*conf)); + return (ISC_R_INVALIDFILE); + } + } /* If we don't find a nameserver fall back to localhost */ if (conf->numns == 0) { @@ -575,8 +579,11 @@ irs_resconf_load(isc_mem_t *mctx, const char *filename, irs_resconf_t **confp) if (ret != ISC_R_SUCCESS) irs_resconf_destroy(&conf); - else + else { + if (fp == NULL) + ret = ISC_R_FILENOTFOUND; *confp = conf; + } return (ret); } |