diff options
| author | Roy Marples <roy@marples.name> | 2014-06-22 13:05:05 +0000 |
|---|---|---|
| committer | Roy Marples <roy@marples.name> | 2014-06-22 13:05:05 +0000 |
| commit | bf7db9ecedcddc28ffa5eb4fa513195be8f14e29 (patch) | |
| tree | f10dca892022bfd1e56c680c15b2b2b1adb6efd8 /dhcpcd.c | |
| parent | 5e8e0b721eef879b85b0f20c30f15a7e413d50f6 (diff) | |
| download | dhcpcd-bf7db9ecedcddc28ffa5eb4fa513195be8f14e29.tar.xz | |
Add the ability to dump DHCPv6 leases.
Control DHCPv4 vs DHCPv6 dumping via the family option.
Diffstat (limited to 'dhcpcd.c')
| -rw-r--r-- | dhcpcd.c | 40 |
1 files changed, 33 insertions, 7 deletions
@@ -1351,12 +1351,44 @@ main(int argc, char **argv) if (chdir("/") == -1) syslog(LOG_ERR, "chdir `/': %m"); + /* Freeing allocated addresses from dumping leases can trigger + * eloop removals as well, so init here. */ + ctx.eloop = eloop_init(); + if (ctx.eloop == NULL) { + syslog(LOG_ERR, "%s: %m", __func__); + goto exit_failure; + } + if (ctx.options & DHCPCD_DUMPLEASE) { if (optind != argc - 1) { syslog(LOG_ERR, "dumplease requires an interface"); goto exit_failure; } - if (dhcp_dump(&ctx, argv[optind]) == -1) + i = 0; + if (ctx.ifaces == NULL) { + ctx.ifaces = malloc(sizeof(*ctx.ifaces)); + if (ctx.ifaces == NULL) { + syslog(LOG_ERR, "%s: %m", __func__); + goto exit_failure; + } + TAILQ_INIT(ctx.ifaces); + } + ifp = calloc(1, sizeof(*ifp)); + if (ifp == NULL) + goto exit_failure; + strlcpy(ifp->name, argv[optind], sizeof(ifp->name)); + ifp->ctx = &ctx; + TAILQ_INSERT_HEAD(ctx.ifaces, ifp, next); + configure_interface(ifp, 0, NULL); + if (family == 0 || family == AF_INET) { + if (dhcp_dump(ifp) == -1) + i = 1; + } + if (family == 0 || family == AF_INET6) { + if (dhcp6_dump(ifp) == -1) + i = 1; + } + if (i == -1) goto exit_failure; goto exit_success; } @@ -1396,12 +1428,6 @@ main(int argc, char **argv) syslog(LOG_WARNING, PACKAGE " will not work correctly unless run as root"); - ctx.eloop = eloop_init(); - if (ctx.eloop == NULL) { - syslog(LOG_ERR, "%s: %m", __func__); - goto exit_failure; - } - #ifdef USE_SIGNALS if (sig != 0) { pid = read_pid(pidfile); |
