diff options
author | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2019-10-30 09:13:38 +0100 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2019-10-30 09:13:38 +0100 |
commit | a2cc708a88087e903bd915ecd1d91370f4347c17 (patch) | |
tree | 8af98a9d0171d5eca62d37f12f968eb977e7b3b2 | |
parent | 864edb39cfb68a304a7c318965079effc6a05ece (diff) | |
download | systemd-a2cc708a88087e903bd915ecd1d91370f4347c17.tar.gz |
network: amend SendOption= to take a c-escaped string
No need to punish users by forcing them to do base64 encodings.
-rw-r--r-- | man/systemd.network.xml | 12 | ||||
-rw-r--r-- | src/network/networkd-dhcp4.c | 15 |
2 files changed, 15 insertions, 12 deletions
diff --git a/man/systemd.network.xml b/man/systemd.network.xml index 3ef6ff592c..538f4b8e7b 100644 --- a/man/systemd.network.xml +++ b/man/systemd.network.xml @@ -1642,10 +1642,14 @@ <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> diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c index 45091de97d..947853e2c4 100644 --- a/src/network/networkd-dhcp4.c +++ b/src/network/networkd-dhcp4.c @@ -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; } |