4 * Copyright (C) 2004 Greg Kroah-Hartman <greg@kroah.com>
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation version 2 of the License.
10 * Based on the klibc version of hotplug written by:
11 * Author(s) Christian Borntraeger <cborntra@de.ibm.com>
12 * which was based on the shell script written by:
13 * Greg Kroah-Hartman <greg@kroah.com>
18 * This essentially emulates the following shell script logic in C:
20 export DEVNODE="whatever_dev_name_udev_just_gave"
21 for I in "${DIR}/$DEVNODE/"*.dev "${DIR}/$1/"*.dev "${DIR}/default/"*.dev ; do
22 if [ -f $I ]; then $I $1 ; fi
31 #include <sys/types.h>
38 #define HOTPLUGDIR "/etc/dev.d"
40 #define COMMENT_PREFIX '#'
42 static void run_program(char *name)
46 dbg("running %s", name);
60 execv(name, main_argv);
64 static void execute_dir (char *dirname)
68 char filename[NAME_SIZE];
71 dbg("opening %s", dirname);
72 directory = opendir(dirname);
76 while ((entry = readdir(directory))) {
77 if (entry->d_name[0] == '\0')
79 /* Don't run the files '.', '..', or hidden files,
80 * or files that start with a '#' */
81 if ((entry->d_name[0] == '.') ||
82 (entry->d_name[0] == COMMENT_PREFIX))
85 /* Nor do we run files that do not end in ".dev" */
86 name_len = strlen(entry->d_name);
87 if (name_len < strlen(SUFFIX))
89 if (strcmp(&entry->d_name[name_len - sizeof (SUFFIX) + 1], SUFFIX) != 0)
92 /* FIXME - need to use file_list_insert() here to run these in sorted order... */
93 snprintf(filename, sizeof(filename), "%s%s", dirname, entry->d_name);
94 filename[sizeof(filename)-1] = '\0';
95 run_program(filename);
101 /* runs files in these directories in order:
106 void dev_d_send(struct udevice *dev, char *subsystem)
109 char devnode[NAME_SIZE];
111 strfieldcpy(devnode, udev_root);
112 strfieldcat(devnode, dev->name);
113 setenv("DEVNODE", devnode, 1);
115 snprintf(dirname, sizeof(dirname), HOTPLUGDIR "/%s/", dev->name);
116 dirname[sizeof(dirname)-1] = '\0';
117 execute_dir(dirname);
119 snprintf(dirname, sizeof(dirname), HOTPLUGDIR "/%s/", subsystem);
120 dirname[sizeof(dirname)-1] = '\0';
121 execute_dir(dirname);
123 strcpy(dirname, HOTPLUGDIR "/default/");
124 execute_dir(dirname);