diff options
author | Tom Gundersen <teg@jklm.no> | 2014-03-03 15:43:02 +0100 |
---|---|---|
committer | Tom Gundersen <teg@jklm.no> | 2014-03-03 16:48:02 +0100 |
commit | ce78df79b88d02d36cbf9e39e70ecb871750e16d (patch) | |
tree | 6fba4d4220d43c0bc27b5f6cedc3a504a078e923 | |
parent | 8100c1a8f58b2fb5d97e156420a7e16562e93bc4 (diff) |
sd-dhcp-lease: add Root Path support
This is necessary when mounting /dev/nfs based on a DHCP lease.
-rw-r--r-- | src/libsystemd-network/dhcp-lease-internal.h | 1 | ||||
-rw-r--r-- | src/libsystemd-network/dhcp-protocol.h | 1 | ||||
-rw-r--r-- | src/libsystemd-network/sd-dhcp-lease.c | 25 | ||||
-rw-r--r-- | src/systemd/sd-dhcp-lease.h | 1 |
4 files changed, 28 insertions, 0 deletions
diff --git a/src/libsystemd-network/dhcp-lease-internal.h b/src/libsystemd-network/dhcp-lease-internal.h index d12bcac247..1b157fd454 100644 --- a/src/libsystemd-network/dhcp-lease-internal.h +++ b/src/libsystemd-network/dhcp-lease-internal.h @@ -46,6 +46,7 @@ struct sd_dhcp_lease { uint16_t mtu; char *domainname; char *hostname; + char *root_path; }; int dhcp_lease_new(sd_dhcp_lease **ret); diff --git a/src/libsystemd-network/dhcp-protocol.h b/src/libsystemd-network/dhcp-protocol.h index 81d36cef27..9aa9618b44 100644 --- a/src/libsystemd-network/dhcp-protocol.h +++ b/src/libsystemd-network/dhcp-protocol.h @@ -105,6 +105,7 @@ enum { DHCP_OPTION_DOMAIN_NAME_SERVER = 6, DHCP_OPTION_HOST_NAME = 12, DHCP_OPTION_DOMAIN_NAME = 15, + DHCP_OPTION_ROOT_PATH = 17, DHCP_OPTION_INTERFACE_MTU = 26, DHCP_OPTION_NTP_SERVER = 42, DHCP_OPTION_REQUESTED_IP_ADDRESS = 50, diff --git a/src/libsystemd-network/sd-dhcp-lease.c b/src/libsystemd-network/sd-dhcp-lease.c index 0529b6d8fa..722dd0a419 100644 --- a/src/libsystemd-network/sd-dhcp-lease.c +++ b/src/libsystemd-network/sd-dhcp-lease.c @@ -96,6 +96,18 @@ int sd_dhcp_lease_get_hostname(sd_dhcp_lease *lease, const char **hostname) { return 0; } +int sd_dhcp_lease_get_root_path(sd_dhcp_lease *lease, const char **root_path) { + assert_return(lease, -EINVAL); + assert_return(root_path, -EINVAL); + + if (lease->root_path) + *root_path = lease->root_path; + else + return -ENOENT; + + return 0; +} + int sd_dhcp_lease_get_router(sd_dhcp_lease *lease, struct in_addr *addr) { assert_return(lease, -EINVAL); assert_return(addr, -EINVAL); @@ -212,6 +224,14 @@ int dhcp_lease_parse_options(uint8_t code, uint8_t len, const uint8_t *option, break; + case DHCP_OPTION_ROOT_PATH: + if (len >= 1) { + free(lease->root_path); + lease->root_path = strndup((const char *)option, len); + } + + break; + case DHCP_OPTION_RENEWAL_T1_TIME: if (len == 4) { memcpy(&val, option, 4); @@ -323,6 +343,10 @@ int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file) { if (r >= 0) fprintf(f, "HOSTNAME=%s\n", string); + r = sd_dhcp_lease_get_root_path(lease, &string); + if (r >= 0) + fprintf(f, "ROOT_PATH=%s\n", string); + r = 0; fflush(f); @@ -361,6 +385,7 @@ int dhcp_lease_load(const char *lease_file, sd_dhcp_lease **ret) { "MTU", &mtu, "DOMAINNAME", &lease->domainname, "HOSTNAME", &lease->hostname, + "ROOT_PATH", &lease->root_path, NULL); if (r < 0) { if (r == -ENOENT) diff --git a/src/systemd/sd-dhcp-lease.h b/src/systemd/sd-dhcp-lease.h index af687a673b..5b34b2a070 100644 --- a/src/systemd/sd-dhcp-lease.h +++ b/src/systemd/sd-dhcp-lease.h @@ -37,5 +37,6 @@ int sd_dhcp_lease_get_dns(sd_dhcp_lease *lease, struct in_addr **addr, size_t *a int sd_dhcp_lease_get_mtu(sd_dhcp_lease *lease, uint16_t *mtu); 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_root_path(sd_dhcp_lease *lease, const char **root_path); #endif |