summaryrefslogtreecommitdiffstats
path: root/src/providers/dp_dyndns.c
diff options
context:
space:
mode:
authorPavel Reichl <preichl@redhat.com>2015-09-12 09:09:35 -0400
committerJakub Hrozek <jhrozek@redhat.com>2015-09-22 14:51:22 +0200
commiteeac17ebbe38f16deaa8599231cccfc97aaac85c (patch)
tree9b37ee15c8c3bf452ce6b2fff114d9371c45b785 /src/providers/dp_dyndns.c
parente6595222c41af84288d303e8d464ce45b1408ed3 (diff)
downloadsssd-eeac17ebbe38f16deaa8599231cccfc97aaac85c.tar.gz
sssd-eeac17ebbe38f16deaa8599231cccfc97aaac85c.tar.xz
sssd-eeac17ebbe38f16deaa8599231cccfc97aaac85c.zip
DDNS: execute nsupdate for single update of PTR rec
nsupdate fails definitely if any of update request fails when GSSAPI is used. As tmp solution nsupdate is executed for each update. Resolves: https://fedorahosted.org/sssd/ticket/2783 Reviewed-by: Jakub Hrozek <jhrozek@redhat.com>
Diffstat (limited to 'src/providers/dp_dyndns.c')
-rw-r--r--src/providers/dp_dyndns.c128
1 files changed, 65 insertions, 63 deletions
diff --git a/src/providers/dp_dyndns.c b/src/providers/dp_dyndns.c
index 0577743cb..50b087446 100644
--- a/src/providers/dp_dyndns.c
+++ b/src/providers/dp_dyndns.c
@@ -52,6 +52,25 @@ struct sss_iface_addr {
struct sockaddr_storage *addr;
};
+struct sockaddr_storage*
+sss_iface_addr_get_address(struct sss_iface_addr *address)
+{
+ if (address == NULL) {
+ return NULL;
+ }
+
+ return address->addr;
+}
+
+struct sss_iface_addr *sss_iface_addr_get_next(struct sss_iface_addr *address)
+{
+ if (address) {
+ return address->next;
+ }
+
+ return NULL;
+}
+
void sss_iface_addr_concatenate(struct sss_iface_addr **list,
struct sss_iface_addr *list2)
{
@@ -293,80 +312,63 @@ nsupdate_msg_add_fwd(char *update_msg, struct sss_iface_addr *addresses,
return talloc_asprintf_append(update_msg, "send\n");
}
-static char *
-nsupdate_msg_add_ptr(char *update_msg, struct sss_iface_addr *addresses,
- const char *hostname, int ttl, uint8_t remove_af,
- struct sss_iface_addr *old_addresses)
+static uint8_t *nsupdate_convert_address(struct sockaddr_storage *add_address)
+{
+ uint8_t *addr;
+
+ switch(add_address->ss_family) {
+ case AF_INET:
+ addr = (uint8_t *) &((struct sockaddr_in *) add_address)->sin_addr;
+ break;
+ case AF_INET6:
+ addr = (uint8_t *) &((struct sockaddr_in6 *) add_address)->sin6_addr;
+ break;
+ default:
+ DEBUG(SSSDBG_CRIT_FAILURE, "Unknown address family\n");
+ addr = NULL;
+ break;
+ }
+
+ return addr;
+}
+
+static char *nsupdate_msg_add_ptr(char *update_msg,
+ struct sockaddr_storage *address,
+ const char *hostname,
+ int ttl,
+ bool delete)
{
- struct sss_iface_addr *new_record, *old_record;
char *strptr;
uint8_t *addr;
- DLIST_FOR_EACH(old_record, old_addresses) {
- switch(old_record->addr->ss_family) {
- case AF_INET:
- if (!(remove_af & DYNDNS_REMOVE_A)) {
- continue;
- }
- addr = (uint8_t *) &((struct sockaddr_in *) old_record->addr)->sin_addr;
- break;
- case AF_INET6:
- if (!(remove_af & DYNDNS_REMOVE_AAAA)) {
- continue;
- }
- addr = (uint8_t *) &((struct sockaddr_in6 *) old_record->addr)->sin6_addr;
- break;
- default:
- DEBUG(SSSDBG_CRIT_FAILURE, "Unknown address family\n");
- return NULL;
- }
+ addr = nsupdate_convert_address(address);
+ if (addr == NULL) {
+ return NULL;
+ }
- strptr = resolv_get_string_ptr_address(update_msg, old_record->addr->ss_family,
- addr);
- if (strptr == NULL) {
- return NULL;
- }
+ strptr = resolv_get_string_ptr_address(update_msg, address->ss_family,
+ addr);
+ if (strptr == NULL) {
+ return NULL;
+ }
+ if (delete) {
/* example: update delete 38.78.16.10.in-addr.arpa. in PTR */
update_msg = talloc_asprintf_append(update_msg,
"update delete %s in PTR\n"
"send\n",
strptr);
- talloc_free(strptr);
- if (update_msg == NULL) {
- return NULL;
- }
- }
-
- /* example: update add 11.78.16.10.in-addr.arpa. 85000 in PTR testvm.example.com */
- DLIST_FOR_EACH(new_record, addresses) {
- switch(new_record->addr->ss_family) {
- case AF_INET:
- addr = (uint8_t *) &((struct sockaddr_in *) new_record->addr)->sin_addr;
- break;
- case AF_INET6:
- addr = (uint8_t *) &((struct sockaddr_in6 *) new_record->addr)->sin6_addr;
- break;
- default:
- DEBUG(SSSDBG_CRIT_FAILURE, "Unknown address family\n");
- return NULL;
- }
-
- strptr = resolv_get_string_ptr_address(update_msg, new_record->addr->ss_family,
- addr);
- if (strptr == NULL) {
- return NULL;
- }
-
+ } else {
/* example: update delete 38.78.16.10.in-addr.arpa. in PTR */
update_msg = talloc_asprintf_append(update_msg,
"update add %s %d in PTR %s.\n"
"send\n",
strptr, ttl, hostname);
- talloc_free(strptr);
- if (update_msg == NULL) {
- return NULL;
- }
+ }
+
+ talloc_free(strptr);
+ if (update_msg == NULL) {
+ return NULL;
}
return update_msg;
@@ -471,9 +473,9 @@ done:
errno_t
be_nsupdate_create_ptr_msg(TALLOC_CTX *mem_ctx, const char *realm,
const char *servername, const char *hostname,
- const unsigned int ttl, uint8_t remove_af,
- struct sss_iface_addr *addresses,
- struct sss_iface_addr *old_addresses,
+ const unsigned int ttl,
+ struct sockaddr_storage *address,
+ bool delete,
char **_update_msg)
{
errno_t ret;
@@ -490,8 +492,8 @@ be_nsupdate_create_ptr_msg(TALLOC_CTX *mem_ctx, const char *realm,
goto done;
}
- update_msg = nsupdate_msg_add_ptr(update_msg, addresses, hostname,
- ttl, remove_af, old_addresses);
+ update_msg = nsupdate_msg_add_ptr(update_msg, address, hostname, ttl,
+ delete);
if (update_msg == NULL) {
ret = ENOMEM;
goto done;