View | Details | Raw Unified | Return to bug 231441
Collapse All | Expand All

(-)b/sbin/devd/devd.cc (-6 / +10 lines)
Lines 280-286 my_system(const char *command) Link Here
280
bool
280
bool
281
action::do_action(config &c)
281
action::do_action(config &c)
282
{
282
{
283
	string s = c.expand_string(_cmd.c_str());
283
	string s = c.expand_string(_cmd.c_str(), true);
284
	devdlog(LOG_INFO, "Executing '%s'\n", s.c_str());
284
	devdlog(LOG_INFO, "Executing '%s'\n", s.c_str());
285
	my_system(s.c_str());
285
	my_system(s.c_str());
286
	return (true);
286
	return (true);
Lines 289-295 action::do_action(config &c) Link Here
289
match::match(config &c, const char *var, const char *re) :
289
match::match(config &c, const char *var, const char *re) :
290
	_inv(re[0] == '!'),
290
	_inv(re[0] == '!'),
291
	_var(var),
291
	_var(var),
292
	_re(c.expand_string(_inv ? re + 1 : re, "^", "$"))
292
	_re(c.expand_string(_inv ? re + 1 : re, false, "^", "$"))
293
{
293
{
294
	regcomp(&_regex, _re.c_str(), REG_EXTENDED | REG_NOSUB | REG_ICASE);
294
	regcomp(&_regex, _re.c_str(), REG_EXTENDED | REG_NOSUB | REG_ICASE);
295
}
295
}
Lines 666-672 config::shell_quote(const string &s) Link Here
666
}
666
}
667
667
668
void
668
void
669
config::expand_one(const char *&src, string &dst)
669
config::expand_one(const char *&src, string &dst, bool squote)
670
{
670
{
671
	int count;
671
	int count;
672
	string buffer;
672
	string buffer;
Lines 705-715 config::expand_one(const char *&src, string &dst) Link Here
705
	do {
705
	do {
706
		buffer += *src++;
706
		buffer += *src++;
707
	} while (is_id_char(*src));
707
	} while (is_id_char(*src));
708
	dst.append(shell_quote(get_variable(buffer)));
708
	if (squote)
709
		dst.append(shell_quote(get_variable(buffer)));
710
	else
711
		dst.append(get_variable(buffer));
709
}
712
}
710
713
711
const string
714
const string
712
config::expand_string(const char *src, const char *prepend, const char *append)
715
config::expand_string(const char *src, bool squote, const char *prepend,
716
    const char *append)
713
{
717
{
714
	const char *var_at;
718
	const char *var_at;
715
	string dst;
719
	string dst;
Lines 731-737 config::expand_string(const char *src, const char *prepend, const char *append) Link Here
731
		}
735
		}
732
		dst.append(src, var_at - src);
736
		dst.append(src, var_at - src);
733
		src = var_at;
737
		src = var_at;
734
		expand_one(src, dst);
738
		expand_one(src, dst, squote);
735
	}
739
	}
736
740
737
	if (append != NULL)
741
	if (append != NULL)
(-)b/sbin/devd/devd.hh (-2 / +2 lines)
Lines 164-170 public: Link Here
164
	void pop_var_table();
164
	void pop_var_table();
165
	void set_variable(const char *var, const char *val);
165
	void set_variable(const char *var, const char *val);
166
	const std::string &get_variable(const std::string &var);
166
	const std::string &get_variable(const std::string &var);
167
	const std::string expand_string(const char * var, 
167
	const std::string expand_string(const char * var, bool squote,
168
	    const char * prepend = NULL, const char * append = NULL);
168
	    const char * prepend = NULL, const char * append = NULL);
169
	char *set_vars(char *);
169
	char *set_vars(char *);
170
	void find_and_execute(char);
170
	void find_and_execute(char);
Lines 172-178 protected: Link Here
172
	void sort_vector(std::vector<event_proc *> &);
172
	void sort_vector(std::vector<event_proc *> &);
173
	void parse_one_file(const char *fn);
173
	void parse_one_file(const char *fn);
174
	void parse_files_in_dir(const char *dirname);
174
	void parse_files_in_dir(const char *dirname);
175
	void expand_one(const char *&src, std::string &dst);
175
	void expand_one(const char *&src, std::string &dst, bool squote);
176
	std::string shell_quote(const std::string &s);
176
	std::string shell_quote(const std::string &s);
177
	bool is_id_char(char) const;
177
	bool is_id_char(char) const;
178
	bool chop_var(char *&buffer, char *&lhs, char *&rhs) const;
178
	bool chop_var(char *&buffer, char *&lhs, char *&rhs) const;

Return to bug 231441