/*
* dhcpcd-online
- * Copyright 2014 Roy Marples <roy@marples.name>
+ * Copyright 2014-2015 Roy Marples <roy@marples.name>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
do_exit(DHCPCD_CONNECTION *con, int code)
{
+ /* Unregister the status callback so that close doesn't spam. */
+ dhcpcd_set_status_callback(con, NULL, NULL);
+
dhcpcd_close(con);
dhcpcd_free(con);
exit(code);
}
static void
-do_status_cb(DHCPCD_CONNECTION *con, const char *status, void __unused *arg)
+do_status_cb(DHCPCD_CONNECTION *con, const char *status, void *arg)
{
+ struct pollfd *pfd;
syslog(LOG_INFO, "%s", status);
if (strcmp(status, "connected") == 0)
do_exit(con, EXIT_SUCCESS);
+ if (strcmp(status, "down") == 0) {
+ pfd = arg;
+ pfd->fd = -1;
+ }
}
int
return EXIT_FAILURE;
}
- dhcpcd_set_status_callback(con, do_status_cb, NULL);
+ dhcpcd_set_status_callback(con, do_status_cb, &pfd);
- if ((pfd.fd = dhcpcd_open(con)) == -1) {
+ if ((pfd.fd = dhcpcd_open(con, false)) == -1) {
lerrno = errno;
syslog(LOG_WARNING, "dhcpcd_open: %m");
if (xflag)
(t.tv_nsec + 999999) / 1000000 > INT_MAX % 1000000))
timeout = INT_MAX;
else
- timeout = (int)t.tv_sec * 1000 +
- (t.tv_nsec + 999999) / 1000000;
+ timeout = (int)(t.tv_sec * 1000 +
+ (t.tv_nsec + 999999) / 1000000);
n = poll(&pfd, 1, timeout);
}
if (n == -1) {
do_exit(con, EXIT_FAILURE);
}
if (pfd.fd == -1) {
- if ((pfd.fd = dhcpcd_open(con)) == -1) {
+ if ((pfd.fd = dhcpcd_open(con, false)) == -1) {
if (lerrno != errno) {
lerrno = errno;
syslog(LOG_WARNING, "dhcpcd_open: %m");