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} |