chiark / gitweb /
systemctl: introduce -r switch to show units running in local containers in addition...
[elogind.git] / src / libsystemd-network / sd-dhcp-client.c
index 1f676ccb655455ad1a15b21b70cb3a041fc1eb01..f4a83fb7a4066b91416576e07f9bd74e2b98def4 100644 (file)
@@ -143,6 +143,15 @@ int sd_dhcp_client_set_mac(sd_dhcp_client *client,
         assert_return(client, -EINVAL);
         assert_return(client->state == DHCP_STATE_INIT, -EBUSY);
 
+        log_dhcp_client(client, "set MAC address to "
+                        "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
+                        addr->ether_addr_octet[0],
+                        addr->ether_addr_octet[1],
+                        addr->ether_addr_octet[2],
+                        addr->ether_addr_octet[3],
+                        addr->ether_addr_octet[4],
+                        addr->ether_addr_octet[5]);
+
         memcpy(&client->mac_addr, addr, ETH_ALEN);
 
         return 0;
@@ -176,7 +185,7 @@ static int client_stop(sd_dhcp_client *client, int error) {
                 sd_event_source_unref(client->receive_message);
 
         if (client->fd >= 0)
-                close(client->fd);
+                close_nointr_nofail(client->fd);
         client->fd = -1;
 
         client->timeout_resend = sd_event_source_unref(client->timeout_resend);
@@ -255,6 +264,15 @@ static int client_message_init(sd_dhcp_client *client, DHCPMessage *message,
         return 0;
 }
 
+static int dhcp_client_send_raw(sd_dhcp_client *client, DHCPPacket *packet,
+                                size_t len) {
+        dhcp_packet_append_ip_headers(packet, INADDR_ANY, DHCP_PORT_CLIENT,
+                                      INADDR_BROADCAST, DHCP_PORT_SERVER, len);
+
+        return dhcp_network_send_raw_socket(client->fd, &client->link,
+                                            packet, len);
+}
+
 static int client_send_discover(sd_dhcp_client *client, uint16_t secs) {
         int err = 0;
         _cleanup_free_ DHCPPacket *discover;
@@ -286,14 +304,13 @@ static int client_send_discover(sd_dhcp_client *client, uint16_t secs) {
         if (err < 0)
                 return err;
 
-        dhcp_packet_append_ip_headers(discover, len);
-
-        err = dhcp_network_send_raw_socket(client->fd, &client->link,
-                                           discover, len);
+        err = dhcp_client_send_raw(client, discover, len);
+        if (err < 0)
+                return err;
 
         log_dhcp_client(client, "DISCOVER");
 
-        return err;
+        return 0;
 }
 
 static int client_send_request(sd_dhcp_client *client, uint16_t secs) {
@@ -339,15 +356,14 @@ static int client_send_request(sd_dhcp_client *client, uint16_t secs) {
                                                    &request->dhcp,
                                                    len - DHCP_IP_UDP_SIZE);
         } else {
-                dhcp_packet_append_ip_headers(request, len);
-
-                err = dhcp_network_send_raw_socket(client->fd, &client->link,
-                                                   request, len);
+                err = dhcp_client_send_raw(client, request, len);
         }
+        if (err < 0)
+                return err;
 
         log_dhcp_client(client, "REQUEST");
 
-        return err;
+        return 0;
 }
 
 static uint16_t client_update_secs(sd_dhcp_client *client, usec_t time_now)
@@ -530,7 +546,7 @@ static int client_timeout_t2(sd_event_source *s, uint64_t usec, void *userdata)
         if (client->fd >= 0) {
                 client->receive_message =
                         sd_event_source_unref(client->receive_message);
-                close(client->fd);
+                close_nointr_nofail(client->fd);
                 client->fd = -1;
         }
 
@@ -587,6 +603,8 @@ static int client_handle_offer(sd_dhcp_client *client, DHCPMessage *offer,
         if (r != DHCP_OFFER)
                 return -ENOMSG;
 
+        lease->next_server = offer->siaddr;
+
         lease->address = offer->yiaddr;
 
         if (lease->address == INADDR_ANY ||
@@ -621,6 +639,8 @@ static int client_handle_ack(sd_dhcp_client *client, DHCPMessage *ack,
         if (r != DHCP_ACK)
                 return -ENOMSG;
 
+        lease->next_server = ack->siaddr;
+
         lease->address = ack->yiaddr;
 
         if (lease->address == INADDR_ANY ||
@@ -828,7 +848,7 @@ static int client_handle_message(sd_dhcp_client *client, DHCPMessage *message,
 
                         client->receive_message =
                                 sd_event_source_unref(client->receive_message);
-                        close(client->fd);
+                        close_nointr_nofail(client->fd);
                         client->fd = -1;
                 }