assert(client);
assert(client->event);
+ assert(io_callback);
- r = sd_event_add_io(client->event, &client->receive_message,
- client->fd, EPOLLIN, io_callback,
- client);
+ _cleanup_(sd_event_source_unrefp) sd_event_source *s = NULL;
+ r = sd_event_add_io(client->event, &s, client->fd, EPOLLIN, io_callback, client);
if (r < 0)
- goto error;
-
- r = sd_event_source_set_priority(client->receive_message,
- client->event_priority);
- if (r < 0)
- goto error;
+ return r;
- r = sd_event_source_set_description(client->receive_message, "dhcp4-receive-message");
+ r = sd_event_source_set_priority(s, client->event_priority);
if (r < 0)
- goto error;
+ return r;
-error:
+ r = sd_event_source_set_description(s, "dhcp4-receive-message");
if (r < 0)
- client_stop(client, r);
+ return r;
+ sd_event_source_disable_unref(client->receive_message);
+ client->receive_message = TAKE_PTR(s);
return 0;
}
static int client_initialize_time_events(sd_dhcp_client *client) {
- usec_t usec = 0;
- int r;
-
assert(client);
assert(client->event);
(void) event_source_disable(client->timeout_ipv6_only_mode);
- if (client->start_delay > 0) {
- assert_se(sd_event_now(client->event, CLOCK_BOOTTIME, &usec) >= 0);
- usec = usec_add(usec, client->start_delay);
- }
-
- r = event_reset_time(client->event, &client->timeout_resend,
- CLOCK_BOOTTIME,
- usec, 0,
- client_timeout_resend, client,
- client->event_priority, "dhcp4-resend-timer", true);
- if (r < 0)
- client_stop(client, r);
-
- return 0;
+ return event_reset_time_relative(
+ client->event,
+ &client->timeout_resend,
+ CLOCK_BOOTTIME,
+ client->start_delay,
+ /* accuracy= */ 0,
+ client_timeout_resend,
+ client,
+ client->event_priority,
+ "dhcp4-resend-timer",
+ /* force_reset= */ true);
}
static int client_initialize_events(sd_dhcp_client *client, sd_event_io_handler_t io_callback) {
- client_initialize_io_events(client, io_callback);
- client_initialize_time_events(client);
+ int r;
- return 0;
+ assert(client);
+ assert(io_callback);
+
+ r = client_initialize_io_events(client, io_callback);
+ if (r < 0)
+ return r;
+
+ return client_initialize_time_events(client);
}
static int client_start_delayed(sd_dhcp_client *client) {
&client->hw_addr, &client->bcast_addr,
client->arp_type, client->port,
client->socket_priority_set, client->socket_priority);
- if (r < 0) {
- client_stop(client, r);
+ if (r < 0)
return r;
- }
client->fd = r;
client->start_time = now(CLOCK_BOOTTIME);
}
client->fd = r;
- return client_initialize_events(client, client_receive_message_raw);
+ r = client_initialize_events(client, client_receive_message_raw);
+ if (r < 0)
+ client_stop(client, r);
+
+ return 0;
}
static int client_timeout_t1(sd_event_source *s, uint64_t usec, void *userdata) {
sd_dhcp_client *client = userdata;
DHCP_CLIENT_DONT_DESTROY(client);
+ int r;
if (client->lease)
client_set_state(client, DHCP_STATE_RENEWING);
client->discover_attempt = 0;
client->request_attempt = 0;
- return client_initialize_time_events(client);
+ r = client_initialize_time_events(client);
+ if (r < 0)
+ client_stop(client, r);
+
+ return 0;
}
static int dhcp_option_parse_and_verify(
client->receive_message = sd_event_source_disable_unref(client->receive_message);
close_and_replace(client->fd, r);
- client_initialize_io_events(client, client_receive_message_udp);
+ r = client_initialize_io_events(client, client_receive_message_udp);
+ if (r < 0)
+ return r;
}
client_notify(client, notify_event);