summaryrefslogtreecommitdiffstats
path: root/contrib
diff options
context:
space:
mode:
authormurray <murray@FreeBSD.org>2002-04-01 08:02:18 +0000
committermurray <murray@FreeBSD.org>2002-04-01 08:02:18 +0000
commitdbb69413111b771fca60de30e9b27fddb11b759f (patch)
tree18ec3951edf544a034b2d20d211beff2148d751c /contrib
parentdd19e39d2e5f498dde4fd0997c49f300c6cf230e (diff)
downloadFreeBSD-src-dbb69413111b771fca60de30e9b27fddb11b759f.zip
FreeBSD-src-dbb69413111b771fca60de30e9b27fddb11b759f.tar.gz
Resolve conflicts:
* $FreeBSD$ * connect std{in,out,err} (r1.19). * prefer strlcpy to strpy (r1.13). * quiet by default (r1.6). * document -D option.
Diffstat (limited to 'contrib')
-rw-r--r--contrib/isc-dhcp/client/dhclient.c54
1 files changed, 41 insertions, 13 deletions
diff --git a/contrib/isc-dhcp/client/dhclient.c b/contrib/isc-dhcp/client/dhclient.c
index df36a9a..9d0d6a6 100644
--- a/contrib/isc-dhcp/client/dhclient.c
+++ b/contrib/isc-dhcp/client/dhclient.c
@@ -3,7 +3,7 @@
DHCP Client. */
/*
- * Copyright (c) 1995-2001 Internet Software Consortium.
+ * Copyright (c) 1995-2002 Internet Software Consortium.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -41,7 +41,7 @@
#ifndef lint
static char ocopyright[] =
-"$Id: dhclient.c,v 1.129.2.7 2001/08/08 14:46:14 mellon Exp $ Copyright (c) 1995-2001 Internet Software Consortium. All rights reserved.\n"
+"$Id: dhclient.c,v 1.129.2.9 2002/02/20 07:16:31 mellon Exp $ Copyright (c) 1995-2001 Internet Software Consortium. All rights reserved.\n"
"$FreeBSD$\n";
#endif /* not lint */
@@ -884,7 +884,11 @@ void bind_lease (client)
client -> state = S_BOUND;
reinitialize_interfaces ();
go_daemon ();
- client_dns_update (client, 1);
+ if (client -> config -> do_forward_update) {
+ client -> dns_update_timeout = 1;
+ add_timeout (cur_time + 1, client_dns_update_timeout,
+ client, 0, 0);
+ }
}
/* state_bound is called when we've successfully bound to a particular
@@ -1185,12 +1189,13 @@ struct client_lease *packet_to_lease (packet, client)
memcpy (lease -> address.iabuf, &packet -> raw -> yiaddr,
lease -> address.len);
+ memset (&data, 0, sizeof data);
+
if (client -> config -> vendor_space_name) {
i = DHO_VENDOR_ENCAPSULATED_OPTIONS;
/* See if there was a vendor encapsulation option. */
oc = lookup_option (&dhcp_universe, lease -> options, i);
- memset (&data, 0, sizeof data);
if (oc &&
client -> config -> vendor_space_name &&
evaluate_option_cache (&data, packet,
@@ -2969,7 +2974,8 @@ isc_result_t dhcp_set_control_state (control_object_state_t oldstate,
case server_shutdown:
if (client -> active &&
client -> active -> expiry > cur_time) {
- client_dns_update (client, 0);
+ if (client -> config -> do_forward_update)
+ client_dns_update (client, 0, 0);
do_release (client);
}
break;
@@ -2989,9 +2995,30 @@ isc_result_t dhcp_set_control_state (control_object_state_t oldstate,
return ISC_R_SUCCESS;
}
+/* Called after a timeout if the DNS update failed on the previous try.
+ Retries the update, and if it times out, schedules a retry after
+ ten times as long of a wait. */
+
+void client_dns_update_timeout (void *cp)
+{
+ struct client_state *client = cp;
+ isc_result_t status;
+
+ if (client -> active) {
+ status = client_dns_update (client, 1,
+ (client -> active -> renewal -
+ cur_time));
+ if (status == ISC_R_TIMEDOUT) {
+ client -> dns_update_timeout *= 10;
+ add_timeout (cur_time + client -> dns_update_timeout,
+ client_dns_update_timeout, client, 0, 0);
+ }
+ }
+}
+
/* See if we should do a DNS update, and if so, do it. */
-void client_dns_update (struct client_state *client, int addp)
+isc_result_t client_dns_update (struct client_state *client, int addp, int ttl)
{
struct data_string ddns_fqdn, ddns_fwd_name,
ddns_dhcid, client_identifier;
@@ -3003,11 +3030,11 @@ void client_dns_update (struct client_state *client, int addp)
/* If we didn't send an FQDN option, we certainly aren't going to
be doing an update. */
if (!client -> sent_options)
- return;
+ return ISC_R_SUCCESS;
/* If we don't have a lease, we can't do an update. */
if (!client -> active)
- return;
+ return ISC_R_SUCCESS;
/* If we set the no client update flag, don't do the update. */
if ((oc = lookup_option (&fqdn_universe, client -> sent_options,
@@ -3017,7 +3044,7 @@ void client_dns_update (struct client_state *client, int addp)
client -> sent_options,
(struct option_state *)0,
&global_scope, oc, MDL))
- return;
+ return ISC_R_SUCCESS;
/* If we set the "server, please update" flag, or didn't set it
to false, don't do the update. */
@@ -3028,7 +3055,7 @@ void client_dns_update (struct client_state *client, int addp)
client -> sent_options,
(struct option_state *)0,
&global_scope, oc, MDL))
- return;
+ return ISC_R_SUCCESS;
/* If no FQDN option was supplied, don't do the update. */
memset (&ddns_fwd_name, 0, sizeof ddns_fwd_name);
@@ -3039,7 +3066,7 @@ void client_dns_update (struct client_state *client, int addp)
client -> sent_options,
(struct option_state *)0,
&global_scope, oc, MDL))
- return;
+ return ISC_R_SUCCESS;
/* Make a dhcid string out of either the client identifier,
if we are sending one, or the interface's MAC address,
@@ -3065,7 +3092,7 @@ void client_dns_update (struct client_state *client, int addp)
client -> interface -> hw_address.hlen);
if (!result) {
data_string_forget (&ddns_fwd_name, MDL);
- return;
+ return ISC_R_SUCCESS;
}
/* Start the resolver, if necessary. */
@@ -3083,7 +3110,7 @@ void client_dns_update (struct client_state *client, int addp)
if (addp)
rcode = ddns_update_a (&ddns_fwd_name,
client -> active -> address,
- &ddns_dhcid, DEFAULT_DDNS_TTL,
+ &ddns_dhcid, ttl,
1);
else
rcode = ddns_remove_a (&ddns_fwd_name,
@@ -3093,4 +3120,5 @@ void client_dns_update (struct client_state *client, int addp)
data_string_forget (&ddns_fwd_name, MDL);
data_string_forget (&ddns_dhcid, MDL);
+ return rcode;
}
OpenPOWER on IntegriCloud