diff options
Diffstat (limited to 'src/libsystemd-network/sd-dhcp-server.c')
-rw-r--r-- | src/libsystemd-network/sd-dhcp-server.c | 35 |
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); |