summaryrefslogtreecommitdiffstats
path: root/dhcpcd.c
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2014-06-22 13:05:05 +0000
committerRoy Marples <roy@marples.name>2014-06-22 13:05:05 +0000
commitbf7db9ecedcddc28ffa5eb4fa513195be8f14e29 (patch)
treef10dca892022bfd1e56c680c15b2b2b1adb6efd8 /dhcpcd.c
parent5e8e0b721eef879b85b0f20c30f15a7e413d50f6 (diff)
downloaddhcpcd-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.c40
1 files changed, 33 insertions, 7 deletions
diff --git a/dhcpcd.c b/dhcpcd.c
index 3e25523f..d950c354 100644
--- a/dhcpcd.c
+++ b/dhcpcd.c
@@ -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);