X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flibsystemd-network%2Fsd-dhcp-lease.c;h=aa479ffe15b9382b9e702731b4f132fb97bf4b9f;hp=f7a204af82a91380fe6fff6a98a3a04762323fbe;hb=6e00a80641aaba814204c65365c2fd5a90768394;hpb=8e34a618e2a67e22250247956697fe27c14c83c8 diff --git a/src/libsystemd-network/sd-dhcp-lease.c b/src/libsystemd-network/sd-dhcp-lease.c index f7a204af8..aa479ffe1 100644 --- a/src/libsystemd-network/sd-dhcp-lease.c +++ b/src/libsystemd-network/sd-dhcp-lease.c @@ -271,7 +271,7 @@ int dhcp_lease_parse_options(uint8_t code, uint8_t len, const uint8_t *option, } int dhcp_lease_new(sd_dhcp_lease **ret) { - _cleanup_dhcp_lease_unref_ sd_dhcp_lease *lease = NULL; + sd_dhcp_lease *lease; lease = new0(sd_dhcp_lease, 1); if (!lease) @@ -280,8 +280,6 @@ int dhcp_lease_new(sd_dhcp_lease **ret) { lease->n_ref = REFCNT_INIT; *ret = lease; - lease = NULL; - return 0; } @@ -297,10 +295,6 @@ int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file) { assert(lease); assert(lease_file); - r = mkdir_safe_label("/run/systemd/network/leases", 0755, 0, 0); - if (r < 0) - goto finish; - r = fopen_temporary(lease_file, &f, &temp_path); if (r < 0) goto finish; @@ -485,3 +479,29 @@ int dhcp_lease_load(const char *lease_file, sd_dhcp_lease **ret) { return 0; } + +int dhcp_lease_set_default_subnet_mask(sd_dhcp_lease *lease) { + uint32_t address; + + assert(lease); + assert(lease->address != INADDR_ANY); + + address = be32toh(lease->address); + + /* fall back to the default subnet masks based on address class */ + + if ((address >> 31) == 0x0) + /* class A, leading bits: 0 */ + lease->subnet_mask = htobe32(0xff000000); + else if ((address >> 30) == 0x2) + /* class B, leading bits 10 */ + lease->subnet_mask = htobe32(0xffff0000); + else if ((address >> 29) == 0x6) + /* class C, leading bits 110 */ + lease->subnet_mask = htobe32(0xffffff00); + else + /* class D or E, no default mask. give up */ + return -ERANGE; + + return 0; +}