]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: Add support send and receive LPR servers
authorSusant Sahani <ssahani@vmware.com>
Wed, 22 Apr 2020 12:49:27 +0000 (14:49 +0200)
committerSusant Sahani <ssahani@vmware.com>
Wed, 22 Apr 2020 12:49:27 +0000 (14:49 +0200)
man/systemd.network.xml
src/network/networkd-dhcp-server.c
src/network/networkd-dhcp-server.h
src/network/networkd-link.c
src/network/networkd-manager.c
src/network/networkd-network-gperf.gperf
src/network/networkd-network.h
src/network/networkd-util.c
test/fuzz/fuzz-network-parser/directives.network

index 75a581816d3877c4336376dc095df04f879a98b4..9dc9a4673d3faef56b29c3fd0a4e686b48fb2892 100644 (file)
         <varname>DNS=</varname>.</para></listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><varname>LPRServers=</varname></term>
+
+        <listitem><para>Similar to the <varname>DNS=</varname> setting described above, this
+        setting configures whether and what LPR (line printer) 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>
         <term><varname>EmitRouter=</varname></term>
 
index ce2244a8fec1469f6b5b2b529baa12c0c98d7a65..be723ddbbc6df6ae5f4dfed9f76f9cd7b5d08afb 100644 (file)
@@ -127,6 +127,11 @@ static int link_push_uplink_to_dhcp_server(
                 lease_condition = link->network->dhcp_use_sip;
                 break;
 
+        case SD_DHCP_LEASE_LPR_SERVERS:
+                servers = link->network->lpr;
+                lease_condition = true;
+                break;
+
         default:
                 assert_not_reached("Uknown DHCP lease info item");
         }
@@ -238,6 +243,11 @@ int dhcp4_server_configure(Link *link) {
                         link->network->dhcp_server_smtp,
                         link->network->n_dhcp_server_smtp,
                 },
+                [SD_DHCP_LEASE_LPR_SERVERS] = {
+                        true,
+                        link->network->dhcp_server_lpr,
+                        link->network->n_dhcp_server_lpr,
+                },
         };
         assert_cc(ELEMENTSOF(configs) == _SD_DHCP_LEASE_INFO_MAX);
 
@@ -454,3 +464,23 @@ int config_parse_dhcp_server_smtp_servers(
                                                    &n->dhcp_server_smtp, &n->n_dhcp_server_smtp);
 
 }
+
+int config_parse_dhcp_server_lpr_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;
+
+        return config_parse_dhcp_lease_server_list(unit, filename, line,
+                                                   lvalue, rvalue,
+                                                   &n->dhcp_server_lpr, &n->n_dhcp_server_lpr);
+
+}
index 9da475dd3f4e1fdbc8ec3da4c20d8e57976bd1bd..898e9acd524b68b8954ba70edc5685af7770ad63 100644 (file)
@@ -14,3 +14,4 @@ CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_server_ntp);
 CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_server_sip);
 CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_server_pop3_servers);
 CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_server_smtp_servers);
+CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_server_lpr_servers);
index 7672b33128cc4b7f3050f3c8844ba202024a1c1f..e261473f6f2f2150093cbc119d758abca3109732 100644 (file)
@@ -3951,9 +3951,9 @@ static void link_save_dns(FILE *f, struct in_addr_data *dns, unsigned n_dns, boo
 }
 
 int link_save(Link *link) {
+        const char *admin_state, *oper_state, *carrier_state, *address_state;
         _cleanup_free_ char *temp_path = NULL;
         _cleanup_fclose_ FILE *f = NULL;
-        const char *admin_state, *oper_state, *carrier_state, *address_state;
         Address *a;
         Route *route;
         Iterator i;
@@ -4112,6 +4112,12 @@ int link_save(Link *link) {
                 space = false;
                 fputstrv(f, link->network->smtp, NULL, &space);
 
+                fputc('\n', f);
+
+                fputs("LPR_SERVERS=", f);
+                space = false;
+                fputstrv(f, link->network->lpr, NULL, &space);
+
                 if (link->dhcp_lease) {
                         const struct in_addr *addresses;
 
@@ -4130,6 +4136,15 @@ int link_save(Link *link) {
                                         space = true;
                 }
 
+                if (link->dhcp_lease) {
+                        const struct in_addr *addresses;
+
+                        r = sd_dhcp_lease_get_lpr_servers(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) {
                         struct in6_addr *in6_addrs;
                         char **hosts;
index 1348fcb9b3e2b9bd130c7f2b40f95bcf61448199..2161f70ae11623336b2dbc9fe41c45ef07b0e794 100644 (file)
@@ -1490,7 +1490,7 @@ static int ordered_set_put_in4_addrv(OrderedSet *s,
 
 static int manager_save(Manager *m) {
         _cleanup_ordered_set_free_free_ OrderedSet *dns = NULL, *ntp = NULL, *sip = NULL, *pop3 = NULL,
-                *smtp = NULL, *search_domains = NULL, *route_domains = NULL;
+                *smtp = NULL, *lpr = NULL, *search_domains = NULL, *route_domains = NULL;
         const char *operstate_str, *carrier_state_str, *address_state_str;
         LinkOperationalState operstate = LINK_OPERSTATE_OFF;
         LinkCarrierState carrier_state = LINK_CARRIER_STATE_OFF;
@@ -1524,8 +1524,12 @@ static int manager_save(Manager *m) {
                 return -ENOMEM;
 
         smtp = ordered_set_new(&string_hash_ops);
-       if (!smtp)
-               return -ENOMEM;
+        if (!smtp)
+                return -ENOMEM;
+
+        lpr = ordered_set_new(&string_hash_ops);
+        if (!lpr)
+                return -ENOMEM;
 
         search_domains = ordered_set_new(&dns_name_hash_ops);
         if (!search_domains)
@@ -1618,6 +1622,14 @@ static int manager_save(Manager *m) {
                 } else if (r < 0 && r != -ENODATA)
                         return r;
 
+                r = sd_dhcp_lease_get_lpr_servers(link->dhcp_lease, &addresses);
+                if (r > 0) {
+                        r = ordered_set_put_in4_addrv(lpr, 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) {
                         const char *domainname;
                         char **domains = NULL;
@@ -1671,6 +1683,7 @@ static int manager_save(Manager *m) {
         ordered_set_print(f, "SIP=", sip);
         ordered_set_print(f, "POP3_SERVERS=", pop3);
         ordered_set_print(f, "SMTP_SERVERS=", smtp);
+        ordered_set_print(f, "LPR_SERVERS=", lpr);
         ordered_set_print(f, "DOMAINS=", search_domains);
         ordered_set_print(f, "ROUTE_DOMAINS=", route_domains);
 
index 9597176b1c678fe710f41c12af8ea3092d533dcb..c246dc5cc130a81db27ddfe911f8725d7c476ee4 100644 (file)
@@ -212,6 +212,7 @@ DHCPServer.EmitSIP,                          config_parse_bool,
 DHCPServer.SIP,                              config_parse_dhcp_server_sip,                             0,                             0
 DHCPServer.POP3Servers,                      config_parse_dhcp_server_pop3_servers,                    0,                             0
 DHCPServer.SMTPServers,                      config_parse_dhcp_server_smtp_servers,                    0,                             0
+DHCPServer.LPRServers,                       config_parse_dhcp_server_lpr_servers,                     0,                             0
 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.Timezone,                         config_parse_timezone,                                    0,                             offsetof(Network, dhcp_server_timezone)
index 240f6689dd2ba4532cf56aaf07ac883cb96bb4c4..a99f67931820215442b22b2858939c93c3802a25 100644 (file)
@@ -155,6 +155,9 @@ struct Network {
         struct in_addr *dhcp_server_smtp;
         unsigned n_dhcp_server_smtp;
 
+        struct in_addr *dhcp_server_lpr;
+        unsigned n_dhcp_server_lpr;
+
         bool dhcp_server_emit_router;
         bool dhcp_server_emit_timezone;
         char *dhcp_server_timezone;
@@ -312,6 +315,7 @@ struct Network {
         char **sip;
         char **pop3;
         char **smtp;
+        char **lpr;
         char **bind_carrier;
 };
 
index 3d1d3bd68456454d39ee0423dd29a641d5e7f075..5471e74592338c5cdc63791fbd90ae71090a080e 100644 (file)
@@ -43,6 +43,7 @@ static const char* const dhcp_lease_info_table[_SD_DHCP_LEASE_INFO_MAX] = {
         [SD_DHCP_LEASE_SIP_SERVERS]  = "SIP servers",
         [SD_DHCP_LEASE_POP3_SERVERS] = "POP3 servers",
         [SD_DHCP_LEASE_SMTP_SERVERS] = "SMTP servers",
+        [SD_DHCP_LEASE_LPR_SERVERS]  = "LPR servers",
 };
 
 DEFINE_STRING_TABLE_LOOKUP_WITH_BOOLEAN(address_family, AddressFamily, ADDRESS_FAMILY_YES);
index 147ea1b63945b76d1e7f728bbb1ffe7cff6799ef..1cd18202f40b4237fa565e7b640c45b7f893cbef 100644 (file)
@@ -278,6 +278,7 @@ EmitSIP=
 SIP=
 POP3Servers=
 SMTPServers=
+LPRServers=
 EmitRouter=
 MaxLeaseTimeSec=
 DefaultLeaseTimeSec=