[Dnsmasq-discuss] [PATCH] Flush dynamic configuration on reload and discard DHCPv6 options on SIGHUP
Simon Kelley
simon at thekelleys.org.uk
Tue Dec 15 23:20:15 GMT 2015
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
Apologies for ignoring this 'till now. I'm in heavy coding mode now,
and plan to take a look at this in the next day or two.
Cheers,
Simon.
On 02/12/15 13:50, Alin Nastac wrote:
> Reload configuration from dynamic configuration files when they're
> modified, but not before flushing old configuration loaded from
> the same place.This behavioral change affects options
> --dhcp-hostsdir, --dhcp-optsdir and --hostsdir.
>
> Discard DHCPv6 options on SIGHUP before reloading them from
> --dhcp-optsfile. --- src/cache.c | 36 ++++++++++- src/dhcp.c
> | 1 + src/dnsmasq.h | 9 ++- src/inotify.c | 189
> +++++++++++++++++++++++++++++++++++++++++++++----------
> src/option.c | 199
> +++++++++++++++++++++++++++++++++++++++++++++++++---------
> src/rfc2131.c | 1 + 6 files changed, 367 insertions(+), 68
> deletions(-)
>
> diff --git a/src/cache.c b/src/cache.c index 1b76b67..757265c
> 100644 --- a/src/cache.c +++ b/src/cache.c @@ -1029,6 +1029,31 @@
> int read_hostsfile(char *filename, unsigned int index, int
> cache_size, struct cr return name_count; } +void
> flush_hostsfile(char *filename, unsigned int index) +{ + struct
> crec *crecp, **up; + int i; + int addr_count = 0; + + for (i =
> 0; i < hash_size; i++) + for (crecp = hash_table[i], up =
> &hash_table[i]; + crecp; + crecp = crecp->hash_next) + if
> ((crecp->flags & F_HOSTS) && + (crecp->flags & (F_IPV4 | F_IPV6))
> && + crecp->uid == index) + { + addr_count++; + *up =
> crecp->hash_next; + cache_unlink(crecp); + cache_free(crecp); +
> } + else + up = &crecp->hash_next; + + my_syslog(LOG_INFO,
> _("flush hosts read from %s - %d addresses"), filename,
> addr_count); +} + void cache_reload(void) { struct crec *cache,
> **up, *tmp; @@ -1543,11 +1568,18 @@ char *record_source(unsigned
> int index) if (ah->index == index) return ah->fname;
>
> -#ifdef HAVE_INOTIFY + for (ah = daemon->dhcp_hosts_file; ah; ah =
> ah->next) + if (ah->index == index) + return ah->fname; +
> for (ah = daemon->dhcp_opts_file; ah; ah = ah->next) + if
> (ah->index == index) + return ah->fname; for (ah =
> daemon->dynamic_dirs; ah; ah = ah->next) if (ah->index == index)
> return ah->fname; -#endif + for (ah = daemon->dynamic_files; ah;
> ah = ah->next) + if (ah->index == index) + return
> ah->fname;
>
> return "<unknown>"; } diff --git a/src/dhcp.c b/src/dhcp.c index
> 1c85e42..18ccab9 100644 --- a/src/dhcp.c +++ b/src/dhcp.c @@ -882,6
> +882,7 @@ void dhcp_read_ethers(void) { if (!(config =
> whine_malloc(sizeof(struct dhcp_config)))) continue; +
> config->src_index = SRC_CONFIG; config->flags =
> CONFIG_FROM_ETHERS; config->hwaddr = NULL; config->domain = NULL;
> diff --git a/src/dnsmasq.h b/src/dnsmasq.h index f42acdb..ca5b7ac
> 100644 --- a/src/dnsmasq.h +++ b/src/dnsmasq.h @@ -716,6 +716,7 @@
> struct hwaddr_config { };
>
> struct dhcp_config { + unsigned int src_index; unsigned int
> flags; int clid_len; /* length of client identifier */
> unsigned char *clid; /* clientid */ @@ -747,6 +748,7 @@ struct
> dhcp_config { #define CONFIG_WILDCARD 8192
>
> struct dhcp_opt { + unsigned int src_index; int opt, len, flags;
> union { int encap; @@ -982,7 +984,7 @@ extern struct daemon { int
> doing_ra, doing_dhcp6; struct dhcp_netid_list *dhcp_ignore,
> *dhcp_ignore_names, *dhcp_gen_names; struct dhcp_netid_list
> *force_broadcast, *bootp_dynamic; - struct hostsfile
> *dhcp_hosts_file, *dhcp_opts_file, *dynamic_dirs; + struct
> hostsfile *dhcp_hosts_file, *dhcp_opts_file, *dynamic_dirs,
> *dynamic_files; int dhcp_max, tftp_max; int dhcp_server_port,
> dhcp_client_port; int start_tftp_port, end_tftp_port; @@ -1092,6
> +1094,7 @@ char *cache_get_cname_target(struct crec *crecp); struct
> crec *cache_enumerate(int init); int read_hostsfile(char *filename,
> unsigned int index, int cache_size, struct crec **rhash, int
> hashsz); +void flush_hostsfile(char *filename, unsigned int
> index);
>
> /* blockdata.c */ #ifdef HAVE_DNSSEC @@ -1222,10 +1225,12 @@ void
> reread_dhcp(void); void read_servers_file(void); void
> set_option_bool(unsigned int opt); void reset_option_bool(unsigned
> int opt); +unsigned int max_source_index(); struct hostsfile
> *expand_filelist(struct hostsfile *list); char *parse_server(char
> *arg, union mysockaddr *addr, union mysockaddr *source_addr, char
> *interface, int *flags); -int option_read_dynfile(char *file, int
> flags); +int option_read_dynfile(struct hostsfile *df); +void
> option_flush_dynfile(struct hostsfile *df);
>
> /* forward.c */ void reply_query(int fd, int family, time_t now);
> diff --git a/src/inotify.c b/src/inotify.c index ef05c58..9f3a31d
> 100644 --- a/src/inotify.c +++ b/src/inotify.c @@ -135,7 +135,25 @@
> void inotify_dnsmasq_init() void set_dynamic_inotify(int flag, int
> total_size, struct crec **rhash, int revhashsz) { struct hostsfile
> *ah; + unsigned int index = max_source_index();
>
> + /* discard dynamic files loaded before */ + while ((ah =
> daemon->dynamic_files)) + { + if (ah->flags & AH_HOSTS) +
> flush_hostsfile(ah->fname, ah->index); +#ifdef HAVE_DHCP +
> else if (ah->flags & (AH_DHCP_HST | AH_DHCP_OPT)) +
> option_flush_dynfile(ah); +#endif + + daemon->dynamic_files =
> ah->next; + + free(ah->fname); + free(ah); + } + + /*
> (re)set inotify and load existing dynamic files */ for (ah =
> daemon->dynamic_dirs; ah; ah = ah->next) { DIR *dir_stream = NULL;
> @@ -154,7 +172,7 @@ void set_dynamic_inotify(int flag, int
> total_size, struct crec **rhash, int revh
>
> if (!(ah->flags & AH_WD_DONE)) { - ah->wd =
> inotify_add_watch(daemon->inotifyfd, ah->fname, IN_CLOSE_WRITE |
> IN_MOVED_TO); + ah->wd = inotify_add_watch(daemon->inotifyfd,
> ah->fname, IN_CLOSE_WRITE | IN_MOVED_TO | IN_DELETE |
> IN_MOVED_FROM); ah->flags |= AH_WD_DONE; }
>
> @@ -171,7 +189,7 @@ void set_dynamic_inotify(int flag, int
> total_size, struct crec **rhash, int revh { size_t lendir =
> strlen(ah->fname); size_t lenfile = strlen(ent->d_name); - char
> *path; + struct hostsfile *new; /* ignore emacs backups and
> dotfiles */ if (lenfile == 0 || @@ -180,25 +198,41 @@ void
> set_dynamic_inotify(int flag, int total_size, struct crec **rhash,
> int revh ent->d_name[0] == '.') continue; - if ((path =
> whine_malloc(lendir + lenfile + 2))) + if (!(new =
> whine_malloc(sizeof(struct hostsfile)))) + continue; + + if
> ((new->fname = whine_malloc(lendir + lenfile + 2))) { -
> strcpy(path, ah->fname); - strcat(path, "/"); -
> strcat(path, ent->d_name); + sprintf(new->fname, "%s/%s",
> ah->fname, ent->d_name); + new->index = ++index; +
> new->wd = -1; + new->flags = (ah->flags & (AH_HOSTS
> +#ifdef HAVE_DHCP + | AH_DHCP_HST |
> AH_DHCP_OPT +#endif + )); /* ignore non-regular
> files */ - if (stat(path, &buf) != -1 &&
> S_ISREG(buf.st_mode)) + if (new->flags != 0 &&
> stat(new->fname, &buf) != -1 && S_ISREG(buf.st_mode)) { - if
> (ah->flags & AH_HOSTS) - total_size = read_hostsfile(path,
> ah->index, total_size, rhash, revhashsz); + new->next =
> daemon->dynamic_files; + daemon->dynamic_files = new; + +
> if (new->flags & AH_HOSTS) + total_size =
> read_hostsfile(new->fname, new->index, total_size, rhash,
> revhashsz); #ifdef HAVE_DHCP - else if (ah->flags &
> (AH_DHCP_HST | AH_DHCP_OPT)) - option_read_dynfile(path,
> ah->flags); + else if (new->flags & (AH_DHCP_HST |
> AH_DHCP_OPT)) + option_read_dynfile(new); #endif } - -
> free(path); + else + { + free(new->fname); +
> free(new); + } } + else + free(new); } } } @@ -207,6
> +241,7 @@ int inotify_check(time_t now) { int hit = 0; struct
> hostsfile *ah; + struct hostsfile *df, **dfup;
>
> while (1) { @@ -243,43 +278,129 @@ int inotify_check(time_t now)
> if ((path = whine_malloc(lendir + in->len + 2))) { -
> strcpy(path, ah->fname); - strcat(path, "/"); -
> strcat(path, in->name); - - my_syslog(LOG_INFO, _("inotify,
> new or changed file %s"), path); + sprintf(path, "%s/%s",
> ah->fname, in->name); + + dfup = &daemon->dynamic_files; +
> df = daemon->dynamic_files; + while (df && +
> (strcmp(path, df->fname) != 0 || + (ah->flags & df->flags) ==
> 0)) + { + dfup = &df->next; + df = df->next; +
> }
>
> - if (ah->flags & AH_HOSTS) + if (!(in->mask & (IN_DELETE
> | IN_MOVED_FROM))) { - read_hostsfile(path, ah->index, 0, NULL,
> 0); + if (df) + { + my_syslog(LOG_INFO, _("inotify,
> changed file %s"), path); + free (path); + + /* discard
> dynamic content loaded before */ + if (df->flags & AH_HOSTS)
> + flush_hostsfile(df->fname, df->index); #ifdef HAVE_DHCP -
> if (daemon->dhcp || daemon->doing_dhcp6) + else if (df->flags
> & (AH_DHCP_HST | AH_DHCP_OPT)) + option_flush_dynfile(df);
> +#endif + } + else { - /* Propogate the consequences of
> loading a new dhcp-host */ -
> dhcp_update_configs(daemon->dhcp_conf); -
> lease_update_from_configs(); - lease_update_file(now); -
> lease_update_dns(1); + my_syslog(LOG_INFO, _("inotify, new
> file %s"), path); + + if (!(df = whine_malloc(sizeof(struct
> hostsfile)))) + { + free(path); + continue; +
> } + + df->fname = path; + df->index =
> max_source_index() + 1; + df->wd = -1; + df->flags =
> (ah->flags & (AH_HOSTS +#ifdef HAVE_DHCP + | AH_DHCP_HST |
> AH_DHCP_OPT +#endif + )); + + df->next =
> daemon->dynamic_files; + daemon->dynamic_files = df; } + +
> if (ah->flags & AH_HOSTS) + { + read_hostsfile(df->fname,
> df->index, 0, NULL, 0); +#ifdef HAVE_DHCP + if (daemon->dhcp
> || daemon->doing_dhcp6) + { + /* Propogate the
> consequences of loading a new dhcp-host */ +
> dhcp_update_configs(daemon->dhcp_conf); +
> lease_update_from_configs(); + lease_update_file(now); +
> lease_update_dns(1); + } #endif - } + } #ifdef
> HAVE_DHCP - else if (ah->flags & AH_DHCP_HST) + else if
> (ah->flags & AH_DHCP_HST) + { + if
> (option_read_dynfile(df)) + { + /* Propogate the
> consequences of loading a new dhcp-host */ +
> dhcp_update_configs(daemon->dhcp_conf); +
> lease_update_from_configs(); + lease_update_file(now); +
> lease_update_dns(1); + } + } + else if (ah->flags &
> AH_DHCP_OPT) + option_read_dynfile(df); +#endif + } +
> else { - if (option_read_dynfile(path, AH_DHCP_HST)) +
> my_syslog(LOG_INFO, _("inotify, deleted file %s"), path); + +
> free(path); + + if (!df) + continue; + + if (df->flags &
> AH_HOSTS) { + flush_hostsfile(df->fname, df->index); +#ifdef
> HAVE_DHCP + if (daemon->dhcp || daemon->doing_dhcp6) +
> { + /* Propogate the consequences of loading a new dhcp-host */
> + dhcp_update_configs(daemon->dhcp_conf); +
> lease_update_from_configs(); + lease_update_file(now); +
> lease_update_dns(1); + } +#endif + } +#ifdef HAVE_DHCP
> + else if (df->flags & AH_DHCP_HST) + { +
> option_flush_dynfile(df); + /* Propogate the consequences of
> loading a new dhcp-host */ dhcp_update_configs(daemon->dhcp_conf);
> lease_update_from_configs(); lease_update_file(now);
> lease_update_dns(1); } - } - else if (ah->flags &
> AH_DHCP_OPT) - option_read_dynfile(path, AH_DHCP_OPT); +
> else if (df->flags & AH_DHCP_OPT) + option_flush_dynfile(df);
> #endif - - free(path); + + /* Remove dynamic file */ +
> *dfup = df->next; + free(df->fname); + free(df); + } }
> } } diff --git a/src/option.c b/src/option.c index 71beb98..ce22f12
> 100644 --- a/src/option.c +++ b/src/option.c @@ -21,7 +21,7 @@
>
> static volatile int mem_recover = 0; static jmp_buf mem_jmp;
> -static int one_file(char *file, int hard_opt); +static int
> one_file(char *file, unsigned int index, int hard_opt);
>
> /* Solaris headers don't have facility names. */ #ifdef
> HAVE_SOLARIS_NETWORK @@ -897,7 +897,7 @@ static char
> *set_prefix(char *arg) }
>
> /* This is too insanely large to keep in-line in the switch */
> -static int parse_dhcp_opt(char *errstr, char *arg, int flags)
> +static int parse_dhcp_opt(unsigned int src_index, char *errstr,
> char *arg, int flags) { struct dhcp_opt *new =
> opt_malloc(sizeof(struct dhcp_opt)); char lenchar = 0, *cp; @@
> -908,6 +908,7 @@ static int parse_dhcp_opt(char *errstr, char *arg,
> int flags) int is6 = 0; int option_ok = 0;
>
> + new->src_index = src_index; new->len = 0; new->flags = flags;
> new->netid = NULL; @@ -1441,7 +1442,7 @@ void
> reset_option_bool(unsigned int opt) daemon->options2 &= ~(1u <<
> (opt - 32)); }
>
> -static int one_opt(int option, char *arg, char *errstr, char
> *gen_err, int command_line, int servers_only) +static int
> one_opt(int option, char *arg, char *errstr, char *gen_err, int
> command_line, int servers_only, unsigned int src_index) { int i;
> char *comma; @@ -1487,7 +1488,7 @@ static int one_opt(int option,
> char *arg, char *errstr, char *gen_err, int comma char *file =
> opt_string_alloc(arg); if (file) { - one_file(file, 0); +
> one_file(file, SRC_CONFIG, 0); free(file); } break; @@ -1587,7
> +1588,7 @@ static int one_opt(int option, char *arg, char *errstr,
> char *gen_err, int comma /* only reg files allowed. */ if
> (S_ISREG(buf.st_mode)) - one_file(path, 0); +
> one_file(path, SRC_CONFIG, 0); free(path); } @@ -1787,9 +1788,8 @@
> static int one_opt(int option, char *arg, char *errstr, char
> *gen_err, int comma case 'H': /* --addn-hosts */ {
> struct hostsfile *new = opt_malloc(sizeof(struct hostsfile)); -
> static unsigned int hosts_index = SRC_AH; new->fname =
> opt_string_alloc(arg); - new->index = hosts_index++; + new->index =
> max_source_index() + 1; new->flags = 0; if (option == 'H') { @@
> -2881,6 +2881,7 @@ static int one_opt(int option, char *arg, char
> *errstr, char *gen_err, int comma new = opt_malloc(sizeof(struct
> dhcp_config)); new->next = daemon->dhcp_conf; + new->src_index =
> src_index; new->flags = (option == LOPT_BANK) ? CONFIG_BANK : 0;
> new->hwaddr = NULL; new->netid = NULL; @@ -3135,7 +3136,7 @@ static
> int one_opt(int option, char *arg, char *errstr, char *gen_err, int
> comma case LOPT_FORCE: /* --dhcp-option-force */ case
> LOPT_OPTS: case LOPT_MATCH: /* --dhcp-match */ - return
> parse_dhcp_opt(errstr, arg, + return parse_dhcp_opt(src_index,
> errstr, arg, option == LOPT_FORCE ? DHOPT_FORCE : (option ==
> LOPT_MATCH ? DHOPT_MATCH : (option == LOPT_OPTS ? DHOPT_BANK :
> 0))); @@ -3203,6 +3204,7 @@ static int one_opt(int option, char
> *arg, char *errstr, char *gen_err, int comma struct dhcp_opt *new =
> opt_malloc(sizeof(struct dhcp_opt)); int timeout;
>
> + new->src_index = src_index; new->netid = NULL; new->opt = 10; /*
> PXE_MENU_PROMPT */
>
> @@ -3994,7 +3996,7 @@ static int one_opt(int option, char *arg,
> char *errstr, char *gen_err, int comma return 1; }
>
> -static void read_file(char *file, FILE *f, int hard_opt) +static
> void read_file(char *file, unsigned int index, FILE *f, int
> hard_opt) { volatile int lineno = 0; char *buff =
> daemon->namebuff; @@ -4116,7 +4118,7 @@ static void read_file(char
> *file, FILE *f, int hard_opt) if (errmess) strcpy(daemon->namebuff,
> errmess); - if (errmess || !one_opt(option, arg, buff,
> _("error"), 0, hard_opt == LOPT_REV_SERV)) + if (errmess ||
> !one_opt(option, arg, buff, _("error"), 0, hard_opt ==
> LOPT_REV_SERV, index)) { sprintf(daemon->namebuff +
> strlen(daemon->namebuff), _(" at line %d of %s"), lineno, file); if
> (hard_opt != 0) @@ -4131,20 +4133,116 @@ static void read_file(char
> *file, FILE *f, int hard_opt) }
>
> #ifdef HAVE_DHCP -int option_read_dynfile(char *file, int flags)
> +int option_read_dynfile(struct hostsfile *df) { -
> my_syslog(MS_DHCP | LOG_INFO, _("read %s"), file); +
> my_syslog(MS_DHCP | LOG_INFO, _("read %s"), df->fname);
>
> - if (flags & AH_DHCP_HST) - return one_file(file, LOPT_BANK);
> - else if (flags & AH_DHCP_OPT) - return one_file(file,
> LOPT_OPTS); + if (df->flags & AH_DHCP_HST) + return
> one_file(df->fname, df->index, LOPT_BANK); + else if (df->flags &
> AH_DHCP_OPT) + return one_file(df->fname, df->index,
> LOPT_OPTS);
>
> return 0; } + +void option_flush_dynfile(struct hostsfile *df) +{ +
> my_syslog(MS_DHCP | LOG_INFO, _("flush config read from %s"),
> df->fname); + + if (df->flags & AH_DHCP_HST) + { + struct
> dhcp_config *configs, *cp, **up; + + for (up =
> &daemon->dhcp_conf, configs = daemon->dhcp_conf; configs; configs =
> cp) + { + cp = configs->next; + + if ((configs->flags &
> CONFIG_BANK) && configs->src_index == df->index) + { +
> struct hwaddr_config *mac, *tmp; + struct dhcp_netid_list
> *list, *tmplist; + + for (mac = configs->hwaddr; mac; mac =
> tmp) + { + tmp = mac->next; + free(mac); + } + + if
> (configs->flags & CONFIG_CLID) + free(configs->clid); + +
> for (list = configs->netid; list; list = tmplist) + { +
> free(list->list); + tmplist = list->next; + free(list); + }
> + + if (configs->flags & CONFIG_NAME) +
> free(configs->hostname); + + *up = configs->next; +
> free(configs); + } + else + up = &configs->next; + } +
> } + else if (df->flags & AH_DHCP_OPT) + { + struct
> dhcp_opt *opts, *cp, **up; + struct dhcp_netid *id, *next; + +
> for (up = &daemon->dhcp_opts, opts = daemon->dhcp_opts; opts; opts
> = cp) + { + cp = opts->next; + + if ((opts->flags & DHOPT_BANK)
> && opts->src_index == df->index) + { + if ((opts->flags &
> DHOPT_VENDOR)) + free(opts->u.vendor_class); +
> free(opts->val); + for (id = opts->netid; id; id = next) +
> { + next = id->next; + free(id->net); + free(id); + } +
> *up = opts->next; + free(opts); + } + else + up =
> &opts->next; + } + +#ifdef HAVE_DHCP6 + for (up =
> &daemon->dhcp_opts6, opts = daemon->dhcp_opts6; opts; opts = cp) +
> { + cp = opts->next; + + if ((opts->flags & DHOPT_BANK) &&
> opts->src_index == df->index) + { + if ((opts->flags &
> DHOPT_VENDOR)) + free(opts->u.vendor_class); +
> free(opts->val); + for (id = opts->netid; id; id = next) +
> { + next = id->next; + free(id->net); + free(id); + } +
> *up = opts->next; + free(opts); + } + else + up =
> &opts->next; + } +#endif + } +} #endif
>
> -static int one_file(char *file, int hard_opt) +static int
> one_file(char *file, unsigned int index, int hard_opt) { FILE *f;
> int nofile_ok = 0; @@ -4208,22 +4306,38 @@ static int one_file(char
> *file, int hard_opt) } }
>
> - read_file(file, f, hard_opt); + read_file(file, index, f,
> hard_opt); return 1; }
>
> +/* find laged used index */ +unsigned int max_source_index() +{ +
> unsigned int ret = SRC_HOSTS; + + if (daemon->addn_hosts &&
> daemon->addn_hosts->index > ret) + ret =
> daemon->addn_hosts->index; + + if (daemon->dhcp_hosts_file &&
> daemon->dhcp_hosts_file->index > ret) + ret =
> daemon->dhcp_hosts_file->index; + if (daemon->dhcp_opts_file &&
> daemon->dhcp_opts_file->index > ret) + ret =
> daemon->dhcp_opts_file->index; + if (daemon->dynamic_dirs &&
> daemon->dynamic_dirs->index > ret) + ret =
> daemon->dynamic_dirs->index; + if (daemon->dynamic_files &&
> daemon->dynamic_files->index > ret) + ret =
> daemon->dynamic_files->index; + + return ret; +} + /* expand any
> name which is a directory */ struct hostsfile
> *expand_filelist(struct hostsfile *list) { - unsigned int i; +
> unsigned int i = max_source_index() + 1; struct hostsfile *ah;
>
> - /* find largest used index */ - for (i = SRC_AH, ah = list; ah;
> ah = ah->next) + for (ah = list; ah; ah = ah->next) { - if (i
> <= ah->index) - i = ah->index + 1; - if (ah->flags & AH_DIR)
> ah->flags |= AH_INACTIVE; else @@ -4326,11 +4440,12 @@ void
> read_servers_file(void) mark_servers(SERV_FROM_FILE);
> cleanup_servers();
>
> - read_file(daemon->servers_file, f, LOPT_REV_SERV); +
> read_file(daemon->servers_file, SRC_CONFIG, f, LOPT_REV_SERV); }
>
>
> #ifdef HAVE_DHCP + void reread_dhcp(void) { struct hostsfile *hf;
> @@ -4379,7 +4494,7 @@ void reread_dhcp(void) for (hf =
> daemon->dhcp_hosts_file; hf; hf = hf->next) if (!(hf->flags &
> AH_INACTIVE)) { - if (one_file(hf->fname, LOPT_BANK)) +
> if (one_file(hf->fname, hf->index, LOPT_BANK)) my_syslog(MS_DHCP |
> LOG_INFO, _("read %s"), hf->fname); } } @@ -4411,11 +4526,35 @@
> void reread_dhcp(void) up = &opts->next; }
>
> +#ifdef HAVE_DHCP6 + for (up = &daemon->dhcp_opts6, opts =
> daemon->dhcp_opts6; opts; opts = cp) + { + cp = opts->next; + +
> if (opts->flags & DHOPT_BANK) + { + if ((opts->flags &
> DHOPT_VENDOR)) + free(opts->u.vendor_class); +
> free(opts->val); + for (id = opts->netid; id; id = next) +
> { + next = id->next; + free(id->net); + free(id); + } +
> *up = opts->next; + free(opts); + } + else + up =
> &opts->next; + } +#endif + daemon->dhcp_opts_file =
> expand_filelist(daemon->dhcp_opts_file); for (hf =
> daemon->dhcp_opts_file; hf; hf = hf->next) if (!(hf->flags &
> AH_INACTIVE)) { - if (one_file(hf->fname, LOPT_OPTS)) + if
> (one_file(hf->fname, hf->index, LOPT_OPTS)) my_syslog(MS_DHCP |
> LOG_INFO, _("read %s"), hf->fname); } } @@ -4532,9 +4671,9 @@ void
> read_opts(int argc, char **argv, char *compile_opts) else { #ifdef
> HAVE_GETOPT_LONG - if (!one_opt(option, arg, daemon->namebuff,
> _("try --help"), 1, 0)) + if (!one_opt(option, arg,
> daemon->namebuff, _("try --help"), 1, 0, SRC_CONFIG)) #else -
> if (!one_opt(option, arg, daemon->namebuff, _("try -w"), 1, 0)) +
> if (!one_opt(option, arg, daemon->namebuff, _("try -w"), 1, 0,
> SRC_CONFIG)) #endif die(_("bad command line options: %s"),
> daemon->namebuff, EC_BADCONF); } @@ -4542,7 +4681,7 @@ void
> read_opts(int argc, char **argv, char *compile_opts)
>
> if (conffile) { - one_file(conffile, conffile_opt); +
> one_file(conffile, SRC_CONFIG, conffile_opt); if (conffile_opt ==
> 0) free(conffile); } diff --git a/src/rfc2131.c b/src/rfc2131.c
> index 9f69ed5..2d57ec4 100644 --- a/src/rfc2131.c +++
> b/src/rfc2131.c @@ -2001,6 +2001,7 @@ static struct dhcp_opt
> *pxe_opts(int pxe_arch, struct dhcp_netid *netid, struct
>
> for (i = 0; i < NUM_OPTS; i++) { + fake_opts[i].src_index =
> SRC_CONFIG; fake_opts[i].flags = DHOPT_VENDOR_MATCH;
> fake_opts[i].netid = NULL; fake_opts[i].next = i == (NUM_OPTS - 1)
> ? ret : &fake_opts[i+1];
>
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.22 (GNU/Linux)
iQIcBAEBCAAGBQJWcKAvAAoJEBXN2mrhkTWiB1oQAKIWz7PYIavWADtBG6Qrhef0
9cpA8aFhg0VSY27HTP7zdlcWYW/aviz3RYyKTp863IDewMpghOU6h1qLRNDxolTa
0suKR3Y+UBKpuamb17NNWjj8cQ+b1XlmL02AT1jdI4t8J3bzF+Wvm72ITQqQ540T
aoWZMUO4cgcL+QKiPWVCS6DK3JKoimUXLj1MKqNBD+Bn0wLNEkuHPI/il+aYfZIn
7kXgZzkbBZ/fth6c8ByX3LLN12xXUiPWbrbn5ctXpIIY18uuTRB6v7w7LeNgCdEZ
RX2DvRcewB22uoTTKl/kPhpBh6aqYqHcfkfjhldfoLsPxDzcrmhOqZTYKBe4Y3Xl
FtEptBecaWgBH7Qf0vL4M/HyvQDGGycClHpJKANu1f9YJRk5TDfE7LtBccZ5JzrT
hEiqVb82OQkg+cCD3OVrnsPXElSJ0XNpWNax9Hb+BWUMVzcL+q5PooEFhNaDFs9p
ZJUSeKW7xILNG1/Z4d7U6ofgzXDGBt/2FQ2V01Opcr46Roigi24DENVhdYbYdyOT
YNGeu4TBr4qLhnPkawj3nY/OExQGG+e+Eesswu5ZsIJ60TzmkW5jxeXpvmRsQCSX
oK/JkwrmUrXfXc78JXfck/Xi9eSTBZ37yNLY5tLIJR124ooTBUb5tYWm7qUVUHdP
+iesCzP6x0DqvXklxsUp
=lD8D
-----END PGP SIGNATURE-----
More information about the Dnsmasq-discuss
mailing list