I like this on first read. In fact I thought this already existed.
I'll actually look more closely at the code tomorrow.
.... Ken
On Thu, Jul 26, 2012 at 10:09:28PM -0400, Ted Unangst wrote:
> I have a system with two network interfaces (em0 and em1), running dhcp
> on both. Both dhcp servers provide me with a nameserver, but only one
> of them works (I can't fix this). There is a config file for dhclient
> I can use, but it only supports the supersede keyword. I don't want
> to statically configure a nameserver override for em1, because the
> whole point is that the good nameserver on em0 can change. I just
> want to say "pretend this option did not arrive."
>
> Diff below adds a little support for an ignore keyword. Like
> supersede, except don't actually use the supplied value.
>
> Index: clparse.c
> ===================================================================
> RCS file: /cvs/src/sbin/dhclient/clparse.c,v
> retrieving revision 1.38
> diff -u -p -r1.38 clparse.c
> --- clparse.c 10 Dec 2011 17:15:27 -0000 1.38
> +++ clparse.c 27 Jul 2012 01:59:10 -0000
> @@ -170,6 +170,11 @@ parse_client_statement(FILE *cfile)
> if (code != -1)
> config->default_actions[code] = ACTION_SUPERSEDE;
> return;
> + case TOK_IGNORE:
> + code = parse_option_decl(cfile, &config->defaults[0]);
> + if (code != -1)
> + config->default_actions[code] = ACTION_IGNORE;
> + return;
> case TOK_APPEND:
> code = parse_option_decl(cfile, &config->defaults[0]);
> if (code != -1)
> Index: conflex.c
> ===================================================================
> RCS file: /cvs/src/sbin/dhclient/conflex.c,v
> retrieving revision 1.14
> diff -u -p -r1.14 conflex.c
> --- conflex.c 10 Dec 2011 17:36:40 -0000 1.14
> +++ conflex.c 27 Jul 2012 01:15:19 -0000
> @@ -337,6 +337,7 @@ static const struct keywords {
> { "filename", TOK_FILENAME },
> { "fixed-address", TOK_FIXED_ADDR },
> { "hardware", TOK_HARDWARE },
> + { "ignore", TOK_IGNORE },
> { "initial-interval", TOK_INITIAL_INTERVAL },
> { "interface", TOK_INTERFACE },
> { "lease", TOK_LEASE },
> Index: dhclient.c
> ===================================================================
> RCS file: /cvs/src/sbin/dhclient/dhclient.c,v
> retrieving revision 1.146
> diff -u -p -r1.146 dhclient.c
> --- dhclient.c 9 Jul 2012 16:21:21 -0000 1.146
> +++ dhclient.c 27 Jul 2012 01:59:35 -0000
> @@ -1535,6 +1535,9 @@ priv_script_write_params(char *prefix, s
> if (config->defaults[i].len) {
> if (lease->options[i].len) {
> switch (config->default_actions[i]) {
> + case ACTION_IGNORE:
> + /* handled below */
> + break;
> case ACTION_DEFAULT:
> dp = lease->options[i].data;
> len = lease->options[i].len;
> @@ -1588,6 +1591,9 @@ supersede:
> len = lease->options[i].len;
> dp = lease->options[i].data;
> } else {
> + len = 0;
> + }
> + if (len && config->default_actions[i] == ACTION_IGNORE) {
> len = 0;
> }
> if (len) {
> Index: dhclient.conf.5
> ===================================================================
> RCS file: /cvs/src/sbin/dhclient/dhclient.conf.5,v
> retrieving revision 1.21
> diff -u -p -r1.21 dhclient.conf.5
> --- dhclient.conf.5 9 Apr 2011 19:53:00 -0000 1.21
> +++ dhclient.conf.5 27 Jul 2012 02:05:28 -0000
> @@ -244,6 +244,14 @@ in the
> .Ic supersede
> statement.
> .It Xo
> +.Ic ignore No { Op Ar option declaration
> +.Oo , Ar ... option declaration Oc }
> +.Xc
> +If for some set of options the client should always ignore the
> +value supplied by the server, these values can be defined in the
> +.Ic ignore
> +statement.
> +.It Xo
> .Ic prepend No { Op Ar option declaration
> .Oo , Ar ... option declaration Oc }
> .Xc
> Index: dhcpd.h
> ===================================================================
> RCS file: /cvs/src/sbin/dhclient/dhcpd.h,v
> retrieving revision 1.76
> diff -u -p -r1.76 dhcpd.h
> --- dhcpd.h 9 Jul 2012 16:21:21 -0000 1.76
> +++ dhcpd.h 27 Jul 2012 01:18:18 -0000
> @@ -130,6 +130,7 @@ struct client_config {
> struct option_data defaults[256];
> enum {
> ACTION_DEFAULT,
> + ACTION_IGNORE,
> ACTION_SUPERSEDE,
> ACTION_PREPEND,
> ACTION_APPEND
> Index: dhctoken.h
> ===================================================================
> RCS file: /cvs/src/sbin/dhclient/dhctoken.h,v
> retrieving revision 1.5
> diff -u -p -r1.5 dhctoken.h
> --- dhctoken.h 15 May 2006 08:10:57 -0000 1.5
> +++ dhctoken.h 27 Jul 2012 01:15:54 -0000
> @@ -79,6 +79,7 @@
> #define TOK_REJECT 292
> #define TOK_FDDI 293
> #define TOK_LINK_TIMEOUT 294
> +#define TOK_IGNORE 295
>
> #define is_identifier(x) ((x) >= TOK_FIRST_TOKEN && \
> (x) != TOK_STRING && \