+static struct dhclient_task *find_task_by_index(int index)
+{
+ GSList *list;
+
+ for (list = tasks; list; list = list->next) {
+ struct dhclient_task *task = list->data;
+
+ if (task->ifindex == index)
+ return task;
+ }
+
+ return NULL;
+}
+
+static void kill_task(struct dhclient_task *task)
+{
+ if (task->pid > 0)
+ kill(task->pid, SIGTERM);
+}
+
+static void task_died(GPid pid, gint status, gpointer data)
+{
+ struct dhclient_task *task = data;
+ char pathname[PATH_MAX];
+
+ if (WIFEXITED(status))
+ printf("[DHCP] exit status %d for %s\n",
+ WEXITSTATUS(status), task->ifname);
+ else
+ printf("[DHCP] signal %d killed %s\n",
+ WTERMSIG(status), task->ifname);
+
+ g_spawn_close_pid(pid);
+ task->pid = 0;
+
+ tasks = g_slist_remove(tasks, task);
+
+ snprintf(pathname, sizeof(pathname) - 1,
+ "%s/dhclient.%s.pid", STATEDIR, task->ifname);
+ unlink(pathname);
+
+ snprintf(pathname, sizeof(pathname) - 1,
+ "%s/dhclient.%s.leases", STATEDIR, task->ifname);
+ unlink(pathname);
+
+ free(task->ifname);
+
+ g_free(task);
+}
+
+static void task_setup(gpointer data)
+{
+ struct dhclient_task *task = data;
+
+ printf("[DHCP] setup %s\n", task->ifname);
+}
+