Dynamic DNS updates. */
/*
- * Copyright (c) 2000 Internet Software Consortium.
+ * Copyright (c) 2000-2001 Internet Software Consortium.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
#ifndef lint
static char copyright[] =
-"$Id: ddns.c,v 1.3 2000/12/29 06:48:14 mellon Exp $ Copyright (c) 1995-2000 The Internet Software Consortium. All rights reserved.\n";
+"$Id: ddns.c,v 1.4 2001/01/04 00:08:16 mellon Exp $ Copyright (c) 2000-2001 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
static int get_dhcid (struct data_string *, struct lease *);
-static struct __res_state resolver_state;
-static int resolver_inited = 0;
-
-
static int get_dhcid (struct data_string *id, struct lease *lease)
{
unsigned char buf[MD5_DIGEST_LENGTH];
/* DN: No way of checking that there is enough space in a data_string's
buffer. Be certain to allocate enough!
- TL: This is why we the expression evaluation code allocates a *new*
+ TL: This is why the expression evaluation code allocates a *new*
data_string. :') */
static void data_string_append (struct data_string *ds1,
struct data_string *ds2)
return 1;
}
+int unset (struct binding_scope *scope, const char *name)
+{
+ struct binding *binding;
+
+ binding = find_binding (scope, name);
+ if (binding) {
+ if (binding -> value)
+ binding_value_dereference
+ (&binding -> value, MDL);
+ return 1;
+ }
+ return 0;
+}
+
static ns_rcode ddns_update_a (struct data_string *ddns_fwd_name,
struct data_string *ddns_address,
struct data_string *ddns_dhcid,
unsigned long ttl)
{
- ns_updque updque;
+ ns_updque updqueue;
ns_updrec *updrec;
ns_rcode result;
* -- "Interaction between DHCP and DNS"
*/
- ISC_LIST_INIT (updque);
+ ISC_LIST_INIT (updqueue);
/*
* A RR does not exist.
updrec -> r_size = 0;
updrec -> r_opcode = NXDOMAIN;
- ISC_LIST_APPEND (updque, updrec, r_link);
+ ISC_LIST_APPEND (updqueue, updrec, r_link);
/*
updrec -> r_size = ddns_address -> len;
updrec -> r_opcode = ADD;
- ISC_LIST_APPEND (updque, updrec, r_link);
+ ISC_LIST_APPEND (updqueue, updrec, r_link);
/*
updrec -> r_size = ddns_dhcid -> len;
updrec -> r_opcode = ADD;
- ISC_LIST_APPEND (updque, updrec, r_link);
+ ISC_LIST_APPEND (updqueue, updrec, r_link);
/*
* Attempt to perform the update.
*/
- result = minires_nupdate (&resolver_state, ISC_LIST_HEAD (updque));
+ result = minires_nupdate (&resolver_state, ISC_LIST_HEAD (updqueue));
+
+ print_dns_status ((int)result, &updqueue);
- while (!ISC_LIST_EMPTY (updque)) {
- updrec = ISC_LIST_HEAD (updque);
- ISC_LIST_UNLINK (updque, updrec, r_link);
+ while (!ISC_LIST_EMPTY (updqueue)) {
+ updrec = ISC_LIST_HEAD (updqueue);
+ ISC_LIST_UNLINK (updqueue, updrec, r_link);
minires_freeupdrec (updrec);
}
updrec -> r_size = ddns_dhcid -> len;
updrec -> r_opcode = YXRRSET;
- ISC_LIST_APPEND (updque, updrec, r_link);
+ ISC_LIST_APPEND (updqueue, updrec, r_link);
/*
updrec -> r_size = 0;
updrec -> r_opcode = DELETE;
- ISC_LIST_APPEND (updque, updrec, r_link);
+ ISC_LIST_APPEND (updqueue, updrec, r_link);
/*
updrec -> r_size = ddns_address -> len;
updrec -> r_opcode = ADD;
- ISC_LIST_APPEND (updque, updrec, r_link);
+ ISC_LIST_APPEND (updqueue, updrec, r_link);
/*
* Attempt to perform the update.
*/
- result = minires_nupdate (&resolver_state, ISC_LIST_HEAD (updque));
+ result = minires_nupdate (&resolver_state, ISC_LIST_HEAD (updqueue));
+
+ print_dns_status ((int)result, &updqueue);
- while (!ISC_LIST_EMPTY (updque)) {
- updrec = ISC_LIST_HEAD (updque);
- ISC_LIST_UNLINK (updque, updrec, r_link);
+ while (!ISC_LIST_EMPTY (updqueue)) {
+ updrec = ISC_LIST_HEAD (updqueue);
+ ISC_LIST_UNLINK (updqueue, updrec, r_link);
minires_freeupdrec (updrec);
}
error:
- while (!ISC_LIST_EMPTY (updque)) {
- updrec = ISC_LIST_HEAD (updque);
- ISC_LIST_UNLINK (updque, updrec, r_link);
+ while (!ISC_LIST_EMPTY (updqueue)) {
+ updrec = ISC_LIST_HEAD (updqueue);
+ ISC_LIST_UNLINK (updqueue, updrec, r_link);
minires_freeupdrec (updrec);
}
struct data_string *ddns_dhcid,
unsigned long ttl)
{
- ns_updque updque;
+ ns_updque updqueue;
ns_updrec *updrec;
ns_rcode result = SERVFAIL;
* -- "Interaction between DHCP and DNS"
*/
- ISC_LIST_INIT (updque);
+ ISC_LIST_INIT (updqueue);
/*
* Delete all PTR RRs.
updrec -> r_size = 0;
updrec -> r_opcode = DELETE;
- ISC_LIST_APPEND (updque, updrec, r_link);
+ ISC_LIST_APPEND (updqueue, updrec, r_link);
/*
updrec -> r_size = ddns_fwd_name -> len;
updrec -> r_opcode = ADD;
- ISC_LIST_APPEND (updque, updrec, r_link);
+ ISC_LIST_APPEND (updqueue, updrec, r_link);
/*
updrec -> r_size = ddns_dhcid -> len;
updrec -> r_opcode = ADD;
- ISC_LIST_APPEND (updque, updrec, r_link);
+ ISC_LIST_APPEND (updqueue, updrec, r_link);
/*
* Attempt to perform the update.
*/
- result = minires_nupdate (&resolver_state, ISC_LIST_HEAD (updque));
-
+ result = minires_nupdate (&resolver_state, ISC_LIST_HEAD (updqueue));
+ print_dns_status ((int)result, &updqueue);
/* Fall through. */
error:
- while (!ISC_LIST_EMPTY (updque)) {
- updrec = ISC_LIST_HEAD (updque);
- ISC_LIST_UNLINK (updque, updrec, r_link);
+ while (!ISC_LIST_EMPTY (updqueue)) {
+ updrec = ISC_LIST_HEAD (updqueue);
+ ISC_LIST_UNLINK (updqueue, updrec, r_link);
minires_freeupdrec (updrec);
}
struct data_string *ddns_address,
struct data_string *ddns_dhcid)
{
- ns_updque updque;
+ ns_updque updqueue;
ns_updrec *updrec;
ns_rcode result = SERVFAIL;
* -- "Interaction between DHCP and DNS"
*/
- ISC_LIST_INIT (updque);
+ ISC_LIST_INIT (updqueue);
/*
* DHCID RR exists, and matches client identity.
updrec -> r_size = ddns_dhcid -> len;
updrec -> r_opcode = YXRRSET;
- ISC_LIST_APPEND (updque, updrec, r_link);
+ ISC_LIST_APPEND (updqueue, updrec, r_link);
/*
updrec -> r_size = ddns_address -> len;
updrec -> r_opcode = YXRRSET;
- ISC_LIST_APPEND (updque, updrec, r_link);
+ ISC_LIST_APPEND (updqueue, updrec, r_link);
/*
updrec -> r_size = ddns_address -> len;
updrec -> r_opcode = DELETE;
- ISC_LIST_APPEND (updque, updrec, r_link);
+ ISC_LIST_APPEND (updqueue, updrec, r_link);
/*
updrec -> r_size = ddns_dhcid -> len;
updrec -> r_opcode = DELETE;
- ISC_LIST_APPEND (updque, updrec, r_link);
+ ISC_LIST_APPEND (updqueue, updrec, r_link);
/*
* Attempt to perform the update.
*/
- result = minires_nupdate (&resolver_state, ISC_LIST_HEAD (updque));
-
+ result = minires_nupdate (&resolver_state, ISC_LIST_HEAD (updqueue));
+ print_dns_status ((int)result, &updqueue);
/*
* If the query fails, the updater MUST NOT delete the DNS name. It
/* Fall through. */
error:
- while (!ISC_LIST_EMPTY (updque)) {
- updrec = ISC_LIST_HEAD (updque);
- ISC_LIST_UNLINK (updque, updrec, r_link);
+ while (!ISC_LIST_EMPTY (updqueue)) {
+ updrec = ISC_LIST_HEAD (updqueue);
+ ISC_LIST_UNLINK (updqueue, updrec, r_link);
minires_freeupdrec (updrec);
}
struct data_string *ddns_rev_name,
struct data_string *ddns_dhcid)
{
- ns_updque updque;
+ ns_updque updqueue;
ns_updrec *updrec;
ns_rcode result = SERVFAIL;
* -- "Interaction between DHCP and DNS"
*/
- ISC_LIST_INIT (updque);
+ ISC_LIST_INIT (updqueue);
/*
* Delete appropriate PTR RR.
updrec -> r_size = ddns_fwd_name -> len;
updrec -> r_opcode = DELETE;
- ISC_LIST_APPEND (updque, updrec, r_link);
+ ISC_LIST_APPEND (updqueue, updrec, r_link);
/*
updrec -> r_size = ddns_dhcid -> len;
updrec -> r_opcode = DELETE;
- ISC_LIST_APPEND (updque, updrec, r_link);
+ ISC_LIST_APPEND (updqueue, updrec, r_link);
/*
* Attempt to perform the update.
*/
- result = minires_nupdate (&resolver_state, ISC_LIST_HEAD (updque));
-
+ result = minires_nupdate (&resolver_state, ISC_LIST_HEAD (updqueue));
+ print_dns_status ((int)result, &updqueue);
/* Fall through. */
error:
- while (!ISC_LIST_EMPTY (updque)) {
- updrec = ISC_LIST_HEAD (updque);
- ISC_LIST_UNLINK (updque, updrec, r_link);
+ while (!ISC_LIST_EMPTY (updqueue)) {
+ updrec = ISC_LIST_HEAD (updqueue);
+ ISC_LIST_UNLINK (updqueue, updrec, r_link);
minires_freeupdrec (updrec);
}
* Look up the RR TTL.
*/
ddns_ttl = DEFAULT_DDNS_TTL;
+ memset (&d1, 0, sizeof d1);
if ((oc = lookup_option (&server_universe, state -> options,
SV_DDNS_TTL))) {
if (evaluate_option_cache (&d1, packet, lease,
}
-int ddns_removals(struct lease *lease) {
+int ddns_removals(struct lease *lease)
+{
struct data_string ddns_fwd_name;
struct data_string ddns_rev_name;
struct data_string ddns_address;
struct data_string ddns_dhcid;
ns_rcode rcode;
+ struct binding *binding;
if (ddns_update_style != 2)
return 1;
find_bound_string (&ddns_address, lease -> scope, "ddns-address");
find_bound_string (&ddns_dhcid, lease -> scope, "ddns-dhcid");
-
/*
* Start the resolver, if necessary.
*/
&ddns_dhcid);
}
+ unset (lease -> scope, "ddns-fwd-name");
+ unset (lease -> scope, "ddns-rev-name");
+ unset (lease -> scope, "ddns-address");
+ unset (lease -> scope, "ddns-dhcid");
data_string_forget (&ddns_fwd_name, MDL);
data_string_forget (&ddns_rev_name, MDL);