summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPavel Reichl <preichl@redhat.com>2015-07-24 08:24:48 -0400
committerJakub Hrozek <jhrozek@redhat.com>2015-08-14 23:54:52 +0200
commitb42bf6c0c01db08208fb81d8295a2909d307284a (patch)
tree52294605986a7d983eb6b70d7507331530db3e23
parent76604931b11594394a05df10f8370a1b8bb3e54b (diff)
downloadsssd-b42bf6c0c01db08208fb81d8295a2909d307284a.tar.gz
sssd-b42bf6c0c01db08208fb81d8295a2909d307284a.tar.xz
sssd-b42bf6c0c01db08208fb81d8295a2909d307284a.zip
DYNDNS: remove code duplication
Move copy pasted code for converting sockaddr_storage to string into function. Resolves: https://fedorahosted.org/sssd/ticket/2495 Reviewed-by: Jakub Hrozek <jhrozek@redhat.com>
-rw-r--r--src/providers/dp_dyndns.c99
-rw-r--r--src/util/util_errors.c1
-rw-r--r--src/util/util_errors.h1
3 files changed, 46 insertions, 55 deletions
diff --git a/src/providers/dp_dyndns.c b/src/providers/dp_dyndns.c
index ae3f913ee..0577743cb 100644
--- a/src/providers/dp_dyndns.c
+++ b/src/providers/dp_dyndns.c
@@ -58,6 +58,39 @@ void sss_iface_addr_concatenate(struct sss_iface_addr **list,
DLIST_CONCATENATE((*list), list2, struct sss_iface_addr*);
}
+static errno_t addr_to_str(struct sockaddr_storage *addr,
+ char *dst, size_t size)
+{
+ const void *src;
+ const char *res;
+ errno_t ret;
+
+ switch(addr->ss_family) {
+ case AF_INET:
+ src = &(((struct sockaddr_in *)addr)->sin_addr);
+ break;
+ case AF_INET6:
+ src = &(((struct sockaddr_in6 *)addr)->sin6_addr);
+ break;
+ default:
+ ret = ERR_ADDR_FAMILY_NOT_SUPPORTED;
+ goto done;
+ }
+
+ res = inet_ntop(addr->ss_family, src, dst, size);
+ if (res == NULL) {
+ ret = errno;
+ DEBUG(SSSDBG_OP_FAILURE, "inet_ntop failed [%d]: %s\n",
+ ret, sss_strerror(ret));
+ goto done;
+ }
+
+ ret = EOK;
+
+done:
+ return ret;
+}
+
errno_t
sss_iface_addr_list_as_str_list(TALLOC_CTX *mem_ctx,
struct sss_iface_addr *ifaddr_list,
@@ -67,7 +100,6 @@ sss_iface_addr_list_as_str_list(TALLOC_CTX *mem_ctx,
size_t count;
int ai;
char **straddrs;
- const char *ip;
char ip_addr[INET6_ADDRSTRLEN];
errno_t ret;
@@ -83,35 +115,17 @@ sss_iface_addr_list_as_str_list(TALLOC_CTX *mem_ctx,
ai = 0;
DLIST_FOR_EACH(ifaddr, ifaddr_list) {
- switch(ifaddr->addr->ss_family) {
- case AF_INET:
- errno = 0;
- ip = inet_ntop(ifaddr->addr->ss_family,
- &(((struct sockaddr_in *)ifaddr->addr)->sin_addr),
- ip_addr, INET6_ADDRSTRLEN);
- if (ip == NULL) {
- ret = errno;
- goto fail;
- }
- break;
-
- case AF_INET6:
- errno = 0;
- ip = inet_ntop(ifaddr->addr->ss_family,
- &(((struct sockaddr_in6 *)ifaddr->addr)->sin6_addr),
- ip_addr, INET6_ADDRSTRLEN);
- if (ip == NULL) {
- ret = errno;
- goto fail;
- }
- break;
- default:
- DEBUG(SSSDBG_CRIT_FAILURE, "Unknown address family\n");
+ ret = addr_to_str(ifaddr->addr, ip_addr, INET6_ADDRSTRLEN);
+ if (ret == ERR_ADDR_FAMILY_NOT_SUPPORTED) {
continue;
+ } else if (ret != EOK) {
+ DEBUG(SSSDBG_MINOR_FAILURE, "addr_to_str failed: %d:[%s],\n",
+ ret, sss_strerror(ret));
+ goto fail;
}
- straddrs[ai] = talloc_strdup(straddrs, ip);
+ straddrs[ai] = talloc_strdup(straddrs, ip_addr);
if (straddrs[ai] == NULL) {
ret = ENOMEM;
goto fail;
@@ -237,7 +251,6 @@ nsupdate_msg_add_fwd(char *update_msg, struct sss_iface_addr *addresses,
{
struct sss_iface_addr *new_record;
char ip_addr[INET6_ADDRSTRLEN];
- const char *ip;
errno_t ret;
/* Remove existing entries as needed */
@@ -259,33 +272,10 @@ nsupdate_msg_add_fwd(char *update_msg, struct sss_iface_addr *addresses,
}
DLIST_FOR_EACH(new_record, addresses) {
- switch(new_record->addr->ss_family) {
- case AF_INET:
- ip = inet_ntop(new_record->addr->ss_family,
- &(((struct sockaddr_in *)new_record->addr)->sin_addr),
- ip_addr, INET6_ADDRSTRLEN);
- if (ip == NULL) {
- ret = errno;
- DEBUG(SSSDBG_OP_FAILURE,
- "inet_ntop failed [%d]: %s\n", ret, strerror(ret));
- return NULL;
- }
- break;
-
- case AF_INET6:
- ip = inet_ntop(new_record->addr->ss_family,
- &(((struct sockaddr_in6 *)new_record->addr)->sin6_addr),
- ip_addr, INET6_ADDRSTRLEN);
- if (ip == NULL) {
- ret = errno;
- DEBUG(SSSDBG_OP_FAILURE,
- "inet_ntop failed [%d]: %s\n", ret, strerror(ret));
- return NULL;
- }
- break;
-
- default:
- DEBUG(SSSDBG_CRIT_FAILURE, "Unknown address family\n");
+ ret = addr_to_str(new_record->addr, ip_addr, INET6_ADDRSTRLEN);
+ if (ret != EOK) {
+ DEBUG(SSSDBG_MINOR_FAILURE, "addr_to_str failed: %d:[%s],\n",
+ ret, sss_strerror(ret));
return NULL;
}
@@ -298,7 +288,6 @@ nsupdate_msg_add_fwd(char *update_msg, struct sss_iface_addr *addresses,
if (update_msg == NULL) {
return NULL;
}
-
}
return talloc_asprintf_append(update_msg, "send\n");
diff --git a/src/util/util_errors.c b/src/util/util_errors.c
index 735f6dcfc..ba61630c3 100644
--- a/src/util/util_errors.c
+++ b/src/util/util_errors.c
@@ -79,6 +79,7 @@ struct err_string error_to_str[] = {
{ "Retrieving keytab failed" }, /* ERR_IPA_GETKEYTAB_FAILED */
{ "Trusted forest root unknown" }, /* ERR_TRUST_FOREST_UNKNOWN */
{ "p11_child failed" }, /* ERR_P11_CHILD */
+ { "Address family not supported" }, /* ERR_ADDR_FAMILY_NOT_SUPPORTED */
{ "ERR_LAST" } /* ERR_LAST */
};
diff --git a/src/util/util_errors.h b/src/util/util_errors.h
index fbfbdef33..aa00cc592 100644
--- a/src/util/util_errors.h
+++ b/src/util/util_errors.h
@@ -101,6 +101,7 @@ enum sssd_errors {
ERR_IPA_GETKEYTAB_FAILED,
ERR_TRUST_FOREST_UNKNOWN,
ERR_P11_CHILD,
+ ERR_ADDR_FAMILY_NOT_SUPPORTED,
ERR_LAST /* ALWAYS LAST */
};