Compare commits
11 Commits
31c68e0277
...
69d06b7acf
Author | SHA1 | Date |
---|---|---|
24bisquitz | 69d06b7acf | |
Michal Sekletár | 8581b9f973 | |
Zbigniew Jędrzejewski-Szmek | 2df0df56dd | |
Zbigniew Jędrzejewski-Szmek | 3c04ed633b | |
Susant Sahani | 9f4aafea37 | |
Susant Sahani | 8102b9e710 | |
Susant Sahani | 284e8fd0d7 | |
Susant Sahani | f678ac7e29 | |
Christian Göttsche | 1b7d1cae0f | |
Christian Göttsche | 2073bf3f58 | |
Christian Göttsche | c8aa389c42 |
|
@ -249,6 +249,10 @@ sensor:modalias:acpi:*KIOX000A*:dmi:*svn*CytrixTechnology:*pn*Complex11t*
|
||||||
sensor:modalias:platform:HID-SENSOR-200073:dmi:*svnDell*:pnVostro5581:*
|
sensor:modalias:platform:HID-SENSOR-200073:dmi:*svnDell*:pnVostro5581:*
|
||||||
ACCEL_LOCATION=base
|
ACCEL_LOCATION=base
|
||||||
|
|
||||||
|
# Dell Venue 8 Pro 3845
|
||||||
|
sensor:modalias:acpi:INVN6500*:dmi:*svnDellInc.*:pnVenue8Pro3845*
|
||||||
|
ACCEL_MOUNT_MATRIX=0, -1, 0; -1, 0, 0; 0, 0, 1
|
||||||
|
|
||||||
# Dell Venue 10 Pro 5055
|
# Dell Venue 10 Pro 5055
|
||||||
sensor:modalias:acpi:INVN6500*:dmi:*svnDell*:pnVenue10Pro5055*
|
sensor:modalias:acpi:INVN6500*:dmi:*svnDell*:pnVenue10Pro5055*
|
||||||
ACCEL_MOUNT_MATRIX=0, -1, 0; 1, 0, 0; 0, 0, 1
|
ACCEL_MOUNT_MATRIX=0, -1, 0; 1, 0, 0; 0, 0, 1
|
||||||
|
|
|
@ -1386,6 +1386,7 @@
|
||||||
read via <function>sd_network_link_get_sip_servers()</function> function.</para>
|
read via <function>sd_network_link_get_sip_servers()</function> function.</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><varname>UseMTU=</varname></term>
|
<term><varname>UseMTU=</varname></term>
|
||||||
<listitem>
|
<listitem>
|
||||||
|
@ -1903,6 +1904,15 @@
|
||||||
<varname>DNS=</varname>.</para></listitem>
|
<varname>DNS=</varname>.</para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>POP3Servers=</varname></term>
|
||||||
|
|
||||||
|
<listitem><para>Similar to the <varname>DNS=</varname> settings described above, these
|
||||||
|
settings configure whether and what POP3 server information shall be emitted as part of
|
||||||
|
the DHCP lease. The same syntax, propagation semantics and defaults apply as for
|
||||||
|
<varname>DNS=</varname>.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><varname>EmitRouter=</varname></term>
|
<term><varname>EmitRouter=</varname></term>
|
||||||
|
|
||||||
|
|
|
@ -44,8 +44,10 @@ static struct selabel_handle *label_hnd = NULL;
|
||||||
|
|
||||||
bool mac_selinux_use(void) {
|
bool mac_selinux_use(void) {
|
||||||
#if HAVE_SELINUX
|
#if HAVE_SELINUX
|
||||||
if (cached_use < 0)
|
if (_unlikely_(cached_use < 0)) {
|
||||||
cached_use = is_selinux_enabled() > 0;
|
cached_use = is_selinux_enabled() > 0;
|
||||||
|
log_debug("SELinux enabled state cached to: %s", cached_use ? "enabled" : "disabled");
|
||||||
|
}
|
||||||
|
|
||||||
return cached_use;
|
return cached_use;
|
||||||
#else
|
#else
|
||||||
|
@ -55,14 +57,15 @@ bool mac_selinux_use(void) {
|
||||||
|
|
||||||
bool mac_selinux_enforcing(void) {
|
bool mac_selinux_enforcing(void) {
|
||||||
#if HAVE_SELINUX
|
#if HAVE_SELINUX
|
||||||
if (cached_enforcing < 0) {
|
if (_unlikely_(cached_enforcing < 0)) {
|
||||||
cached_enforcing = security_getenforce();
|
cached_enforcing = security_getenforce();
|
||||||
if (cached_enforcing == -1) {
|
if (cached_enforcing == -1)
|
||||||
log_error_errno(errno, "Failed to get SELinux enforced status: %m");
|
log_error_errno(errno, "Failed to get SELinux enforced status, continue in enforcing mode: %m");
|
||||||
}
|
else
|
||||||
|
log_debug("SELinux enforcing state cached to: %s", cached_enforcing ? "enforcing" : "permissive");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* treat failure as enforced mode */
|
/* treat failure as enforcing mode */
|
||||||
return (cached_enforcing != 0);
|
return (cached_enforcing != 0);
|
||||||
#else
|
#else
|
||||||
return false;
|
return false;
|
||||||
|
@ -80,6 +83,8 @@ void mac_selinux_retest(void) {
|
||||||
static int setenforce_callback(int enforcing) {
|
static int setenforce_callback(int enforcing) {
|
||||||
cached_enforcing = enforcing;
|
cached_enforcing = enforcing;
|
||||||
|
|
||||||
|
log_debug("SELinux enforcing state updated to: %s", cached_enforcing ? "enforcing" : "permissive");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -272,8 +272,8 @@ int mac_selinux_generic_access_check(
|
||||||
sd_bus_error_setf(error, SD_BUS_ERROR_ACCESS_DENIED, "SELinux policy denies access.");
|
sd_bus_error_setf(error, SD_BUS_ERROR_ACCESS_DENIED, "SELinux policy denies access.");
|
||||||
}
|
}
|
||||||
|
|
||||||
log_debug_errno(r, "SELinux access check scon=%s tcon=%s tclass=%s perm=%s path=%s cmdline=%s: %m",
|
log_debug_errno(r, "SELinux access check scon=%s tcon=%s tclass=%s perm=%s state=%s path=%s cmdline=%s: %m",
|
||||||
scon, fcon, tclass, permission, path, cl);
|
scon, fcon, tclass, permission, enforce ? "enforcing" : "permissive", path, cl);
|
||||||
return enforce ? r : 0;
|
return enforce ? r : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2675,13 +2675,12 @@ _public_ int sd_journal_wait(sd_journal *j, uint64_t timeout_usec) {
|
||||||
Get rid of the deleted files now so they don't stay around indefinitely. */
|
Get rid of the deleted files now so they don't stay around indefinitely. */
|
||||||
ORDERED_HASHMAP_FOREACH(f, j->files, i) {
|
ORDERED_HASHMAP_FOREACH(f, j->files, i) {
|
||||||
r = journal_file_fstat(f);
|
r = journal_file_fstat(f);
|
||||||
if (r < 0) {
|
if (r == -EIDRM)
|
||||||
|
remove_file_real(j, f);
|
||||||
|
else if (r < 0) {
|
||||||
log_debug_errno(r,"Failed to fstat() journal file '%s' : %m", f->path);
|
log_debug_errno(r,"Failed to fstat() journal file '%s' : %m", f->path);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (f->last_stat.st_nlink <= 0)
|
|
||||||
remove_file_real(j, f);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The journal might have changed since the context
|
/* The journal might have changed since the context
|
||||||
|
|
|
@ -61,6 +61,9 @@ struct sd_dhcp_lease {
|
||||||
struct in_addr *sip;
|
struct in_addr *sip;
|
||||||
size_t sip_size;
|
size_t sip_size;
|
||||||
|
|
||||||
|
struct in_addr *pop3_server;
|
||||||
|
size_t pop3_server_size;
|
||||||
|
|
||||||
struct sd_dhcp_route *static_route;
|
struct sd_dhcp_route *static_route;
|
||||||
size_t static_route_size, static_route_allocated;
|
size_t static_route_size, static_route_allocated;
|
||||||
|
|
||||||
|
|
|
@ -55,8 +55,8 @@ struct sd_dhcp_server {
|
||||||
|
|
||||||
char *timezone;
|
char *timezone;
|
||||||
|
|
||||||
struct in_addr *ntp, *dns, *sip;
|
struct in_addr *ntp, *dns, *sip, *pop3_server;
|
||||||
unsigned n_ntp, n_dns, n_sip;
|
unsigned n_ntp, n_dns, n_sip, n_pop3_server;
|
||||||
|
|
||||||
OrderedHashmap *extra_options;
|
OrderedHashmap *extra_options;
|
||||||
OrderedHashmap *vendor_options;
|
OrderedHashmap *vendor_options;
|
||||||
|
|
|
@ -129,6 +129,17 @@ int sd_dhcp_lease_get_sip(sd_dhcp_lease *lease, const struct in_addr **addr) {
|
||||||
return (int) lease->sip_size;
|
return (int) lease->sip_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int sd_dhcp_lease_get_pop3_server(sd_dhcp_lease *lease, const struct in_addr **addr) {
|
||||||
|
assert_return(lease, -EINVAL);
|
||||||
|
assert_return(addr, -EINVAL);
|
||||||
|
|
||||||
|
if (lease->pop3_server_size <= 0)
|
||||||
|
return -ENODATA;
|
||||||
|
|
||||||
|
*addr = lease->pop3_server;
|
||||||
|
return (int) lease->pop3_server_size;
|
||||||
|
}
|
||||||
|
|
||||||
int sd_dhcp_lease_get_domainname(sd_dhcp_lease *lease, const char **domainname) {
|
int sd_dhcp_lease_get_domainname(sd_dhcp_lease *lease, const char **domainname) {
|
||||||
assert_return(lease, -EINVAL);
|
assert_return(lease, -EINVAL);
|
||||||
assert_return(domainname, -EINVAL);
|
assert_return(domainname, -EINVAL);
|
||||||
|
@ -279,6 +290,7 @@ static sd_dhcp_lease *dhcp_lease_free(sd_dhcp_lease *lease) {
|
||||||
free(lease->dns);
|
free(lease->dns);
|
||||||
free(lease->ntp);
|
free(lease->ntp);
|
||||||
free(lease->sip);
|
free(lease->sip);
|
||||||
|
free(lease->pop3_server);
|
||||||
free(lease->static_route);
|
free(lease->static_route);
|
||||||
free(lease->client_id);
|
free(lease->client_id);
|
||||||
free(lease->vendor_specific);
|
free(lease->vendor_specific);
|
||||||
|
@ -601,6 +613,12 @@ int dhcp_lease_parse_options(uint8_t code, uint8_t len, const void *option, void
|
||||||
log_debug_errno(r, "Failed to parse SIP server, ignoring: %m");
|
log_debug_errno(r, "Failed to parse SIP server, ignoring: %m");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case SD_DHCP_OPTION_POP3_SERVER:
|
||||||
|
r = lease_parse_in_addrs(option, len, &lease->pop3_server, &lease->pop3_server_size);
|
||||||
|
if (r < 0)
|
||||||
|
log_debug_errno(r, "Failed to parse POP3 server, ignoring: %m");
|
||||||
|
break;
|
||||||
|
|
||||||
case SD_DHCP_OPTION_STATIC_ROUTE:
|
case SD_DHCP_OPTION_STATIC_ROUTE:
|
||||||
r = lease_parse_routes(option, len, &lease->static_route, &lease->static_route_size, &lease->static_route_allocated);
|
r = lease_parse_routes(option, len, &lease->static_route, &lease->static_route_size, &lease->static_route_allocated);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
|
@ -1037,6 +1055,7 @@ int dhcp_lease_load(sd_dhcp_lease **ret, const char *lease_file) {
|
||||||
*dns = NULL,
|
*dns = NULL,
|
||||||
*ntp = NULL,
|
*ntp = NULL,
|
||||||
*sip = NULL,
|
*sip = NULL,
|
||||||
|
*pop3_server = NULL,
|
||||||
*mtu = NULL,
|
*mtu = NULL,
|
||||||
*routes = NULL,
|
*routes = NULL,
|
||||||
*domains = NULL,
|
*domains = NULL,
|
||||||
|
@ -1066,6 +1085,7 @@ int dhcp_lease_load(sd_dhcp_lease **ret, const char *lease_file) {
|
||||||
"DNS", &dns,
|
"DNS", &dns,
|
||||||
"NTP", &ntp,
|
"NTP", &ntp,
|
||||||
"SIP", &sip,
|
"SIP", &sip,
|
||||||
|
"POP3_SERVERS", &pop3_server,
|
||||||
"MTU", &mtu,
|
"MTU", &mtu,
|
||||||
"DOMAINNAME", &lease->domainname,
|
"DOMAINNAME", &lease->domainname,
|
||||||
"HOSTNAME", &lease->hostname,
|
"HOSTNAME", &lease->hostname,
|
||||||
|
@ -1178,6 +1198,14 @@ int dhcp_lease_load(sd_dhcp_lease **ret, const char *lease_file) {
|
||||||
lease->sip_size = r;
|
lease->sip_size = r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pop3_server) {
|
||||||
|
r = deserialize_in_addrs(&lease->pop3_server, pop3_server);
|
||||||
|
if (r < 0)
|
||||||
|
log_debug_errno(r, "Failed to deserialize POP3 server %s, ignoring: %m", pop3_server);
|
||||||
|
else
|
||||||
|
lease->pop3_server_size = r;
|
||||||
|
}
|
||||||
|
|
||||||
if (mtu) {
|
if (mtu) {
|
||||||
r = safe_atou16(mtu, &lease->mtu);
|
r = safe_atou16(mtu, &lease->mtu);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
|
|
|
@ -140,6 +140,7 @@ static sd_dhcp_server *dhcp_server_free(sd_dhcp_server *server) {
|
||||||
free(server->dns);
|
free(server->dns);
|
||||||
free(server->ntp);
|
free(server->ntp);
|
||||||
free(server->sip);
|
free(server->sip);
|
||||||
|
free(server->pop3_server);
|
||||||
|
|
||||||
hashmap_free(server->leases_by_client_id);
|
hashmap_free(server->leases_by_client_id);
|
||||||
|
|
||||||
|
@ -513,6 +514,15 @@ static int server_send_ack(sd_dhcp_server *server, DHCPRequest *req,
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (server->n_pop3_server > 0) {
|
||||||
|
r = dhcp_option_append(
|
||||||
|
&packet->dhcp, req->max_optlen, &offset, 0,
|
||||||
|
SD_DHCP_OPTION_POP3_SERVER,
|
||||||
|
sizeof(struct in_addr) * server->n_pop3_server, server->pop3_server);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
if (server->timezone) {
|
if (server->timezone) {
|
||||||
r = dhcp_option_append(
|
r = dhcp_option_append(
|
||||||
&packet->dhcp, req->max_optlen, &offset, 0,
|
&packet->dhcp, req->max_optlen, &offset, 0,
|
||||||
|
@ -1181,6 +1191,31 @@ int sd_dhcp_server_set_sip(sd_dhcp_server *server, const struct in_addr sip[], u
|
||||||
return 1;
|
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)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (n <= 0) {
|
||||||
|
server->pop3_server = mfree(server->pop3_server);
|
||||||
|
server->n_pop3_server = 0;
|
||||||
|
} else {
|
||||||
|
struct in_addr *c;
|
||||||
|
|
||||||
|
c = newdup(struct in_addr, pop3_server, n);
|
||||||
|
if (!c)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
free_and_replace(server->pop3_server, c);
|
||||||
|
server->n_pop3_server = n;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
int sd_dhcp_server_set_emit_router(sd_dhcp_server *server, int enabled) {
|
int sd_dhcp_server_set_emit_router(sd_dhcp_server *server, int enabled) {
|
||||||
assert_return(server, -EINVAL);
|
assert_return(server, -EINVAL);
|
||||||
|
|
||||||
|
|
|
@ -256,6 +256,10 @@ _public_ int sd_network_link_get_sip_servers(int ifindex, char ***ret) {
|
||||||
return network_link_get_strv(ifindex, "SIP", ret);
|
return network_link_get_strv(ifindex, "SIP", ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_public_ int sd_network_link_get_pop3_servers(int ifindex, char ***pop3) {
|
||||||
|
return network_link_get_strv(ifindex, "POP3_SERVERS", pop3);
|
||||||
|
}
|
||||||
|
|
||||||
_public_ int sd_network_link_get_dns_default_route(int ifindex) {
|
_public_ int sd_network_link_get_dns_default_route(int ifindex) {
|
||||||
char path[STRLEN("/run/systemd/netif/links/") + DECIMAL_STR_MAX(ifindex) + 1];
|
char path[STRLEN("/run/systemd/netif/links/") + DECIMAL_STR_MAX(ifindex) + 1];
|
||||||
_cleanup_free_ char *s = NULL;
|
_cleanup_free_ char *s = NULL;
|
||||||
|
|
|
@ -1240,7 +1240,8 @@ static int link_status_one(
|
||||||
sd_hwdb *hwdb,
|
sd_hwdb *hwdb,
|
||||||
const LinkInfo *info) {
|
const LinkInfo *info) {
|
||||||
|
|
||||||
_cleanup_strv_free_ char **dns = NULL, **ntp = NULL, **sip = NULL, **search_domains = NULL, **route_domains = NULL;
|
_cleanup_strv_free_ char **dns = NULL, **ntp = NULL, **sip = NULL, **search_domains = NULL, **route_domains = NULL,
|
||||||
|
**pop3_server = NULL;
|
||||||
_cleanup_free_ char *setup_state = NULL, *operational_state = NULL, *tz = NULL;
|
_cleanup_free_ char *setup_state = NULL, *operational_state = NULL, *tz = NULL;
|
||||||
_cleanup_free_ char *t = NULL, *network = NULL;
|
_cleanup_free_ char *t = NULL, *network = NULL;
|
||||||
const char *driver = NULL, *path = NULL, *vendor = NULL, *model = NULL, *link = NULL;
|
const char *driver = NULL, *path = NULL, *vendor = NULL, *model = NULL, *link = NULL;
|
||||||
|
@ -1267,6 +1268,7 @@ static int link_status_one(
|
||||||
(void) sd_network_link_get_route_domains(info->ifindex, &route_domains);
|
(void) sd_network_link_get_route_domains(info->ifindex, &route_domains);
|
||||||
(void) sd_network_link_get_ntp(info->ifindex, &ntp);
|
(void) sd_network_link_get_ntp(info->ifindex, &ntp);
|
||||||
(void) sd_network_link_get_sip(info->ifindex, &sip);
|
(void) sd_network_link_get_sip(info->ifindex, &sip);
|
||||||
|
(void) sd_network_link_get_pop3_servers(info->ifindex, &pop3_server);
|
||||||
|
|
||||||
if (info->sd_device) {
|
if (info->sd_device) {
|
||||||
(void) sd_device_get_property_value(info->sd_device, "ID_NET_LINK_FILE", &link);
|
(void) sd_device_get_property_value(info->sd_device, "ID_NET_LINK_FILE", &link);
|
||||||
|
@ -1827,6 +1829,9 @@ static int link_status_one(
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
r = dump_list(table, "SIP:", sip);
|
r = dump_list(table, "SIP:", sip);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
r = dump_list(table, "POP3 servers:", pop3_server);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
r = dump_ifindexes(table, "Carrier Bound To:", carrier_bound_to);
|
r = dump_ifindexes(table, "Carrier Bound To:", carrier_bound_to);
|
||||||
|
|
|
@ -140,6 +140,55 @@ static int link_push_uplink_ntp_to_dhcp_server(Link *link, sd_dhcp_server *s) {
|
||||||
return sd_dhcp_server_set_ntp(s, addresses, n_addresses);
|
return sd_dhcp_server_set_ntp(s, addresses, n_addresses);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int link_push_uplink_pop3_to_dhcp_server(Link *link, sd_dhcp_server *s) {
|
||||||
|
_cleanup_free_ struct in_addr *addresses = NULL;
|
||||||
|
size_t n_addresses = 0, n_allocated = 0;
|
||||||
|
char **a;
|
||||||
|
|
||||||
|
if (!link->network)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
log_link_debug(link, "Copying POP3 server information from link");
|
||||||
|
|
||||||
|
STRV_FOREACH(a, link->network->pop3) {
|
||||||
|
union in_addr_union ia;
|
||||||
|
|
||||||
|
/* Only look for IPv4 addresses */
|
||||||
|
if (in_addr_from_string(AF_INET, *a, &ia) <= 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* Never propagate obviously borked data */
|
||||||
|
if (in4_addr_is_null(&ia.in) || in4_addr_is_localhost(&ia.in))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!GREEDY_REALLOC(addresses, n_allocated, n_addresses + 1))
|
||||||
|
return log_oom();
|
||||||
|
|
||||||
|
addresses[n_addresses++] = ia.in;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (link->dhcp_lease) {
|
||||||
|
const struct in_addr *da = NULL;
|
||||||
|
int j, n;
|
||||||
|
|
||||||
|
n = sd_dhcp_lease_get_pop3_server(link->dhcp_lease, &da);
|
||||||
|
if (n > 0) {
|
||||||
|
|
||||||
|
if (!GREEDY_REALLOC(addresses, n_allocated, n_addresses + n))
|
||||||
|
return log_oom();
|
||||||
|
|
||||||
|
for (j = 0; j < n; j++)
|
||||||
|
if (in4_addr_is_non_local(&da[j]))
|
||||||
|
addresses[n_addresses++] = da[j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n_addresses <= 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return sd_dhcp_server_set_pop3_server(s, addresses, n_addresses);
|
||||||
|
}
|
||||||
|
|
||||||
static int link_push_uplink_sip_to_dhcp_server(Link *link, sd_dhcp_server *s) {
|
static int link_push_uplink_sip_to_dhcp_server(Link *link, sd_dhcp_server *s) {
|
||||||
_cleanup_free_ struct in_addr *addresses = NULL;
|
_cleanup_free_ struct in_addr *addresses = NULL;
|
||||||
size_t n_addresses = 0, n_allocated = 0;
|
size_t n_addresses = 0, n_allocated = 0;
|
||||||
|
@ -281,6 +330,22 @@ int dhcp4_server_configure(Link *link) {
|
||||||
log_link_warning_errno(link, r, "Failed to set SIP server for DHCP server, ignoring: %m");
|
log_link_warning_errno(link, r, "Failed to set SIP server for DHCP server, ignoring: %m");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (link->network->n_dhcp_server_pop3 > 0)
|
||||||
|
r = sd_dhcp_server_set_pop3_server(link->dhcp_server, link->network->dhcp_server_pop3, link->network->n_dhcp_server_pop3);
|
||||||
|
else {
|
||||||
|
if (!acquired_uplink)
|
||||||
|
uplink = manager_find_uplink(link->manager, link);
|
||||||
|
|
||||||
|
if (!uplink) {
|
||||||
|
log_link_debug(link, "Not emitting POP3 server information on link, couldn't find suitable uplink.");
|
||||||
|
r = 0;
|
||||||
|
} else
|
||||||
|
r = link_push_uplink_pop3_to_dhcp_server(uplink, link->dhcp_server);
|
||||||
|
|
||||||
|
}
|
||||||
|
if (r < 0)
|
||||||
|
log_link_warning_errno(link, r, "Failed to set POP3 server for DHCP server, ignoring: %m");
|
||||||
|
|
||||||
r = sd_dhcp_server_set_emit_router(link->dhcp_server, link->network->dhcp_server_emit_router);
|
r = sd_dhcp_server_set_emit_router(link->dhcp_server, link->network->dhcp_server_emit_router);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return log_link_error_errno(link, r, "Failed to set router emission for DHCP server: %m");
|
return log_link_error_errno(link, r, "Failed to set router emission for DHCP server: %m");
|
||||||
|
@ -486,3 +551,55 @@ int config_parse_dhcp_server_sip(
|
||||||
n->dhcp_server_sip = m;
|
n->dhcp_server_sip = m;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int config_parse_dhcp_server_pop3_servers(
|
||||||
|
const char *unit,
|
||||||
|
const char *filename,
|
||||||
|
unsigned line,
|
||||||
|
const char *section,
|
||||||
|
unsigned section_line,
|
||||||
|
const char *lvalue,
|
||||||
|
int ltype,
|
||||||
|
const char *rvalue,
|
||||||
|
void *data,
|
||||||
|
void *userdata) {
|
||||||
|
|
||||||
|
Network *n = data;
|
||||||
|
const char *p = rvalue;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
assert(filename);
|
||||||
|
assert(lvalue);
|
||||||
|
assert(rvalue);
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
_cleanup_free_ char *w = NULL;
|
||||||
|
union in_addr_union a;
|
||||||
|
struct in_addr *m;
|
||||||
|
|
||||||
|
r = extract_first_word(&p, &w, NULL, 0);
|
||||||
|
if (r == -ENOMEM)
|
||||||
|
return log_oom();
|
||||||
|
if (r < 0) {
|
||||||
|
log_syntax(unit, LOG_ERR, filename, line, r,
|
||||||
|
"Failed to extract word, ignoring: %s", rvalue);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (r == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
r = in_addr_from_string(AF_INET, w, &a);
|
||||||
|
if (r < 0) {
|
||||||
|
log_syntax(unit, LOG_ERR, filename, line, r,
|
||||||
|
"Failed to parse POP3 server address '%s', ignoring: %m", w);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
m = reallocarray(n->dhcp_server_pop3, n->n_dhcp_server_pop3 + 1, sizeof(struct in_addr));
|
||||||
|
if (!m)
|
||||||
|
return log_oom();
|
||||||
|
|
||||||
|
m[n->n_dhcp_server_pop3++] = a.in;
|
||||||
|
n->dhcp_server_pop3 = m;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -12,3 +12,4 @@ int dhcp4_server_configure(Link *link);
|
||||||
CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_server_dns);
|
CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_server_dns);
|
||||||
CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_server_ntp);
|
CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_server_ntp);
|
||||||
CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_server_sip);
|
CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_server_sip);
|
||||||
|
CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_server_pop3_servers);
|
||||||
|
|
|
@ -4100,6 +4100,21 @@ int link_save(Link *link) {
|
||||||
space = true;
|
space = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fputc('\n', f);
|
||||||
|
|
||||||
|
fputs("POP3_SERVERS=", f);
|
||||||
|
space = false;
|
||||||
|
fputstrv(f, link->network->pop3, NULL, &space);
|
||||||
|
|
||||||
|
if (link->dhcp_lease) {
|
||||||
|
const struct in_addr *addresses;
|
||||||
|
|
||||||
|
r = sd_dhcp_lease_get_pop3_server(link->dhcp_lease, &addresses);
|
||||||
|
if (r > 0)
|
||||||
|
if (serialize_in_addrs(f, addresses, r, space, in4_addr_is_non_local) > 0)
|
||||||
|
space = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (link->network->dhcp6_use_ntp && dhcp6_lease) {
|
if (link->network->dhcp6_use_ntp && dhcp6_lease) {
|
||||||
struct in6_addr *in6_addrs;
|
struct in6_addr *in6_addrs;
|
||||||
char **hosts;
|
char **hosts;
|
||||||
|
|
|
@ -1488,7 +1488,8 @@ static int ordered_set_put_in4_addrv(OrderedSet *s,
|
||||||
}
|
}
|
||||||
|
|
||||||
static int manager_save(Manager *m) {
|
static int manager_save(Manager *m) {
|
||||||
_cleanup_ordered_set_free_free_ OrderedSet *dns = NULL, *ntp = NULL, *sip = NULL, *search_domains = NULL, *route_domains = NULL;
|
_cleanup_ordered_set_free_free_ OrderedSet *dns = NULL, *ntp = NULL, *sip = NULL, *pop3 = NULL,
|
||||||
|
*search_domains = NULL, *route_domains = NULL;
|
||||||
const char *operstate_str, *carrier_state_str, *address_state_str;
|
const char *operstate_str, *carrier_state_str, *address_state_str;
|
||||||
LinkOperationalState operstate = LINK_OPERSTATE_OFF;
|
LinkOperationalState operstate = LINK_OPERSTATE_OFF;
|
||||||
LinkCarrierState carrier_state = LINK_CARRIER_STATE_OFF;
|
LinkCarrierState carrier_state = LINK_CARRIER_STATE_OFF;
|
||||||
|
@ -1496,6 +1497,7 @@ static int manager_save(Manager *m) {
|
||||||
_cleanup_free_ char *temp_path = NULL;
|
_cleanup_free_ char *temp_path = NULL;
|
||||||
_cleanup_strv_free_ char **p = NULL;
|
_cleanup_strv_free_ char **p = NULL;
|
||||||
_cleanup_fclose_ FILE *f = NULL;
|
_cleanup_fclose_ FILE *f = NULL;
|
||||||
|
const struct in_addr *addresses;
|
||||||
Link *link;
|
Link *link;
|
||||||
Iterator i;
|
Iterator i;
|
||||||
int r;
|
int r;
|
||||||
|
@ -1512,10 +1514,14 @@ static int manager_save(Manager *m) {
|
||||||
if (!ntp)
|
if (!ntp)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
sip = ordered_set_new(&string_hash_ops);
|
sip = ordered_set_new(&string_hash_ops);
|
||||||
if (!sip)
|
if (!sip)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
pop3 = ordered_set_new(&string_hash_ops);
|
||||||
|
if (!pop3)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
search_domains = ordered_set_new(&dns_name_hash_ops);
|
search_domains = ordered_set_new(&dns_name_hash_ops);
|
||||||
if (!search_domains)
|
if (!search_domains)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
@ -1562,8 +1568,6 @@ static int manager_save(Manager *m) {
|
||||||
|
|
||||||
/* Secondly, add the entries acquired via DHCP */
|
/* Secondly, add the entries acquired via DHCP */
|
||||||
if (link->network->dhcp_use_dns) {
|
if (link->network->dhcp_use_dns) {
|
||||||
const struct in_addr *addresses;
|
|
||||||
|
|
||||||
r = sd_dhcp_lease_get_dns(link->dhcp_lease, &addresses);
|
r = sd_dhcp_lease_get_dns(link->dhcp_lease, &addresses);
|
||||||
if (r > 0) {
|
if (r > 0) {
|
||||||
r = ordered_set_put_in4_addrv(dns, addresses, r, in4_addr_is_non_local);
|
r = ordered_set_put_in4_addrv(dns, addresses, r, in4_addr_is_non_local);
|
||||||
|
@ -1574,8 +1578,6 @@ static int manager_save(Manager *m) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (link->network->dhcp_use_ntp) {
|
if (link->network->dhcp_use_ntp) {
|
||||||
const struct in_addr *addresses;
|
|
||||||
|
|
||||||
r = sd_dhcp_lease_get_ntp(link->dhcp_lease, &addresses);
|
r = sd_dhcp_lease_get_ntp(link->dhcp_lease, &addresses);
|
||||||
if (r > 0) {
|
if (r > 0) {
|
||||||
r = ordered_set_put_in4_addrv(ntp, addresses, r, in4_addr_is_non_local);
|
r = ordered_set_put_in4_addrv(ntp, addresses, r, in4_addr_is_non_local);
|
||||||
|
@ -1586,8 +1588,6 @@ static int manager_save(Manager *m) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (link->network->dhcp_use_sip) {
|
if (link->network->dhcp_use_sip) {
|
||||||
const struct in_addr *addresses;
|
|
||||||
|
|
||||||
r = sd_dhcp_lease_get_sip(link->dhcp_lease, &addresses);
|
r = sd_dhcp_lease_get_sip(link->dhcp_lease, &addresses);
|
||||||
if (r > 0) {
|
if (r > 0) {
|
||||||
r = ordered_set_put_in4_addrv(sip, addresses, r, in4_addr_is_non_local);
|
r = ordered_set_put_in4_addrv(sip, addresses, r, in4_addr_is_non_local);
|
||||||
|
@ -1597,6 +1597,15 @@ static int manager_save(Manager *m) {
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
r = sd_dhcp_lease_get_pop3_server(link->dhcp_lease, &addresses);
|
||||||
|
if (r > 0) {
|
||||||
|
r = ordered_set_put_in4_addrv(pop3, addresses, r, in4_addr_is_non_local);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
} else if (r < 0 && r != -ENODATA)
|
||||||
|
return r;
|
||||||
|
|
||||||
if (link->network->dhcp_use_domains != DHCP_USE_DOMAINS_NO) {
|
if (link->network->dhcp_use_domains != DHCP_USE_DOMAINS_NO) {
|
||||||
const char *domainname;
|
const char *domainname;
|
||||||
char **domains = NULL;
|
char **domains = NULL;
|
||||||
|
@ -1648,6 +1657,7 @@ static int manager_save(Manager *m) {
|
||||||
ordered_set_print(f, "DNS=", dns);
|
ordered_set_print(f, "DNS=", dns);
|
||||||
ordered_set_print(f, "NTP=", ntp);
|
ordered_set_print(f, "NTP=", ntp);
|
||||||
ordered_set_print(f, "SIP=", sip);
|
ordered_set_print(f, "SIP=", sip);
|
||||||
|
ordered_set_print(f, "POP3_SERVERS=", pop3);
|
||||||
ordered_set_print(f, "DOMAINS=", search_domains);
|
ordered_set_print(f, "DOMAINS=", search_domains);
|
||||||
ordered_set_print(f, "ROUTE_DOMAINS=", route_domains);
|
ordered_set_print(f, "ROUTE_DOMAINS=", route_domains);
|
||||||
|
|
||||||
|
|
|
@ -207,6 +207,7 @@ DHCPServer.EmitNTP, config_parse_bool,
|
||||||
DHCPServer.NTP, config_parse_dhcp_server_ntp, 0, 0
|
DHCPServer.NTP, config_parse_dhcp_server_ntp, 0, 0
|
||||||
DHCPServer.EmitSIP, config_parse_bool, 0, offsetof(Network, dhcp_server_emit_sip)
|
DHCPServer.EmitSIP, config_parse_bool, 0, offsetof(Network, dhcp_server_emit_sip)
|
||||||
DHCPServer.SIP, config_parse_dhcp_server_sip, 0, 0
|
DHCPServer.SIP, config_parse_dhcp_server_sip, 0, 0
|
||||||
|
DHCPServer.POP3Servers, config_parse_dhcp_server_pop3_servers, 0, 0
|
||||||
DHCPServer.EmitRouter, config_parse_bool, 0, offsetof(Network, dhcp_server_emit_router)
|
DHCPServer.EmitRouter, config_parse_bool, 0, offsetof(Network, dhcp_server_emit_router)
|
||||||
DHCPServer.EmitTimezone, config_parse_bool, 0, offsetof(Network, dhcp_server_emit_timezone)
|
DHCPServer.EmitTimezone, config_parse_bool, 0, offsetof(Network, dhcp_server_emit_timezone)
|
||||||
DHCPServer.Timezone, config_parse_timezone, 0, offsetof(Network, dhcp_server_timezone)
|
DHCPServer.Timezone, config_parse_timezone, 0, offsetof(Network, dhcp_server_timezone)
|
||||||
|
|
|
@ -147,6 +147,9 @@ struct Network {
|
||||||
struct in_addr *dhcp_server_sip;
|
struct in_addr *dhcp_server_sip;
|
||||||
unsigned n_dhcp_server_sip;
|
unsigned n_dhcp_server_sip;
|
||||||
|
|
||||||
|
struct in_addr *dhcp_server_pop3;
|
||||||
|
unsigned n_dhcp_server_pop3;
|
||||||
|
|
||||||
bool dhcp_server_emit_router;
|
bool dhcp_server_emit_router;
|
||||||
bool dhcp_server_emit_timezone;
|
bool dhcp_server_emit_timezone;
|
||||||
char *dhcp_server_timezone;
|
char *dhcp_server_timezone;
|
||||||
|
@ -296,6 +299,7 @@ struct Network {
|
||||||
|
|
||||||
char **ntp;
|
char **ntp;
|
||||||
char **sip;
|
char **sip;
|
||||||
|
char **pop3;
|
||||||
char **bind_carrier;
|
char **bind_carrier;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -83,6 +83,7 @@ enum {
|
||||||
SD_DHCP_OPTION_REBINDING_T2_TIME = 59,
|
SD_DHCP_OPTION_REBINDING_T2_TIME = 59,
|
||||||
SD_DHCP_OPTION_VENDOR_CLASS_IDENTIFIER = 60,
|
SD_DHCP_OPTION_VENDOR_CLASS_IDENTIFIER = 60,
|
||||||
SD_DHCP_OPTION_CLIENT_IDENTIFIER = 61,
|
SD_DHCP_OPTION_CLIENT_IDENTIFIER = 61,
|
||||||
|
SD_DHCP_OPTION_POP3_SERVER = 70,
|
||||||
SD_DHCP_OPTION_USER_CLASS = 77,
|
SD_DHCP_OPTION_USER_CLASS = 77,
|
||||||
SD_DHCP_OPTION_FQDN = 81,
|
SD_DHCP_OPTION_FQDN = 81,
|
||||||
SD_DHCP_OPTION_NEW_POSIX_TIMEZONE = 100,
|
SD_DHCP_OPTION_NEW_POSIX_TIMEZONE = 100,
|
||||||
|
|
|
@ -45,6 +45,7 @@ int sd_dhcp_lease_get_server_identifier(sd_dhcp_lease *lease, struct in_addr *ad
|
||||||
int sd_dhcp_lease_get_dns(sd_dhcp_lease *lease, const struct in_addr **addr);
|
int sd_dhcp_lease_get_dns(sd_dhcp_lease *lease, const struct in_addr **addr);
|
||||||
int sd_dhcp_lease_get_ntp(sd_dhcp_lease *lease, const struct in_addr **addr);
|
int sd_dhcp_lease_get_ntp(sd_dhcp_lease *lease, const struct in_addr **addr);
|
||||||
int sd_dhcp_lease_get_sip(sd_dhcp_lease *lease, const struct in_addr **addr);
|
int sd_dhcp_lease_get_sip(sd_dhcp_lease *lease, const struct in_addr **addr);
|
||||||
|
int sd_dhcp_lease_get_pop3_server(sd_dhcp_lease *lease, const struct in_addr **addr);
|
||||||
int sd_dhcp_lease_get_mtu(sd_dhcp_lease *lease, uint16_t *mtu);
|
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_domainname(sd_dhcp_lease *lease, const char **domainname);
|
||||||
int sd_dhcp_lease_get_search_domains(sd_dhcp_lease *lease, char ***domains);
|
int sd_dhcp_lease_get_search_domains(sd_dhcp_lease *lease, char ***domains);
|
||||||
|
|
|
@ -50,6 +50,7 @@ int sd_dhcp_server_set_timezone(sd_dhcp_server *server, const char *timezone);
|
||||||
int sd_dhcp_server_set_dns(sd_dhcp_server *server, const struct in_addr dns[], unsigned n);
|
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_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_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_emit_router(sd_dhcp_server *server, int enabled);
|
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_option(sd_dhcp_server *server, sd_dhcp_option *v);
|
||||||
|
|
|
@ -167,6 +167,9 @@ int sd_network_link_get_route_domains(int ifindex, char ***domains);
|
||||||
/* Get the sip servers for a given link. */
|
/* Get the sip servers for a given link. */
|
||||||
int sd_network_link_get_sip_servers(int ifindex, char ***sip);
|
int sd_network_link_get_sip_servers(int ifindex, char ***sip);
|
||||||
|
|
||||||
|
/* Get the pop3 servers for a given link. */
|
||||||
|
int sd_network_link_get_pop3_servers(int ifindex, char ***pop3);
|
||||||
|
|
||||||
/* Get whether this link shall be used as 'default route' for DNS queries */
|
/* Get whether this link shall be used as 'default route' for DNS queries */
|
||||||
int sd_network_link_get_dns_default_route(int ifindex);
|
int sd_network_link_get_dns_default_route(int ifindex);
|
||||||
|
|
||||||
|
|
|
@ -268,6 +268,7 @@ EmitDNS=
|
||||||
NTP=
|
NTP=
|
||||||
EmitSIP=
|
EmitSIP=
|
||||||
SIP=
|
SIP=
|
||||||
|
POP3Servers=
|
||||||
EmitRouter=
|
EmitRouter=
|
||||||
MaxLeaseTimeSec=
|
MaxLeaseTimeSec=
|
||||||
DefaultLeaseTimeSec=
|
DefaultLeaseTimeSec=
|
||||||
|
|
Loading…
Reference in New Issue