X-Git-Url: https://git.decadent.org.uk/gitweb/?p=odhcp6c.git;a=blobdiff_plain;f=src%2Fodhcp6c.c;h=061cb42a607f7ac8e94f477c2eb0e6d466431f7d;hp=e4da1ab2767b36ef067e4cb314f413ff40f779c8;hb=49db5eb7406cd57b6ed64f5ee7130226d0fef66b;hpb=61effec4509b2c0d6e3c0ee8b7ae0d318b08868e diff --git a/src/odhcp6c.c b/src/odhcp6c.c index e4da1ab..061cb42 100644 --- a/src/odhcp6c.c +++ b/src/odhcp6c.c @@ -41,7 +41,7 @@ static size_t state_len[_STATE_MAX] = {0}; static volatile int do_signal = 0; static int urandom_fd = -1; -static bool bound = false; +static bool bound = false, allow_slaac_only = false; int main(_unused int argc, char* const argv[]) @@ -59,8 +59,12 @@ int main(_unused int argc, char* const argv[]) bool help = false, daemonize = false; int c, request_pd = 0; - while ((c = getopt(argc, argv, "N:P:c:r:s:hdp:")) != -1) { + while ((c = getopt(argc, argv, "SN:P:c:r:s:hdp:")) != -1) { switch (c) { + case 'S': + allow_slaac_only = true; + break; + case 'N': if (!strcmp(optarg, "force")) ia_na_mode = IA_MODE_FORCE; @@ -180,6 +184,7 @@ int main(_unused int argc, char* const argv[]) do_signal = 0; int res = dhcpv6_request(DHCPV6_MSG_SOLICIT); + odhcp6c_signal_process(); if (res < 0) { continue; // Might happen if we got a signal @@ -188,6 +193,7 @@ int main(_unused int argc, char* const argv[]) do_signal = 0; res = dhcpv6_request(DHCPV6_MSG_INFO_REQ); + odhcp6c_signal_process(); if (do_signal == SIGUSR1) continue; else if (res < 0) @@ -208,6 +214,7 @@ int main(_unused int argc, char* const argv[]) if (dhcpv6_request(DHCPV6_MSG_REQUEST) < 0) continue; + odhcp6c_signal_process(); script_call("bound"); bound = true; @@ -215,6 +222,7 @@ int main(_unused int argc, char* const argv[]) // Renew Cycle // Wait for T1 to expire or until we get a reconfigure int res = dhcpv6_poll_reconfigure(); + odhcp6c_signal_process(); if (res >= 0) { if (res > 0) script_call("updated"); @@ -238,6 +246,7 @@ int main(_unused int argc, char* const argv[]) r = dhcpv6_request(DHCPV6_MSG_REQUEST); else r = dhcpv6_request(DHCPV6_MSG_RENEW); + odhcp6c_signal_process(); if (r > 0) // Publish updates script_call("updated"); if (r >= 0) @@ -247,6 +256,7 @@ int main(_unused int argc, char* const argv[]) // If we have IAs, try rebind otherwise restart res = dhcpv6_request(DHCPV6_MSG_REBIND); + odhcp6c_signal_process(); odhcp6c_get_state(STATE_IA_PD, &ia_pd_new); odhcp6c_get_state(STATE_IA_NA, &ia_na_new); @@ -284,6 +294,7 @@ static int usage(void) const char buf[] = "Usage: odhcp6c [options] \n" "\nFeature options:\n" + " -S Allow SLAAC-only assignment\n" " -N Mode for requesting addresses [try|force|none]\n" " -P Request IPv6-Prefix (0 = auto)\n" " -c Override client-ID (base-16 encoded)\n" @@ -312,6 +323,8 @@ static uint8_t* odhcp6c_resize_state(enum odhcp6c_state state, ssize_t len) { if (len == 0) return state_data[state] + state_len[state]; + else if (state_len[state] + len > 1024) + return NULL; uint8_t *n = realloc(state_data[state], state_len[state] + len); if (n || state_len[state] + len == 0) { @@ -329,7 +342,7 @@ bool odhcp6c_signal_process(void) do_signal = 0; bool updated = ra_process(); updated |= ra_rtnl_process(); - if (updated && bound) { + if (updated && (bound || allow_slaac_only)) { odhcp6c_expire(); script_call("ra-updated"); } @@ -386,7 +399,7 @@ struct odhcp6c_entry* odhcp6c_find_entry(enum odhcp6c_state state, const struct } -void odhcp6c_update_entry_safe(enum odhcp6c_state state, const struct odhcp6c_entry *new, uint32_t safe) +void odhcp6c_update_entry_safe(enum odhcp6c_state state, struct odhcp6c_entry *new, uint32_t safe) { size_t len; struct odhcp6c_entry *x = odhcp6c_find_entry(state, new); @@ -406,7 +419,7 @@ void odhcp6c_update_entry_safe(enum odhcp6c_state state, const struct odhcp6c_en } -void odhcp6c_update_entry(enum odhcp6c_state state, const struct odhcp6c_entry *new) +void odhcp6c_update_entry(enum odhcp6c_state state, struct odhcp6c_entry *new) { odhcp6c_update_entry_safe(state, new, 0); } @@ -443,6 +456,7 @@ void odhcp6c_expire(void) odhcp6c_expire_list(STATE_RA_PREFIX, elapsed); odhcp6c_expire_list(STATE_RA_ROUTE, elapsed); + odhcp6c_expire_list(STATE_RA_DNS, elapsed); odhcp6c_expire_list(STATE_IA_NA, elapsed); odhcp6c_expire_list(STATE_IA_PD, elapsed); }