devd. A daemon that hooks into the kernel's /dev/devctl to produce
arbitrary commands when devices come and go in the device tree (which is different than the /dev directory). This is an initial version. Much of the planned power isn't here. Instead of doing the full matching, we always run /etc/devd-generic. /etc/devd.generic will go away at some point, I think. I'm committing it in this early state so I can start getting feedback from early adapters. Approved by: re
This commit is contained in:
parent
be36629d5c
commit
e530e0446b
16
sbin/devd/Makefile
Normal file
16
sbin/devd/Makefile
Normal file
@ -0,0 +1,16 @@
|
||||
# $FreeBSD$
|
||||
|
||||
PROG= devd
|
||||
SRCS= devd.c token.l parse.y y.tab.h
|
||||
MAN= devd.8
|
||||
WARNS?= 5
|
||||
|
||||
DPADD= ${LIBL}
|
||||
LDADD= -ll
|
||||
|
||||
YFLAGS+=-v
|
||||
CFLAGS+=-I. -I${.CURDIR}
|
||||
|
||||
CLEANFILES= y.output
|
||||
|
||||
.include <bsd.prog.mk>
|
26
sbin/devd/devd-generic
Normal file
26
sbin/devd/devd-generic
Normal file
@ -0,0 +1,26 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# $FreeBSD$
|
||||
#
|
||||
# Script called by devd(8) whenever a device appears or disappears.
|
||||
#
|
||||
# XXX this is a temporary hack that will go away soon
|
||||
|
||||
dev="$1"
|
||||
startstop="$2"
|
||||
|
||||
driver="${dev%%[0-9]*}"
|
||||
unit="${dev##*[^0-9]}"
|
||||
|
||||
if [ -z "$driver" -o -z "$unit" ]; then
|
||||
echo "cannot parse device \"$dev\"" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
case "$driver" in
|
||||
an|ar|awi|bge|cm|cnw|cs|dc|de|ed|el|em|ep|ex|fe|fxp|gem|gx|hme|ie|lge|lnc|my| \
|
||||
nge|pcn|ray|rl|sf|sis|sk|sn|snc|ste|ti|tl|tx|txp|vr|vx|wb|wi|xe|xl)
|
||||
# An ethernet interface; call pccard_ether to do the real work
|
||||
/etc/pccard_ether "$dev" "$startstop"
|
||||
;;
|
||||
esac
|
88
sbin/devd/devd.8
Normal file
88
sbin/devd/devd.8
Normal file
@ -0,0 +1,88 @@
|
||||
.\"
|
||||
.\" Copyright (c) 2002 M. Warner Losh.
|
||||
.\" All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd October 17, 2002
|
||||
.Dt DEVD 8
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm devd
|
||||
.Nd "Device state change daemon"
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Op Fl d
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm
|
||||
daemon provides a way to have userland programs run when certain
|
||||
kernel events happen.
|
||||
.Pp
|
||||
The following options are accepted.
|
||||
.Bl -tag -width indent
|
||||
.It Fl d
|
||||
Enable debugging messages and run in the foreground instead of
|
||||
becoming a daemon.
|
||||
.El
|
||||
.Sh IMPLEMENTATION NOTES
|
||||
.Nm
|
||||
is a system daemon.
|
||||
It runs in the background all the time.
|
||||
When ever a device is added to or removed from the device tree, devd
|
||||
will cause a certain action to take place.
|
||||
In addition, when a device that is not matched enters the system, devd
|
||||
will also perform an action.
|
||||
.Pp
|
||||
.Nm
|
||||
hooks into the
|
||||
.Xr devctl 4
|
||||
device driver.
|
||||
This device driver has hooks into the device configuration system.
|
||||
When nodes are added or deleted from the tree, this device will
|
||||
deliver information about the even to
|
||||
.Nm .
|
||||
Once
|
||||
.Nm
|
||||
has parsed the message, it will search its action list for that kind
|
||||
of event, and perform the action with the highest matching value.
|
||||
For most mundane uses, the default handlers are adequate.
|
||||
However, for more advanced users, the power is present to tweak every
|
||||
aspect of what happens.
|
||||
.Pp
|
||||
.Nm reads /etc/devd.conf, and that drives the rest of the process.
|
||||
While the format of this file is described in
|
||||
.Xr devd.conf 5
|
||||
some basics are covered here.
|
||||
In the options section, one can define multiple directories to search
|
||||
for config files.
|
||||
All files in each of these directories are parsed.
|
||||
These files are intended to be installed by third party vendors that
|
||||
wish to hook into the devd system without modifying the user's other
|
||||
config files.
|
||||
.Sh SEE ALSO
|
||||
.Xr devctl 4 ,
|
||||
.Xr devd.conf 5
|
||||
.Sh AUTHORS
|
||||
.An M. Warner Losh
|
223
sbin/devd/devd.c
Normal file
223
sbin/devd/devd.c
Normal file
@ -0,0 +1,223 @@
|
||||
/*-
|
||||
* Copyright (c) 2002 M. Warner Losh.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* DEVD control daemon.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <dirent.h>
|
||||
#include <errno.h>
|
||||
#include <err.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "devd.h"
|
||||
|
||||
#define CF "/etc/devd.conf"
|
||||
|
||||
extern FILE *yyin;
|
||||
extern int lineno;
|
||||
|
||||
int dflag;
|
||||
int romeo_must_die = 0;
|
||||
struct file_list_head dirlist = TAILQ_HEAD_INITIALIZER(dirlist);
|
||||
|
||||
static void event_loop(void);
|
||||
static void parse(void);
|
||||
static void parse_config_file(const char *fn);
|
||||
static void parse_files_in_dir(const char *dirname);
|
||||
static void reset_config(void);
|
||||
static void usage(void);
|
||||
|
||||
void
|
||||
add_directory(const char *dir)
|
||||
{
|
||||
struct file_list *elm;
|
||||
|
||||
elm = malloc(sizeof(*elm));
|
||||
elm->path = strdup(dir);
|
||||
TAILQ_INSERT_TAIL(&dirlist, elm, fl_link);
|
||||
}
|
||||
|
||||
static void
|
||||
reset_config(void)
|
||||
{
|
||||
struct file_list *flp;
|
||||
|
||||
TAILQ_FOREACH(flp, &dirlist, fl_link) {
|
||||
free(flp->path);
|
||||
free(flp);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
parse_config_file(const char *fn)
|
||||
{
|
||||
if (dflag)
|
||||
printf("Parsing %s\n", fn);
|
||||
yyin = fopen(fn, "r");
|
||||
if (yyin == NULL)
|
||||
err(1, "Cannot open config file %s", fn);
|
||||
if (yyparse() != 0)
|
||||
errx(1, "Cannot parse %s at line %d", fn, lineno);
|
||||
fclose(yyin);
|
||||
}
|
||||
|
||||
static void
|
||||
parse_files_in_dir(const char *dirname)
|
||||
{
|
||||
DIR *dirp;
|
||||
struct dirent *dp;
|
||||
char path[PATH_MAX];
|
||||
|
||||
if (dflag)
|
||||
printf("Parsing files in %s\n", dirname);
|
||||
dirp = opendir(dirname);
|
||||
if (dirp == NULL)
|
||||
return;
|
||||
readdir(dirp); /* Skip . */
|
||||
readdir(dirp); /* Skip .. */
|
||||
while ((dp = readdir(dirp)) != NULL) {
|
||||
if (strcmp(dp->d_name + dp->d_namlen - 5, ".conf") == 0) {
|
||||
snprintf(path, sizeof(path), "%s/%s",
|
||||
dirname, dp->d_name);
|
||||
parse_config_file(path);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
parse(void)
|
||||
{
|
||||
struct file_list *flp;
|
||||
|
||||
parse_config_file(CF);
|
||||
TAILQ_FOREACH(flp, &dirlist, fl_link) {
|
||||
parse_files_in_dir(flp->path);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
process_event(const char *buffer)
|
||||
{
|
||||
char type;
|
||||
char cmd[1024];
|
||||
char *sp;
|
||||
|
||||
// Ignore unknown devices for now.
|
||||
if (*buffer == '?')
|
||||
return;
|
||||
type = *buffer++;
|
||||
sp = strchr(buffer, ' ');
|
||||
if (sp == NULL)
|
||||
return; /* Can't happen? */
|
||||
*sp = '\0';
|
||||
snprintf(cmd, sizeof(cmd), "/etc/devd-generic %s %s", buffer,
|
||||
type == '+' ? "start" : "stop");
|
||||
if (dflag)
|
||||
printf("Trying '%s'\n", cmd);
|
||||
system(cmd);
|
||||
}
|
||||
|
||||
static void
|
||||
event_loop(void)
|
||||
{
|
||||
int rv;
|
||||
int fd;
|
||||
char buffer[1024 + 1]; /* XXX */
|
||||
|
||||
fd = open("/dev/devctl", O_RDONLY); /* XXX */
|
||||
if (fd == -1)
|
||||
err(1, "Can't open devctl");
|
||||
if (fcntl(fd, F_SETFD, FD_CLOEXEC) != 0)
|
||||
err(1, "Can't set close-on-exec flag");
|
||||
while (1) {
|
||||
if (romeo_must_die)
|
||||
break;
|
||||
rv = read(fd, buffer, sizeof(buffer) - 1);
|
||||
if (rv > 0) {
|
||||
buffer[rv] = '\0';
|
||||
while (buffer[--rv] == '\n')
|
||||
buffer[rv] = '\0';
|
||||
process_event(buffer);
|
||||
} else if (rv < 0) {
|
||||
if (errno != EINTR)
|
||||
break;
|
||||
} else {
|
||||
/* EOF */
|
||||
break;
|
||||
}
|
||||
}
|
||||
close(fd);
|
||||
}
|
||||
|
||||
static void
|
||||
gensighand(int foo __unused)
|
||||
{
|
||||
romeo_must_die++;
|
||||
}
|
||||
|
||||
static void
|
||||
usage()
|
||||
{
|
||||
fprintf(stderr, "usage: %s [-d]", getprogname());
|
||||
exit(1);
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
int ch;
|
||||
|
||||
while ((ch = getopt(argc, argv, "d")) != -1) {
|
||||
switch (ch) {
|
||||
case 'd':
|
||||
dflag++;
|
||||
break;
|
||||
default:
|
||||
usage();
|
||||
}
|
||||
}
|
||||
|
||||
reset_config();
|
||||
parse();
|
||||
if (!dflag)
|
||||
daemon(0, 0);
|
||||
event_loop();
|
||||
signal(SIGHUP, gensighand);
|
||||
signal(SIGINT, gensighand);
|
||||
signal(SIGTERM, gensighand);
|
||||
return (0);
|
||||
}
|
92
sbin/devd/devd.conf
Normal file
92
sbin/devd/devd.conf
Normal file
@ -0,0 +1,92 @@
|
||||
// $FreeBSD$
|
||||
//
|
||||
// Refer to devd.conf(5) and devd(8) man pages for the details on how to
|
||||
// run and configure devd.
|
||||
//
|
||||
|
||||
// NB: All regular expressions have an implicit ^$ around them.
|
||||
|
||||
options {
|
||||
// Each directory directive adds a directory the list of directories
|
||||
// that we scan for files. Files are read-in in the order that they
|
||||
// are returned from readdir(3). The rule-sets are combined to
|
||||
// create a DFA that's used to match events to actions.
|
||||
directory "/etc/devd";
|
||||
directory "/usr/local/etc/devd";
|
||||
pid-file "/var/run/devd.pid";
|
||||
|
||||
// Setup some shorthand for regex that we use later in the file.
|
||||
set ethernet-nic-regex
|
||||
"(an|ar|aue|awi|bge|cm|cnw|cs|cue|dc|de|ed|el|em|ep|ex|\
|
||||
fe|fxp|gem|gx|hme|ie|kue|lge|lnc|my|nge|pcn|ray|rl|\
|
||||
sf|sis|sk|sn|snc|ste|ti|tl|tx|txp|vr|vx|wb|wi|xe|xl)[0-9]+";
|
||||
set scsi-controller-regex
|
||||
"(adv|advw|aic|aha|ahb|ahc|ahd|bt|ct|iir|isp|mly|mpt|ncv|nsp|\
|
||||
stg|sym|wds)[0-9]+";
|
||||
};
|
||||
|
||||
// Note that the attach/detach with the highest value wins, so that one can
|
||||
// override these general rules.
|
||||
|
||||
// NB: device-name is shorthand for 'match device-name'
|
||||
|
||||
//
|
||||
// For ethernet like devices, the default is to run dhclient. Due to
|
||||
// a historical accident, the name of this script it called pccard_ether
|
||||
//
|
||||
attach 0 {
|
||||
device-name "$ethernet-nic-regex";
|
||||
action "/etc/pccard_ether $device-name start";
|
||||
};
|
||||
|
||||
detach 0 {
|
||||
device-name "$ethernet-nic-regex";
|
||||
action "/etc/pccard_ether $device-name stop";
|
||||
};
|
||||
|
||||
// An entry like this might be in a different file, but is included here
|
||||
// as an example of how to override things. Normally 'ed20' would match
|
||||
// the above attach/detach stuff, but the value of 100 makes it
|
||||
// ed20 is hard wired to 1.2.3.4
|
||||
attach 100 {
|
||||
device-name "ed20";
|
||||
action "ifconfig $device-name inet 1.2.3.4 netmask 0xffff0000";
|
||||
};
|
||||
detach 100 {
|
||||
device-name "ed20";
|
||||
};
|
||||
|
||||
//
|
||||
// Rescan scsi device-names on attach, but not detach.
|
||||
//
|
||||
attach 0 {
|
||||
device-name "$scsi-controller-regex";
|
||||
action "camcontrol rescan all";
|
||||
};
|
||||
|
||||
// Don't even try to second guess what to do about drivers that don't
|
||||
// match here. Instead, pass it off to a smart script to deal.
|
||||
nomatch 0 {
|
||||
action "/usr/local/bin/smart-loader $pnpinfo $location $bus";
|
||||
};
|
||||
|
||||
// The following might be an example of something that a vendor might
|
||||
// install if you were to add their device. This might reside in
|
||||
// /usr/local/etc/devd/deqna.conf. A deqna is, in this hypothetical
|
||||
// example, a pccard ethernet-like device. Students of history may
|
||||
// know other devices by this name, and will get the in-jokes in this
|
||||
// entry.
|
||||
nomatch 10 {
|
||||
match "bus" "pccard[0-9]+";
|
||||
match "manufacturer" "0x1234";
|
||||
match "product" "0x2323";
|
||||
action "kldload if_deqna";
|
||||
};
|
||||
attach 10 {
|
||||
device-name "^deqna[0-9]+";
|
||||
action "/etc/pccard_ether $device-name start";
|
||||
};
|
||||
detach 10 {
|
||||
device-name "^deqna[0-9]+";
|
||||
action "/etc/pccard_ether $device-name stop";
|
||||
};
|
133
sbin/devd/devd.conf.5
Normal file
133
sbin/devd/devd.conf.5
Normal file
@ -0,0 +1,133 @@
|
||||
.\"
|
||||
.\" Copyright (c) 2002 M. Warner Losh
|
||||
.\" All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. The name of the author may not be used to endorse or promote products
|
||||
.\" derived from this software without specific prior written permission.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.\" The section on comments was taken from named.conf.5, which has the
|
||||
.\" following copyright:
|
||||
.\" Copyright (c) 1999-2000 by Internet Software Consortium
|
||||
.\"
|
||||
.\" Permission to use, copy, modify, and distribute this software for any
|
||||
.\" purpose with or without fee is hereby granted, provided that the above
|
||||
.\" copyright notice and this permission notice appear in all copies.
|
||||
.\"
|
||||
.\" THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
|
||||
.\" ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
|
||||
.\" OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
|
||||
.\" CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
|
||||
.\" DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
||||
.\" PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
|
||||
.\" ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
.\" SOFTWARE.
|
||||
.Dd October 17, 2002
|
||||
.Dt DEVD.CONF 5
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm devd.conf
|
||||
.Nd configuration file for
|
||||
.Xr devdd 8
|
||||
.Sh OVERVIEW
|
||||
.Ss General Syntax
|
||||
A
|
||||
.Xr devd 8
|
||||
configuration consists of two general features, statements
|
||||
and comments.
|
||||
All statements end with a semicolon.
|
||||
Many statements can contain substatements, which are each also
|
||||
terminated with a semicolon.
|
||||
.Pp
|
||||
The following statements are supported:
|
||||
.Bl -tag -width 0n
|
||||
.It Ic options
|
||||
specifies various options and parameters for the operation of
|
||||
.Xr devd 8 .
|
||||
.It Ic attach
|
||||
specifies various matching criteria and actions to perform when
|
||||
a newly attached device matches said criteria.
|
||||
.It Ic detach
|
||||
specifies various matching criteria and actions to perform when
|
||||
a newly attached device matches said criteria.
|
||||
.It Ic nomatch
|
||||
specifies various matching criteria and actions to perform when
|
||||
no device driver currently loaded in the kernel claims a (new)
|
||||
device.
|
||||
.El
|
||||
.Pp
|
||||
Statements may occur in any order in the config file, and may be
|
||||
repated as often as required.
|
||||
Further details on the syntax and meaning of each statement, and their
|
||||
substatements is explained below.
|
||||
.Pp
|
||||
Comments may appear anywhere that whitespace may appear in a BIND
|
||||
configuration file. To appeal to programmers of all kinds, they can
|
||||
be written in C, C++, or shell/perl constructs.
|
||||
.Pp
|
||||
C-style comments start with the two characters
|
||||
.Li /*
|
||||
(slash, star) and end with
|
||||
.Li */
|
||||
(star, slash).
|
||||
Because they are completely delimited with these characters,
|
||||
they can be used to comment only a portion of a line or to span
|
||||
multiple lines.
|
||||
.Pp
|
||||
C-style comments cannot be nested. For example, the following is
|
||||
not valid because the entire comment ends with the first
|
||||
.Li */ :
|
||||
.Bd -literal -offset indent
|
||||
/* This is the start of a comment.
|
||||
This is still part of the comment.
|
||||
/* This is an incorrect attempt at nesting a comment. */
|
||||
This is no longer in any comment. */
|
||||
.Ed
|
||||
.Pp
|
||||
C++-style comments start with the two characters
|
||||
.Li //
|
||||
(slash, slash) and continue to the end of the physical line.
|
||||
They cannot be continued across multiple physical lines; to have
|
||||
one logical comment span multiple lines, each line must use the
|
||||
.Li //
|
||||
pair. For example:
|
||||
.Bd -literal -offset indent
|
||||
// This is the start of a comment. The next line
|
||||
// is a new comment, even though it is logically
|
||||
// part of the previous comment.
|
||||
.Ed
|
||||
.Pp
|
||||
.Em WARNING :
|
||||
you cannot use the
|
||||
.Li ;
|
||||
(semicolon) character to start a comment such as you would in a zone
|
||||
file. The semicolon indicates the end of a configuration statement,
|
||||
so whatever follows it will be interpreted as the start of the next
|
||||
statement.
|
||||
.Sh FILES
|
||||
.Bl -tag -width 0n -compact
|
||||
.It Pa /etc/devd.conf
|
||||
The
|
||||
.Nm devd
|
||||
configuration file.
|
||||
.El
|
||||
.Sh SEE ALSO
|
||||
.Xr devd 8
|
48
sbin/devd/devd.h
Normal file
48
sbin/devd/devd.h
Normal file
@ -0,0 +1,48 @@
|
||||
/*-
|
||||
* DEVD (Device action daemon)
|
||||
*
|
||||
* Copyright (c) 2002 M. Warner Losh <imp@freebsd.org>.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#include <sys/queue.h>
|
||||
|
||||
int yylex(void);
|
||||
void yyerror(const char *s);
|
||||
int yyparse(void);
|
||||
void add_directory(const char *);
|
||||
|
||||
struct file_list
|
||||
{
|
||||
char *path;
|
||||
TAILQ_ENTRY(file_list) fl_link;
|
||||
};
|
||||
|
||||
TAILQ_HEAD(file_list_head, file_list);
|
||||
|
||||
extern struct file_list_head dirlist;
|
||||
|
||||
|
137
sbin/devd/parse.y
Normal file
137
sbin/devd/parse.y
Normal file
@ -0,0 +1,137 @@
|
||||
%{
|
||||
/*-
|
||||
* DEVD (Device action daemon)
|
||||
*
|
||||
* Copyright (c) 2002 M. Warner Losh <imp@freebsd.org>.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#include "devd.h"
|
||||
#include <stdio.h>
|
||||
|
||||
%}
|
||||
|
||||
%union {
|
||||
char *str;
|
||||
int i;
|
||||
}
|
||||
|
||||
%token SEMICOLON BEGINBLOCK ENDBLOCK COMMA
|
||||
%token <i> NUMBER
|
||||
%token <str> STRING
|
||||
%token <str> ID
|
||||
%token OPTIONS SET DIRECTORY PID_FILE DEVICE_NAME ACTION MATCH
|
||||
%token ATTACH DETACH NOMATCH
|
||||
|
||||
%type <str> id
|
||||
%type <i> number
|
||||
%type <str> string
|
||||
|
||||
%%
|
||||
|
||||
config_file
|
||||
: config_list
|
||||
;
|
||||
|
||||
config_list
|
||||
: config
|
||||
| config_list config
|
||||
;
|
||||
|
||||
config
|
||||
: option_block
|
||||
| attach_block
|
||||
| detach_block
|
||||
| nomatch_block
|
||||
;
|
||||
|
||||
option_block
|
||||
: OPTIONS BEGINBLOCK options ENDBLOCK SEMICOLON
|
||||
;
|
||||
|
||||
options
|
||||
: option
|
||||
| options option
|
||||
|
||||
option
|
||||
: directory_option
|
||||
| pid_file_option
|
||||
| set_option
|
||||
;
|
||||
|
||||
directory_option
|
||||
: DIRECTORY string SEMICOLON { add_directory($2); }
|
||||
;
|
||||
|
||||
pid_file_option
|
||||
: PID_FILE string SEMICOLON
|
||||
;
|
||||
|
||||
set_option
|
||||
: SET id string SEMICOLON
|
||||
;
|
||||
|
||||
attach_block
|
||||
: ATTACH number BEGINBLOCK match_or_action_list ENDBLOCK SEMICOLON
|
||||
;
|
||||
|
||||
detach_block
|
||||
: DETACH number BEGINBLOCK match_or_action_list ENDBLOCK SEMICOLON
|
||||
;
|
||||
|
||||
nomatch_block
|
||||
: NOMATCH number BEGINBLOCK match_or_action_list ENDBLOCK SEMICOLON
|
||||
;
|
||||
|
||||
match_or_action_list
|
||||
: match_or_action
|
||||
| match_or_action_list match_or_action
|
||||
;
|
||||
|
||||
match_or_action
|
||||
: match
|
||||
| action
|
||||
;
|
||||
|
||||
match
|
||||
: MATCH string string SEMICOLON
|
||||
| DEVICE_NAME string SEMICOLON
|
||||
;
|
||||
|
||||
action
|
||||
: ACTION string SEMICOLON
|
||||
;
|
||||
|
||||
number
|
||||
: NUMBER { $$ = $1; }
|
||||
|
||||
string
|
||||
: STRING { $$ = $1; }
|
||||
|
||||
id
|
||||
: ID { $$ = $1; }
|
||||
|
||||
%%
|
89
sbin/devd/token.l
Normal file
89
sbin/devd/token.l
Normal file
@ -0,0 +1,89 @@
|
||||
%{
|
||||
/*-
|
||||
* DEVD (Device action daemon)
|
||||
*
|
||||
* Copyright (c) 2002 M. Warner Losh <imp@freebsd.org>.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <syslog.h>
|
||||
#include "devd.h"
|
||||
#include "y.tab.h"
|
||||
|
||||
int lineno = 1;
|
||||
#define YY_NO_UNPUT
|
||||
|
||||
%}
|
||||
|
||||
%%
|
||||
|
||||
[ \t]+ ;
|
||||
\n lineno++;
|
||||
; { return SEMICOLON; }
|
||||
\/\/.*$ ;
|
||||
\/\*(.|\n)*\*\/ ;
|
||||
\{ { return BEGINBLOCK; }
|
||||
\} { return ENDBLOCK; }
|
||||
[0-9]+ { yylval.i = atoi(yytext); return NUMBER; }
|
||||
\"[^"]+\" {
|
||||
int len = strlen(yytext) - 2;
|
||||
if ((yylval.str = (char *) malloc(len + 1)) == NULL)
|
||||
goto out;
|
||||
memcpy(yylval.str, yytext + 1, len);
|
||||
yylval.str[len] = '\0';
|
||||
out:;
|
||||
return STRING;
|
||||
}
|
||||
|
||||
|
||||
options { return OPTIONS; }
|
||||
set { return SET; }
|
||||
directory { return DIRECTORY; }
|
||||
pid-file { return PID_FILE; }
|
||||
attach { return ATTACH; }
|
||||
detach { return DETACH; }
|
||||
device-name { return DEVICE_NAME; }
|
||||
action { return ACTION; }
|
||||
match { return MATCH; }
|
||||
nomatch { return NOMATCH; }
|
||||
[A-Za-z][A-Za-z0-9-]* {
|
||||
int len = strlen(yytext);
|
||||
if ((yylval.str = (char *) malloc(len + 1)) == NULL)
|
||||
goto out2;
|
||||
memcpy(yylval.str, yytext + 1, len);
|
||||
yylval.str[len] = '\0';
|
||||
out2:;
|
||||
return ID;
|
||||
}
|
||||
%%
|
||||
|
||||
void
|
||||
yyerror(const char *s)
|
||||
{
|
||||
syslog(LOG_ERR, "line %d: %s%s %s.\n", lineno, yytext, yytext?":":"", s);
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user