putenv(buf);
}
-#ifdef EXT_S46
+
static void s46_to_env_portparams(const uint8_t *data, size_t len, FILE *fp)
{
uint8_t *odata;
}
}
}
-#endif
+
static void s46_to_env(enum odhcp6c_state state, const uint8_t *data, size_t len)
{
const char *name = (state == STATE_S46_MAPE) ? "MAPE" :
(state == STATE_S46_MAPT) ? "MAPT" : "LW4O6";
- const char *type = (state == STATE_S46_MAPE) ? "map-e" :
- (state == STATE_S46_MAPT) ? "map-t" : "lw4o6";
char *str;
size_t strsize;
fputs(name, fp);
fputc('=', fp);
-#ifdef EXT_S46
+ const char *type = (state == STATE_S46_MAPE) ? "map-e" :
+ (state == STATE_S46_MAPT) ? "map-t" : "lw4o6";
+
uint8_t *odata;
uint16_t otype, olen;
dhcpv6_for_each_option(data, &data[len], otype, olen, odata) {
fprintf(fp, "br=%s,", buf6);
} else if (state == STATE_S46_MAPT && otype == DHCPV6_OPT_S46_DMR &&
olen >= sizeof(struct dhcpv6_s46_dmr)) {
+ dmr = (struct dhcpv6_s46_dmr*)odata;
memset(&in6, 0, sizeof(in6));
size_t prefix6len = dmr->dmr_prefix6_len;
prefix6len = (prefix6len % 8 == 0) ? prefix6len / 8 : prefix6len / 8 + 1;
fputc(' ', fp);
}
-#else
- if (data && len) {}
-#endif
fclose(fp);
putenv(str);
void script_call(const char *status)
{
size_t dns_len, search_len, custom_len, sntp_ip_len, ntp_ip_len, ntp_dns_len;
- size_t sip_ip_len, sip_fqdn_len, aftr_name_len, cer_len;
- size_t s46_mapt_len, s46_mape_len, s46_lw_len;
+ size_t sip_ip_len, sip_fqdn_len, aftr_name_len, cer_len, addr_len;
+ size_t s46_mapt_len, s46_mape_len, s46_lw_len, passthru_len;
odhcp6c_expire();
if (delayed_call) {
dont_delay = true;
}
+ struct in6_addr *addr = odhcp6c_get_state(STATE_SERVER_ADDR, &addr_len);
struct in6_addr *dns = odhcp6c_get_state(STATE_DNS, &dns_len);
uint8_t *search = odhcp6c_get_state(STATE_SEARCH, &search_len);
uint8_t *custom = odhcp6c_get_state(STATE_CUSTOM_OPTS, &custom_len);
uint8_t *s46_mapt = odhcp6c_get_state(STATE_S46_MAPT, &s46_mapt_len);
uint8_t *s46_mape = odhcp6c_get_state(STATE_S46_MAPE, &s46_mape_len);
uint8_t *s46_lw = odhcp6c_get_state(STATE_S46_LW, &s46_lw_len);
+ uint8_t *passthru = odhcp6c_get_state(STATE_PASSTHRU, &passthru_len);
size_t prefix_len, address_len, ra_pref_len, ra_route_len, ra_dns_len;
uint8_t *prefix = odhcp6c_get_state(STATE_IA_PD, &prefix_len);
// Don't set environment before forking, because env is leaky.
if (fork() == 0) {
+ ipv6_to_env("SERVER", addr, addr_len / sizeof(*addr));
ipv6_to_env("RDNSS", dns, dns_len / sizeof(*dns));
ipv6_to_env("SNTP_IP", sntp, sntp_ip_len / sizeof(*sntp));
ipv6_to_env("NTP_IP", ntp, ntp_ip_len / sizeof(*ntp));
entry_to_env("RA_ROUTES", ra_route, ra_route_len, ENTRY_ROUTE);
entry_to_env("RA_DNS", ra_dns, ra_dns_len, ENTRY_HOST);
+ char *buf = malloc(10 + passthru_len * 2);
+ strncpy(buf, "PASSTHRU=", 10);
+ script_hexlify(&buf[9], passthru, passthru_len);
+ putenv(buf);
+
argv[2] = (char*)status;
execv(argv[0], argv);
_exit(128);