summaryrefslogtreecommitdiff
path: root/src/libsystemd-network/sd-dhcp-server.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libsystemd-network/sd-dhcp-server.c')
-rw-r--r--src/libsystemd-network/sd-dhcp-server.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/libsystemd-network/sd-dhcp-server.c b/src/libsystemd-network/sd-dhcp-server.c
index 89a487cf01..ee4a7249c2 100644
--- a/src/libsystemd-network/sd-dhcp-server.c
+++ b/src/libsystemd-network/sd-dhcp-server.c
@@ -141,6 +141,7 @@ static sd_dhcp_server *dhcp_server_free(sd_dhcp_server *server) {
free(server->ntp);
free(server->sip);
free(server->pop3_server);
+ free(server->smtp_server);
hashmap_free(server->leases_by_client_id);
@@ -523,6 +524,15 @@ static int server_send_ack(sd_dhcp_server *server, DHCPRequest *req,
return r;
}
+ if (server->n_smtp_server > 0) {
+ r = dhcp_option_append(
+ &packet->dhcp, req->max_optlen, &offset, 0,
+ SD_DHCP_OPTION_SMTP_SERVER,
+ sizeof(struct in_addr) * server->n_smtp_server, server->smtp_server);
+ if (r < 0)
+ return r;
+ }
+
if (server->timezone) {
r = dhcp_option_append(
&packet->dhcp, req->max_optlen, &offset, 0,
@@ -1216,6 +1226,31 @@ int sd_dhcp_server_set_pop3_server(sd_dhcp_server *server, const struct in_addr
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_emit_router(sd_dhcp_server *server, int enabled) {
assert_return(server, -EINVAL);