]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: amend SendOption= to take a c-escaped string 13874/head
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 30 Oct 2019 08:13:38 +0000 (09:13 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 30 Oct 2019 08:13:38 +0000 (09:13 +0100)
No need to punish users by forcing them to do base64 encodings.

man/systemd.network.xml
src/network/networkd-dhcp4.c

index 3ef6ff592cd7b44cf2fd860e6e205c96f7c312d1..538f4b8e7b37624ac792b08a9521820b05226a81 100644 (file)
         <varlistentry>
           <term><varname>SendOption=</varname></term>
           <listitem>
-            <para>Send a raw option with value via DHCPv4 client. Takes a DHCP option and base64 encoded
-            data separated with a colon (option:value). The option ranges [1-254]. This option can be
-            specified multiple times. If an empty string is specified, then all options specified earlier
-            are cleared. Defaults to unset.</para>
+            <para>Send an arbitrary option in the DHCPv4 request. Takes a DHCP option number and an arbitrary
+            data string separated with a colon
+            (<literal><replaceable>option</replaceable>:<replaceable>value</replaceable></literal>). The
+            option number must be an interger in the range 1..254. Special characters in the data string may
+            be escaped using
+            <ulink url="https://en.wikipedia.org/wiki/Escape_sequences_in_C#Table_of_escape_sequences">C-style
+            escapes</ulink>.  This option can be specified multiple times. If an empty string is specified,
+            then all options specified earlier are cleared. Defaults to unset.</para>
           </listitem>
         </varlistentry>
        </variablelist>
index 45091de97d112c4f6b9337648886d40a93b5c590..947853e2c4bf8dc20e30e6bdaa10343d1d55144e 100644 (file)
@@ -6,7 +6,7 @@
 
 #include "alloc-util.h"
 #include "dhcp-client-internal.h"
-#include "hexdecoct.h"
+#include "escape.h"
 #include "hostname-util.h"
 #include "parse-util.h"
 #include "network-internal.h"
@@ -1579,12 +1579,11 @@ int config_parse_dhcp_send_option(
                 void *userdata) {
 
         _cleanup_(sd_dhcp_option_unrefp) sd_dhcp_option *opt = NULL, *old = NULL;
-        _cleanup_free_ char *word = NULL;
-        _cleanup_free_ void *q = NULL;
+        _cleanup_free_ char *word = NULL, *q = NULL;
         Network *network = data;
         const char *p;
         uint8_t u;
-        size_t sz;
+        ssize_t sz;
         int r;
 
         assert(filename);
@@ -1619,10 +1618,10 @@ int config_parse_dhcp_send_option(
                 return 0;
         }
 
-        r = unbase64mem(p, (size_t) -1, &q, &sz);
-        if (r < 0) {
-                log_syntax(unit, LOG_ERR, filename, line, r,
-                           "Failed to decode base64 data, ignoring assignment: %s", p);
+        sz = cunescape(p, 0, &q);
+        if (sz < 0) {
+                log_syntax(unit, LOG_ERR, filename, line, sz,
+                           "Failed to decode option data, ignoring assignment: %s", p);
                 return 0;
         }