1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2024-12-23 17:34:00 +03:00

libsystemd-dhcp: Factor out common code initializing events

Factor out common code from timeout T1 handling and starting of
the DHCP client.
This commit is contained in:
Patrik Flykt 2013-12-20 17:16:19 +02:00 committed by Tom Gundersen
parent aba26854e5
commit 6a1cd41ef0

View File

@ -607,6 +607,28 @@ error:
return 0;
}
static int client_initialize_events(sd_dhcp_client *client, usec_t usec)
{
int r;
r = sd_event_add_io(client->event, client->fd, EPOLLIN,
client_receive_message, client,
&client->receive_message);
if (r < 0)
goto error;
r = sd_event_add_monotonic(client->event, usec, 0,
client_timeout_resend, client,
&client->timeout_resend);
error:
if (r < 0)
client_stop(client, r);
return 0;
}
static int client_timeout_expire(sd_event_source *s, uint64_t usec,
void *userdata)
{
@ -632,28 +654,14 @@ static int client_timeout_t1(sd_event_source *s, uint64_t usec, void *userdata)
r = dhcp_network_bind_udp_socket(client->index,
client->lease->address);
if (r < 0)
goto error;
if (r < 0) {
client_stop(client, r);
return 0;
}
client->fd = r;
r = sd_event_add_io(client->event, client->fd, EPOLLIN,
client_receive_message, client,
&client->receive_message);
if (r < 0)
goto error;
r = sd_event_add_monotonic(client->event, usec, 0,
client_timeout_resend, client,
&client->timeout_resend);
if (r < 0)
goto error;
return 0;
error:
client_stop(client, r);
return 0;
return client_initialize_events(client, usec);
}
static int client_parse_offer(uint8_t code, uint8_t len, const uint8_t *option,
@ -1019,7 +1027,7 @@ error:
int sd_dhcp_client_start(sd_dhcp_client *client)
{
int err;
int r;
assert_return(client, -EINVAL);
assert_return(client->index >= 0, -EINVAL);
@ -1028,33 +1036,17 @@ int sd_dhcp_client_start(sd_dhcp_client *client)
client->xid = random_u();
client->fd = dhcp_network_bind_raw_socket(client->index,
&client->link);
r = dhcp_network_bind_raw_socket(client->index, &client->link);
if (client->fd < 0) {
err = client->fd;
goto error;
if (r < 0) {
client_stop(client, r);
return r;
}
err = sd_event_add_io(client->event, client->fd, EPOLLIN,
client_receive_message, client,
&client->receive_message);
if (err < 0)
goto error;
client->fd = r;
client->start_time = now(CLOCK_MONOTONIC);
err = sd_event_add_monotonic(client->event, client->start_time, 0,
client_timeout_resend, client,
&client->timeout_resend);
if (err < 0)
goto error;
return 0;
error:
client_stop(client, err);
return err;
return client_initialize_events(client, client->start_time);
}
int sd_dhcp_client_stop(sd_dhcp_client *client)