From: Zbigniew Jędrzejewski-Szmek Date: Thu, 2 Apr 2020 14:16:31 +0000 (+0200) Subject: sd-dhcp-server: add a meta-setter to simplify setting of server lists X-Git-Tag: v246-rc1~551^2~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c8407baf30be465f667e5ea9ef7702860041a16d;p=thirdparty%2Fsystemd.git sd-dhcp-server: add a meta-setter to simplify setting of server lists --- diff --git a/src/libsystemd-network/sd-dhcp-server.c b/src/libsystemd-network/sd-dhcp-server.c index ee4a7249c26..a4dcddd95d3 100644 --- a/src/libsystemd-network/sd-dhcp-server.c +++ b/src/libsystemd-network/sd-dhcp-server.c @@ -1123,132 +1123,81 @@ int sd_dhcp_server_set_default_lease_time(sd_dhcp_server *server, uint32_t t) { return 1; } -int sd_dhcp_server_set_dns(sd_dhcp_server *server, const struct in_addr dns[], unsigned n) { - assert_return(server, -EINVAL); - assert_return(dns || n <= 0, -EINVAL); - - if (server->n_dns == n && - memcmp(server->dns, dns, sizeof(struct in_addr) * n) == 0) - return 0; - - if (n <= 0) { - server->dns = mfree(server->dns); - server->n_dns = 0; - } else { - struct in_addr *c; - - c = newdup(struct in_addr, dns, n); - if (!c) - return -ENOMEM; +int sd_dhcp_server_set_servers( + sd_dhcp_server *server, + sd_dhcp_lease_info what, + const struct in_addr addresses[], + unsigned n_addresses) { - free(server->dns); - server->dns = c; - server->n_dns = n; - } - - return 1; -} - -int sd_dhcp_server_set_ntp(sd_dhcp_server *server, const struct in_addr ntp[], unsigned n) { assert_return(server, -EINVAL); - assert_return(ntp || n <= 0, -EINVAL); + assert_return(addresses || n_addresses == 0, -EINVAL); - if (server->n_ntp == n && - memcmp(server->ntp, ntp, sizeof(struct in_addr) * n) == 0) - return 0; + struct in_addr **a; + unsigned *n_a; - if (n <= 0) { - server->ntp = mfree(server->ntp); - server->n_ntp = 0; - } else { - struct in_addr *c; - - c = newdup(struct in_addr, ntp, n); - if (!c) - return -ENOMEM; - - free(server->ntp); - server->ntp = c; - server->n_ntp = n; - } - - return 1; -} + switch (what) { + case SD_DHCP_LEASE_DNS_SERVERS: + a = &server->dns; + n_a = &server->n_dns; + break; -int sd_dhcp_server_set_sip(sd_dhcp_server *server, const struct in_addr sip[], unsigned n) { - assert_return(server, -EINVAL); - assert_return(sip || n <= 0, -EINVAL); + case SD_DHCP_LEASE_NTP_SERVERS: + a = &server->ntp; + n_a = &server->n_ntp; + break; - if (server->n_sip == n && - memcmp(server->sip, sip, sizeof(struct in_addr) * n) == 0) - return 0; + case SD_DHCP_LEASE_SIP_SERVERS: + a = &server->sip; + n_a = &server->n_sip; + break; - if (n <= 0) { - server->sip = mfree(server->sip); - server->n_sip = 0; - } else { - struct in_addr *c; + case SD_DHCP_LEASE_POP3_SERVERS: + a = &server->pop3_server; + n_a = &server->n_pop3_server; + break; - c = newdup(struct in_addr, sip, n); - if (!c) - return -ENOMEM; + case SD_DHCP_LEASE_SMTP_SERVERS: + a = &server->smtp_server; + n_a = &server->n_smtp_server; + break; - free(server->sip); - server->sip = c; - server->n_sip = n; + default: + log_debug("Uknown DHCP lease info item %d.", what); + return -ENXIO; } - return 1; -} - -int sd_dhcp_server_set_pop3_server(sd_dhcp_server *server, const struct in_addr pop3_server[], unsigned n) { - assert_return(server, -EINVAL); - assert_return(pop3_server || n <= 0, -EINVAL); - - if (server->n_pop3_server == n && - memcmp(server->pop3_server, pop3_server, sizeof(struct in_addr) * n) == 0) + if (*n_a == n_addresses && + memcmp(*a, addresses, sizeof(struct in_addr) * n_addresses) == 0) return 0; - if (n <= 0) { - server->pop3_server = mfree(server->pop3_server); - server->n_pop3_server = 0; - } else { - struct in_addr *c; + struct in_addr *c = NULL; - c = newdup(struct in_addr, pop3_server, n); + if (n_addresses > 0) { + c = newdup(struct in_addr, addresses, n_addresses); if (!c) return -ENOMEM; - - free_and_replace(server->pop3_server, c); - server->n_pop3_server = n; } + free(*a); + *a = c; + *n_a = n_addresses; return 1; } -int sd_dhcp_server_set_smtp_server(sd_dhcp_server *server, const struct in_addr smtp_server[], unsigned n) { - assert_return(server, -EINVAL); - assert_return(smtp_server || n <= 0, -EINVAL); - - if (server->n_smtp_server == n && - memcmp(server->smtp_server, smtp_server, sizeof(struct in_addr) * n) == 0) - return 0; - - if (n <= 0) { - server->smtp_server = mfree(server->smtp_server); - server->n_smtp_server = 0; - } else { - struct in_addr *c; - - c = newdup(struct in_addr, smtp_server, n); - if (!c) - return -ENOMEM; - - free_and_replace(server->smtp_server, c); - server->n_smtp_server = n; - } - - return 1; +int sd_dhcp_server_set_dns(sd_dhcp_server *server, const struct in_addr dns[], unsigned n) { + return sd_dhcp_server_set_servers(server, SD_DHCP_LEASE_DNS_SERVERS, dns, n); +} +int sd_dhcp_server_set_ntp(sd_dhcp_server *server, const struct in_addr ntp[], unsigned n) { + return sd_dhcp_server_set_servers(server, SD_DHCP_LEASE_NTP_SERVERS, ntp, n); +} +int sd_dhcp_server_set_sip(sd_dhcp_server *server, const struct in_addr sip[], unsigned n) { + return sd_dhcp_server_set_servers(server, SD_DHCP_LEASE_SIP_SERVERS, sip, n); +} +int sd_dhcp_server_set_pop3_server(sd_dhcp_server *server, const struct in_addr pop3[], unsigned n) { + return sd_dhcp_server_set_servers(server, SD_DHCP_LEASE_POP3_SERVERS, pop3, n); +} +int sd_dhcp_server_set_smtp_server(sd_dhcp_server *server, const struct in_addr smtp[], unsigned n) { + return sd_dhcp_server_set_servers(server, SD_DHCP_LEASE_SMTP_SERVERS, smtp, n); } int sd_dhcp_server_set_emit_router(sd_dhcp_server *server, int enabled) { diff --git a/src/systemd/sd-dhcp-server.h b/src/systemd/sd-dhcp-server.h index 5f04034b82a..4c7938ca70c 100644 --- a/src/systemd/sd-dhcp-server.h +++ b/src/systemd/sd-dhcp-server.h @@ -21,6 +21,7 @@ #include #include +#include "sd-dhcp-lease.h" #include "sd-dhcp-option.h" #include "sd-event.h" @@ -47,12 +48,19 @@ int sd_dhcp_server_stop(sd_dhcp_server *server); int sd_dhcp_server_configure_pool(sd_dhcp_server *server, struct in_addr *address, unsigned char prefixlen, uint32_t offset, uint32_t size); int sd_dhcp_server_set_timezone(sd_dhcp_server *server, const char *timezone); +int sd_dhcp_server_set_emit_router(sd_dhcp_server *server, int enabled); + +int sd_dhcp_server_set_servers( + sd_dhcp_server *server, + sd_dhcp_lease_info what, + const struct in_addr addresses[], + unsigned n_addresses); + int sd_dhcp_server_set_dns(sd_dhcp_server *server, const struct in_addr dns[], unsigned n); int sd_dhcp_server_set_ntp(sd_dhcp_server *server, const struct in_addr ntp[], unsigned n); int sd_dhcp_server_set_sip(sd_dhcp_server *server, const struct in_addr sip[], unsigned n); int sd_dhcp_server_set_pop3_server(sd_dhcp_server *server, const struct in_addr pop3_server[], unsigned n); int sd_dhcp_server_set_smtp_server(sd_dhcp_server *server, const struct in_addr smtp_server[], unsigned n); -int sd_dhcp_server_set_emit_router(sd_dhcp_server *server, int enabled); int sd_dhcp_server_add_option(sd_dhcp_server *server, sd_dhcp_option *v); int sd_dhcp_server_add_vendor_option(sd_dhcp_server *server, sd_dhcp_option *v);