Deleted Added
full compact
devd.cc (113787) devd.cc (113790)
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>
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 $");
37__FBSDID("$FreeBSD: head/sbin/devd/devd.cc 113790 2003-04-21 06:26:08Z 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
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;
73int dflag;
74int dflag;
75int nflag = 1;
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);
76int romeo_must_die = 0;
77
78static void event_loop(void);
79static void usage(void);
80
81template <class T> void
82delete_and_clear(vector<T *> &v)
83{

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

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

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

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

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

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

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

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

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

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

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

671}
672
673static void
674event_loop(void)
675{
676 int rv;
677 int fd;
678 char buffer[DEVCTL_MAXBUF];
679 int once = 0;
680 timeval tv;
681 fd_set fds;
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;
682
683 fd = open(PATH_DEVCTL, O_RDONLY);
684 if (fd == -1)
685 err(1, "Can't open devctl");
686 if (fcntl(fd, F_SETFD, FD_CLOEXEC) != 0)
687 err(1, "Can't set close-on-exec flag");
688 while (1) {
689 if (romeo_must_die)
690 break;
691 if (!once && !dflag && !nflag) {
692 // Check to see if we have any events pending.
693 tv.tv_sec = 0;
694 tv.tv_usec = 0;
695 FD_ZERO(&fds);
696 FD_SET(fd, &fds);
697 rv = select(fd + 1, &fds, &fds, &fds, &tv);
698 // No events -> we've processed all pending events
699 fprintf(stderr, "Select returns %d\n", rv);
700 if (rv == 0) {
701 if (Dflag)
702 fprintf(stderr, "Calling daemon\n");
703 daemon(0, 0);
704 once++;
705 }
706 }
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();
707 rv = read(fd, buffer, sizeof(buffer) - 1);
708 if (rv > 0) {
709 buffer[rv] = '\0';
710 while (buffer[--rv] == '\n')
711 buffer[rv] = '\0';
712 process_event(buffer);
713 } else if (rv < 0) {
714 if (errno != EINTR)

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

826 * main
827 */
828int
829main(int argc, char **argv)
830{
831 int ch;
832
833 check_devd_enabled();
813 while ((ch = getopt(argc, argv, "d")) != -1) {
834 while ((ch = getopt(argc, argv, "Ddn")) != -1) {
814 switch (ch) {
835 switch (ch) {
836 case 'D':
837 Dflag++;
838 break;
815 case 'd':
816 dflag++;
817 break;
839 case 'd':
840 dflag++;
841 break;
842 case 'n':
843 nflag++;
844 break;
818 default:
819 usage();
820 }
821 }
822
823 cfg.parse();
845 default:
846 usage();
847 }
848 }
849
850 cfg.parse();
824 if (!dflag)
851 if (!dflag && nflag)
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}
852 daemon(0, 0);
853 cfg.drop_pidfile();
854 signal(SIGHUP, gensighand);
855 signal(SIGINT, gensighand);
856 signal(SIGTERM, gensighand);
857 event_loop();
858 return (0);
859}