1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2024-10-29 21:55:25 +03:00

sd-dhcp-lease: load/save client ID

The lease is usually tied to the client ID, so users of the
lease may want to know what client ID it was acquired with.
This commit is contained in:
Dan Williams 2014-11-18 17:13:12 -06:00 committed by Tom Gundersen
parent ba6c0fd630
commit e37f74a6d5
4 changed files with 80 additions and 1 deletions

View File

@ -70,6 +70,8 @@ struct sd_dhcp_lease {
char *domainname; char *domainname;
char *hostname; char *hostname;
char *root_path; char *root_path;
uint8_t *client_id;
size_t client_id_len;
}; };
int dhcp_lease_new(sd_dhcp_lease **ret); int dhcp_lease_new(sd_dhcp_lease **ret);
@ -78,5 +80,8 @@ int dhcp_lease_parse_options(uint8_t code, uint8_t len, const uint8_t *option,
int dhcp_lease_set_default_subnet_mask(sd_dhcp_lease *lease); int dhcp_lease_set_default_subnet_mask(sd_dhcp_lease *lease);
int dhcp_lease_set_client_id(sd_dhcp_lease *lease, const uint8_t *client_id,
size_t client_id_len);
DEFINE_TRIVIAL_CLEANUP_FUNC(sd_dhcp_lease*, sd_dhcp_lease_unref); DEFINE_TRIVIAL_CLEANUP_FUNC(sd_dhcp_lease*, sd_dhcp_lease_unref);
#define _cleanup_dhcp_lease_unref_ _cleanup_(sd_dhcp_lease_unrefp) #define _cleanup_dhcp_lease_unref_ _cleanup_(sd_dhcp_lease_unrefp)

View File

@ -1029,6 +1029,14 @@ static int client_handle_offer(sd_dhcp_client *client, DHCPMessage *offer,
if (r < 0) if (r < 0)
return r; return r;
if (client->client_id_len) {
r = dhcp_lease_set_client_id(lease,
(uint8_t *) &client->client_id.raw,
client->client_id_len);
if (r < 0)
return r;
}
r = dhcp_option_parse(offer, len, dhcp_lease_parse_options, lease); r = dhcp_option_parse(offer, len, dhcp_lease_parse_options, lease);
if (r != DHCP_OFFER) { if (r != DHCP_OFFER) {
log_dhcp_client(client, "received message was not an OFFER, ignoring"); log_dhcp_client(client, "received message was not an OFFER, ignoring");
@ -1088,6 +1096,14 @@ static int client_handle_ack(sd_dhcp_client *client, DHCPMessage *ack,
if (r < 0) if (r < 0)
return r; return r;
if (client->client_id_len) {
r = dhcp_lease_set_client_id(lease,
(uint8_t *) &client->client_id.raw,
client->client_id_len);
if (r < 0)
return r;
}
r = dhcp_option_parse(ack, len, dhcp_lease_parse_options, lease); r = dhcp_option_parse(ack, len, dhcp_lease_parse_options, lease);
if (r == DHCP_NAK) { if (r == DHCP_NAK) {
log_dhcp_client(client, "NAK"); log_dhcp_client(client, "NAK");

View File

@ -199,6 +199,7 @@ sd_dhcp_lease *sd_dhcp_lease_unref(sd_dhcp_lease *lease) {
free(lease->dns); free(lease->dns);
free(lease->ntp); free(lease->ntp);
free(lease->static_route); free(lease->static_route);
free(lease->client_id);
free(lease); free(lease);
} }
@ -585,6 +586,8 @@ int sd_dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file) {
_cleanup_fclose_ FILE *f = NULL; _cleanup_fclose_ FILE *f = NULL;
struct in_addr address; struct in_addr address;
const struct in_addr *addresses; const struct in_addr *addresses;
const uint8_t *client_id;
size_t client_id_len;
const char *string; const char *string;
uint16_t mtu; uint16_t mtu;
struct sd_dhcp_route *routes; struct sd_dhcp_route *routes;
@ -658,6 +661,18 @@ int sd_dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file) {
if (r >= 0) if (r >= 0)
serialize_dhcp_routes(f, "ROUTES", routes, r); serialize_dhcp_routes(f, "ROUTES", routes, r);
r = sd_dhcp_lease_get_client_id(lease, &client_id, &client_id_len);
if (r >= 0) {
_cleanup_free_ char *client_id_hex;
client_id_hex = hexmem (client_id, client_id_len);
if (!client_id_hex) {
r = -ENOMEM;
goto finish;
}
fprintf(f, "CLIENTID=%s\n", client_id_hex);
}
r = 0; r = 0;
fflush(f); fflush(f);
@ -679,7 +694,8 @@ int sd_dhcp_lease_load(sd_dhcp_lease **ret, const char *lease_file) {
_cleanup_dhcp_lease_unref_ sd_dhcp_lease *lease = NULL; _cleanup_dhcp_lease_unref_ sd_dhcp_lease *lease = NULL;
_cleanup_free_ char *address = NULL, *router = NULL, *netmask = NULL, _cleanup_free_ char *address = NULL, *router = NULL, *netmask = NULL,
*server_address = NULL, *next_server = NULL, *server_address = NULL, *next_server = NULL,
*dns = NULL, *ntp = NULL, *mtu = NULL, *routes = NULL; *dns = NULL, *ntp = NULL, *mtu = NULL,
*routes = NULL, *client_id_hex = NULL;
struct in_addr addr; struct in_addr addr;
int r; int r;
@ -703,6 +719,7 @@ int sd_dhcp_lease_load(sd_dhcp_lease **ret, const char *lease_file) {
"HOSTNAME", &lease->hostname, "HOSTNAME", &lease->hostname,
"ROOT_PATH", &lease->root_path, "ROOT_PATH", &lease->root_path,
"ROUTES", &routes, "ROUTES", &routes,
"CLIENTID", &client_id_hex,
NULL); NULL);
if (r < 0) { if (r < 0) {
if (r == -ENOENT) if (r == -ENOENT)
@ -777,6 +794,16 @@ int sd_dhcp_lease_load(sd_dhcp_lease **ret, const char *lease_file) {
return r; return r;
} }
if (client_id_hex) {
if (strlen (client_id_hex) % 2)
return -EINVAL;
lease->client_id = unhexmem (client_id_hex, strlen (client_id_hex));
if (!lease->client_id)
return -ENOMEM;
lease->client_id_len = strlen (client_id_hex) / 2;
}
*ret = lease; *ret = lease;
lease = NULL; lease = NULL;
@ -801,3 +828,32 @@ int dhcp_lease_set_default_subnet_mask(sd_dhcp_lease *lease) {
return 0; return 0;
} }
int sd_dhcp_lease_get_client_id(sd_dhcp_lease *lease, const uint8_t **client_id,
size_t *client_id_len) {
assert_return(lease, -EINVAL);
assert_return(client_id, -EINVAL);
assert_return(client_id_len, -EINVAL);
*client_id = lease->client_id;
*client_id_len = lease->client_id_len;
return 0;
}
int dhcp_lease_set_client_id(sd_dhcp_lease *lease, const uint8_t *client_id,
size_t client_id_len) {
assert_return(lease, -EINVAL);
assert_return((!client_id && !client_id_len) ||
(client_id && client_id_len), -EINVAL);
free (lease->client_id);
lease->client_id = NULL;
lease->client_id_len = 0;
if (client_id) {
lease->client_id = memdup (client_id, client_id_len);
lease->client_id_len = client_id_len;
}
return 0;
}

View File

@ -45,6 +45,8 @@ int sd_dhcp_lease_get_domainname(sd_dhcp_lease *lease, const char **domainname);
int sd_dhcp_lease_get_hostname(sd_dhcp_lease *lease, const char **hostname); int sd_dhcp_lease_get_hostname(sd_dhcp_lease *lease, const char **hostname);
int sd_dhcp_lease_get_root_path(sd_dhcp_lease *lease, const char **root_path); int sd_dhcp_lease_get_root_path(sd_dhcp_lease *lease, const char **root_path);
int sd_dhcp_lease_get_routes(sd_dhcp_lease *lease, struct sd_dhcp_route **routesgn); int sd_dhcp_lease_get_routes(sd_dhcp_lease *lease, struct sd_dhcp_route **routesgn);
int sd_dhcp_lease_get_client_id(sd_dhcp_lease *lease, const uint8_t **client_id,
size_t *client_id_len);
int sd_dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file); int sd_dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file);
int sd_dhcp_lease_load(sd_dhcp_lease **ret, const char *lease_file); int sd_dhcp_lease_load(sd_dhcp_lease **ret, const char *lease_file);