资源简介
udev是一种工具,它能够根据系统中的硬件设备的状态动态更新设备文件,包括设备文件的创建,删除等。设备文件通常放在/dev目录下。使用udev后,在/dev目录下就只包含系统中真正存在的设备。
代码片段和文件信息
/*
* Copyright (C) 2003-2004 Greg Kroah-Hartman
* Copyright (C) 2004-2006 Kay Sievers
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation version 2 of the License.
*
* This program is distributed in the hope that it will be useful but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not write to the Free Software Foundation Inc.
* 51 Franklin Street Fifth Floor Boston MA 02110-1301 USA.
*
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include “udev.h“
#include “udev_rules.h“
#include “udev_selinux.h“
#ifdef USE_LOG
void log_message(int priority const char *format ...)
{
va_list args;
if (priority > udev_log_priority)
return;
va_start(args format);
vsyslog(priority format args);
va_end(args);
}
#endif
static void asmlinkage sig_handler(int signum)
{
switch (signum) {
case SIGALRM:
exit(1);
case SIGINT:
case SIGTERM:
exit(20 + signum);
}
}
int main(int argc char *argv[] char *envp[])
{
struct sysfs_device *dev;
struct udevice *udev;
const char *maj *min;
struct udev_rules rules;
const char *action;
const char *devpath;
const char *subsystem;
struct sigaction act;
int devnull;
int retval = -EINVAL;
if (argc == 2 && strcmp(argv[1] “-V“) == 0) {
printf(“%s\n“ UDEV_VERSION);
exit(0);
}
/* set std fd‘s to /dev/null /sbin/hotplug forks us we don‘t have them at all */
devnull = open(“/dev/null“ O_RDWR);
if (devnull >= 0) {
if (devnull != STDIN_FILENO)
dup2(devnull STDIN_FILENO);
if (devnull != STDOUT_FILENO)
dup2(devnull STDOUT_FILENO);
if (devnull != STDERR_FILENO)
dup2(devnull STDERR_FILENO);
if (devnull > STDERR_FILENO)
close(devnull);
}
logging_init(“udev“);
if (devnull < 0)
err(“open /dev/null failed: %s“ strerror(errno));
udev_config_init();
selinux_init();
dbg(“version %s“ UDEV_VERSION);
/* set signal handlers */
memset(&act 0x00 sizeof(act));
act.sa_handler = (void (*)(int)) sig_handler;
sigemptyset (&act.sa_mask);
act.sa_flags = 0;
sigaction(SIGALRM &act NULL);
sigaction(SIGINT &act NULL);
sigaction(SIGTERM &act NULL);
/* trigger timeout to prevent hanging processes */
alarm(UDEV_ALARM_TIMEOUT);
action = getenv(“ACTION“);
devpath = getenv(“DEVPATH“);
subsystem = getenv(“SUBSYSTEM“);
/* older kernels passed the SUBSYSTEM only as argument */
if (subsystem == NULL && argc == 2)
subsystem = argv[1];
if (action == NULL || subsystem == NULL || devpath == NULL) {
err(“ac
评论
共有 条评论