---
 src/dhcp6c.c |   71 +++++++++++++++++++++++++++++++----------------------------
 1 file changed, 38 insertions(+), 33 deletions(-)

--- a/src/dhcp6c.c
+++ b/src/dhcp6c.c
@@ -102,8 +102,8 @@ static socklen_t sa6_alen;
 static struct duid client_duid;
 
 static void usage __P((char *name));
-static void client6_init __P((char *));
-static void client6_ifinit __P((char *));
+static int client6_init __P((char *));
+static int client6_ifinit __P((char *));
 void free_servers __P((struct dhcp6_if *));
 static void free_resources __P((struct dhcp6_if *));
 static int create_request_list __P((int));
@@ -305,8 +305,10 @@ int dhcpv6_client
 			FNAME);
 		exit(1);
 	}
-	client6_init(device);
-	client6_ifinit(device);
+	if (client6_init(device))
+		return -1;
+	if (client6_ifinit(device))
+		return -1;
 	client6_mainloop();
 #ifdef LIBDHCP
 	/* close all file descriptors */
@@ -370,7 +372,7 @@ usage(char *name)
 
 /*------------------------------------------------------------*/
 
-void
+int
 client6_init(device)
 	char *device;
 {
@@ -389,19 +391,19 @@ client6_init(device)
 	ifidx = if_nametoindex(device);
 	if (ifidx == 0) {
 		dprintf(LOG_ERR, "if_nametoindex(%s)", device);
-		return;
+		return -1;
 	}
 
 	/* get our DUID */
 	if (get_duid(DUID_FILE, device, &client_duid)) {
 		dprintf(LOG_ERR, "%s" "failed to get a DUID", FNAME);
-		return;
+		return -1;
 	}
 	if (get_linklocal(device, &lladdr) < 0) {
-		return;
+		return -1;
 	}
 	if (inet_ntop(AF_INET6, &lladdr, linklocal, sizeof(linklocal)) < 0) {
-		return;
+		return -1;
 	}
 	dprintf(LOG_DEBUG, "link local addr is %s", linklocal);
 	
@@ -414,12 +416,12 @@ client6_init(device)
 	if (error) {
 		dprintf(LOG_ERR, "%s" "getaddrinfo: %s",
 			FNAME, strerror(error));
-		return;
+		return -1;
 	}
 	iosock = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
 	if (iosock < 0) {
 		dprintf(LOG_ERR, "%s" "socket", FNAME);
-		return;
+		return -1;
 	}
 #ifdef IPV6_RECVPKTINFO
 	if (setsockopt(iosock, IPPROTO_IPV6, IPV6_RECVPKTINFO, &on,
@@ -427,7 +429,7 @@ client6_init(device)
 		dprintf(LOG_ERR, "%s"
 			"setsockopt(inbound, IPV6_RECVPKTINFO): %s",
 			FNAME, strerror(errno));
-		return;
+		return -1;
 	}
 #else
 	if (setsockopt(iosock, IPPROTO_IPV6, IPV6_PKTINFO, &on,
@@ -435,7 +437,7 @@ client6_init(device)
 		dprintf(LOG_ERR, "%s"
 			"setsockopt(inbound, IPV6_PKTINFO): %s",
 			FNAME, strerror(errno));
-		return;
+		return -1;
 	}
 #endif
 	((struct sockaddr_in6 *)(res->ai_addr))->sin6_scope_id = ifidx;
@@ -464,7 +466,7 @@ client6_init(device)
 
 	if (bound < 0) {
 		dprintf(LOG_ERR, "%s" "bind: %s", FNAME, strerror(-bound));
-		return;
+		return -1;
 	}
 
 	freeaddrinfo(res);
@@ -475,14 +477,14 @@ client6_init(device)
 	if (error) {
 		dprintf(LOG_ERR, "%s" "getaddrinfo: %s",
 			FNAME, gai_strerror(error));
-		return;
+		return -1;
 	}
 	if (setsockopt(iosock, IPPROTO_IPV6, IPV6_MULTICAST_IF,
 			&ifidx, sizeof(ifidx)) < 0) {
 		dprintf(LOG_ERR, "%s"
 			"setsockopt(iosock, IPV6_MULTICAST_IF): %s",
 			FNAME, strerror(errno));
-		return;
+		return -1;
 	}
 	((struct sockaddr_in6 *)(res->ai_addr))->sin6_scope_id = ifidx;
 	freeaddrinfo(res);
@@ -494,7 +496,7 @@ client6_init(device)
 	if (error) {
 		dprintf(LOG_ERR, "%s" "getaddrinfo: %s",
 			FNAME, gai_strerror(error));
-		return;
+		return -1;
 	}
 	memcpy(&sa6_allagent_storage, res->ai_addr, res->ai_addrlen);
 	sa6_allagent = (const struct sockaddr_in6 *)&sa6_allagent_storage;
@@ -505,7 +507,7 @@ client6_init(device)
 	if ((ifp = find_ifconfbyname(device)) == NULL) {
 		dprintf(LOG_ERR, "%s" "interface %s not configured",
 			FNAME, device);
-		return;
+		return -1;
 	}
 	ifp->outsock = iosock;
 
@@ -513,22 +515,23 @@ client6_init(device)
 	if (signal(SIGHUP, client6_signal) == SIG_ERR) {
 		dprintf(LOG_WARNING, "%s" "failed to set signal: %s",
 			FNAME, strerror(errno));
-		return;
+		return -1;
 	}
 	if (signal(SIGTERM|SIGKILL, client6_signal) == SIG_ERR) {
 		dprintf(LOG_WARNING, "%s" "failed to set signal: %s",
 			FNAME, strerror(errno));
-		return;
+		return -1;
 	}
 	if (signal(SIGINT, client6_signal) == SIG_ERR) {
 		dprintf(LOG_WARNING, "%s" "failed to set signal: %s",
 			FNAME, strerror(errno));
-		return;
+		return -1;
 	}
 #endif
+	return 0;
 }
 
-static void
+static int
 client6_ifinit(char *device)
 {
 	struct dhcp6_if *ifp = dhcp6_if;
@@ -539,13 +542,13 @@ client6_ifinit(char *device)
 	/* get iaid for each interface */
 	if (num_device == 0) {
 		if ((num_device = create_iaid(&iaidtab[0], num_device)) < 0)
-			return;
+			return -1;
 		ifp->iaidinfo.iaid = get_iaid(ifp->ifname, &iaidtab[0], num_device);
 		if (ifp->iaidinfo.iaid == 0) {
 			dprintf(LOG_DEBUG, "%s" 
 				"interface %s iaid failed to be created", 
 				FNAME, ifp->ifname);
-			return;
+			return -1;
 		}
 		dprintf(LOG_DEBUG, "%s" "interface %s iaid is %u", 
 			FNAME, ifp->ifname, ifp->iaidinfo.iaid);
@@ -565,14 +568,14 @@ client6_ifinit(char *device)
 	if ((client6_lease_file = 
 		init_leases(leasename)) == NULL) {
 			dprintf(LOG_ERR, "%s" "failed to parse lease file", FNAME);
-		return;
+		return -1;
 	}
 	strcpy(client6_lease_temp, leasename);
 	strcat(client6_lease_temp, "XXXXXX");
 	client6_lease_file = 
 		sync_leases(client6_lease_file, leasename, client6_lease_temp);
 	if (client6_lease_file == NULL)
-		return;
+		return -1;
 #ifdef LIBDHCP
 	}
 #endif
@@ -583,7 +586,7 @@ client6_ifinit(char *device)
 			client6_request_flag |= CLIENT6_CONFIRM_ADDR;
 		if (TAILQ_EMPTY(&request_list)) {
 			if (create_request_list(1) < 0) 
-				return;
+				return -1;
 		} else if (client6_request_flag & CLIENT6_RELEASE_ADDR) {
 			for (lv = TAILQ_FIRST(&request_list); lv; 
 					lv = TAILQ_NEXT(lv, link)) {
@@ -592,13 +595,13 @@ client6_ifinit(char *device)
 					dprintf(LOG_INFO, "this address %s is not"
 						" leased by this client", 
 					    in6addr2str(&lv->val_dhcp6addr.addr,0));
-					return;
+					return -1;
 				}
 			}
 		}	
 	} else if (client6_request_flag & CLIENT6_RELEASE_ADDR) {
 		dprintf(LOG_INFO, "no ipv6 addresses are leased by client");
-		return;
+		return -1;
 	}
 	ifp->link_flag |= IFF_RUNNING;
 
@@ -609,11 +612,11 @@ client6_ifinit(char *device)
 	if ((ifp->link_timer =
 	    dhcp6_add_timer(check_link_timo, ifp)) < 0) {
 		dprintf(LOG_ERR, "%s" "failed to create a timer", FNAME);
-		return;
+		return -1;
 	}
 	if ((ifp->sync_timer = dhcp6_add_timer(check_lease_file_timo, ifp)) < 0) {
 		dprintf(LOG_ERR, "%s" "failed to create a timer", FNAME);
-		return;
+		return -1;
 	}
 	/* DAD timer set up after getting the address */
 	ifp->dad_timer = NULL;
@@ -621,7 +624,7 @@ client6_ifinit(char *device)
 	if ((ev = dhcp6_create_event(ifp, DHCP6S_INIT)) == NULL) {
 		dprintf(LOG_ERR, "%s" "failed to create an event",
 			FNAME);
-		return;
+		return -1;
 	}
 	ifp->servers = NULL;
 	ev->ifp->current_server = NULL;
@@ -629,9 +632,11 @@ client6_ifinit(char *device)
 	if ((ev->timer = dhcp6_add_timer(client6_timo, ev)) == NULL) {
 		dprintf(LOG_ERR, "%s" "failed to add a timer for %s",
 			FNAME, ifp->ifname);
-		return;
+		return -1;
 	}
 	dhcp6_reset_timer(ev);
+
+	return 0;
 }
 
 static void
