Deleted Added
sdiff udiff text old ( 113787 ) new ( 113790 )
full compact
1/*-
2 * Copyright (c) 2002-2003 M. Warner Losh.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 20 unchanged lines hidden (view full) ---

29 */
30
31// TODO list:
32// o devd.conf and devd man pages need a lot of help:
33// - devd.conf needs to lose the warning about zone files.
34// - devd.conf needs more details on the supported statements.
35
36#include <sys/cdefs.h>
37__FBSDID("$FreeBSD: head/sbin/devd/devd.cc 113787 2003-04-21 04:30:12Z imp $");
38
39#include <sys/param.h>
40#include <sys/types.h>
41#include <sys/sysctl.h>
42
43#include <ctype.h>
44#include <dirent.h>
45#include <errno.h>

--- 19 unchanged lines hidden (view full) ---

65
66extern FILE *yyin;
67extern int lineno;
68
69static const char nomatch = '?';
70static const char attach = '+';
71static const char detach = '-';
72
73int dflag;
74int romeo_must_die = 0;
75
76static void event_loop(void);
77static void usage(void);
78
79template <class T> void
80delete_and_clear(vector<T *> &v)
81{

--- 158 unchanged lines hidden (view full) ---

240{
241 // nothing
242}
243
244bool
245action::do_action(config &c)
246{
247 string s = c.expand_string(_cmd);
248 if (dflag)
249 fprintf(stderr, "Executing '%s'\n", s.c_str());
250 ::system(s.c_str());
251 return (true);
252}
253
254match::match(config &c, const char *var, const char *re)
255 : _var(var)
256{

--- 10 unchanged lines hidden (view full) ---

267}
268
269bool
270match::do_match(config &c)
271{
272 string value = c.get_variable(_var);
273 bool retval;
274
275 if (dflag)
276 fprintf(stderr, "Testing %s=%s against %s\n", _var.c_str(),
277 value.c_str(), _re.c_str());
278
279 retval = (regexec(&_regex, value.c_str(), 0, NULL, 0) == 0);
280 return retval;
281}
282
283const string var_list::bogus = "_$_$_$_$_B_O_G_U_S_$_$_$_$_";

--- 14 unchanged lines hidden (view full) ---

298var_list::is_set(const string &var) const
299{
300 return (_vars.find(var) != _vars.end());
301}
302
303void
304var_list::set_variable(const string &var, const string &val)
305{
306 if (dflag)
307 fprintf(stderr, "%s=%s\n", var.c_str(), val.c_str());
308 _vars[var] = val;
309}
310
311void
312config::reset(void)
313{
314 _dir_list.clear();
315 delete_and_clear(_var_list_table);
316 delete_and_clear(_attach_list);
317 delete_and_clear(_detach_list);
318 delete_and_clear(_nomatch_list);
319}
320
321void
322config::parse_one_file(const char *fn)
323{
324 if (dflag)
325 printf("Parsing %s\n", fn);
326 yyin = fopen(fn, "r");
327 if (yyin == NULL)
328 err(1, "Cannot open config file %s", fn);
329 if (yyparse() != 0)
330 errx(1, "Cannot parse %s at line %d", fn, lineno);
331 fclose(yyin);
332}
333
334void
335config::parse_files_in_dir(const char *dirname)
336{
337 DIR *dirp;
338 struct dirent *dp;
339 char path[PATH_MAX];
340
341 if (dflag)
342 printf("Parsing files in %s\n", dirname);
343 dirp = opendir(dirname);
344 if (dirp == NULL)
345 return;
346 readdir(dirp); /* Skip . */
347 readdir(dirp); /* Skip .. */
348 while ((dp = readdir(dirp)) != NULL) {
349 if (strcmp(dp->d_name + dp->d_namlen - 5, ".conf") == 0) {

--- 80 unchanged lines hidden (view full) ---

430
431void
432config::push_var_table()
433{
434 var_list *vl;
435
436 vl = new var_list();
437 _var_list_table.push_back(vl);
438 if (dflag)
439 fprintf(stderr, "Pushing table\n");
440}
441
442void
443config::pop_var_table()
444{
445 delete _var_list_table.back();
446 _var_list_table.pop_back();
447 if (dflag)
448 fprintf(stderr, "Popping table\n");
449}
450
451void
452config::set_variable(const char *var, const char *val)
453{
454 _var_list_table.back()->set_variable(var, val);
455}

--- 157 unchanged lines hidden (view full) ---

613 l = &_attach_list;
614 s = "attach";
615 break;
616 case detach:
617 l = &_detach_list;
618 s = "detach";
619 break;
620 }
621 if (dflag)
622 fprintf(stderr, "Processing %s event\n", s);
623 for (i = l->begin(); i != l->end(); i++) {
624 if ((*i)->matches(*this)) {
625 (*i)->run(*this);
626 break;
627 }
628 }
629
630}
631
632
633static void
634process_event(char *buffer)
635{
636 char type;
637 char *sp;
638
639 sp = buffer + 1;
640 if (dflag)
641 fprintf(stderr, "Processing event '%s'\n", buffer);
642 type = *buffer++;
643 cfg.push_var_table();
644 // No match doesn't have a device, and the format is a little
645 // different, so handle it separately.
646 if (type != nomatch) {
647 sp = strchr(sp, ' ');
648 if (sp == NULL)

--- 20 unchanged lines hidden (view full) ---

669}
670
671static void
672event_loop(void)
673{
674 int rv;
675 int fd;
676 char buffer[DEVCTL_MAXBUF];
677
678 fd = open(PATH_DEVCTL, O_RDONLY);
679 if (fd == -1)
680 err(1, "Can't open devctl");
681 if (fcntl(fd, F_SETFD, FD_CLOEXEC) != 0)
682 err(1, "Can't set close-on-exec flag");
683 while (1) {
684 if (romeo_must_die)
685 break;
686 rv = read(fd, buffer, sizeof(buffer) - 1);
687 if (rv > 0) {
688 buffer[rv] = '\0';
689 while (buffer[--rv] == '\n')
690 buffer[rv] = '\0';
691 process_event(buffer);
692 } else if (rv < 0) {
693 if (errno != EINTR)

--- 111 unchanged lines hidden (view full) ---

805 * main
806 */
807int
808main(int argc, char **argv)
809{
810 int ch;
811
812 check_devd_enabled();
813 while ((ch = getopt(argc, argv, "d")) != -1) {
814 switch (ch) {
815 case 'd':
816 dflag++;
817 break;
818 default:
819 usage();
820 }
821 }
822
823 cfg.parse();
824 if (!dflag)
825 daemon(0, 0);
826 cfg.drop_pidfile();
827 signal(SIGHUP, gensighand);
828 signal(SIGINT, gensighand);
829 signal(SIGTERM, gensighand);
830 event_loop();
831 return (0);
832}