mdev: add large comment, fix a buglet with subsystem and /sys/block
This commit is contained in:
parent
184f4ff432
commit
5ff9629b8f
@ -10,6 +10,41 @@
|
||||
#include "libbb.h"
|
||||
#include "xregex.h"
|
||||
|
||||
/* "mdev -s" scans /sys/class/xxx, looking for directories which have dev
|
||||
* file (it is of the form "M:m\n"). Example: /sys/class/tty/tty0/dev
|
||||
* contains "4:0\n". Directory name is taken as device name, path component
|
||||
* directly after /sys/class/ as subsystem. In this example, "tty0" and "tty".
|
||||
* Then mdev creates the /dev/device_name node.
|
||||
*
|
||||
* mdev w/o parameters is called as hotplug helper. It takes device
|
||||
* and subsystem names from $DEVPATH and $SUBSYSTEM, extracts
|
||||
* maj,min from "/sys/$DEVPATH/dev" and also examines
|
||||
* $ACTION ("add"/"delete") and $FIRMWARE.
|
||||
*
|
||||
* If action is "add", mdev creates /dev/device_name similarly to mdev -s.
|
||||
* (todo: explain "delete" and $FIRMWARE)
|
||||
*
|
||||
* If /etc/mdev.conf exists, it may modify /dev/device_name's properties.
|
||||
* /etc/mdev.conf file format:
|
||||
*
|
||||
* [-][subsystem/]device user:grp mode [>|=path] [@|$|*command args...]
|
||||
* [-]@maj,min[-min2] user:grp mode [>|=path] [@|$|*command args...]
|
||||
*
|
||||
* The device name or "subsystem/device" combo is matched against 1st field
|
||||
* (which is a regex), or maj,min is matched against 1st field.
|
||||
*
|
||||
* Leading minus in 1st field means "don't stop on this line", otherwise
|
||||
* search is stopped after the matching line is encountered.
|
||||
*
|
||||
* When line matches, the device node is created, chmod'ed and chown'ed.
|
||||
* Then it moved to path, and if >path, a symlink to moved node is created
|
||||
* Examples:
|
||||
* =loop/ - moves to /dev/loop
|
||||
* >disk/sda%1 - moves to /dev/disk/sdaN, makes /dev/sdaN a symlink
|
||||
* Then "command args" is executed (via sh -c 'command args').
|
||||
* @:execute on creation, $:on deletion, *:on both.
|
||||
*/
|
||||
|
||||
struct globals {
|
||||
int root_major, root_minor;
|
||||
char *subsystem;
|
||||
@ -96,8 +131,11 @@ static void make_device(char *path, int delete)
|
||||
if (strstr(path, "/block/"))
|
||||
type = S_IFBLK;
|
||||
|
||||
/* Make path point to subsystem/device_name */
|
||||
path += sizeof("/sys/class/") - 1;
|
||||
/* Make path point to "subsystem/device_name" */
|
||||
if (path[5] == 'b') /* legacy /sys/block? */
|
||||
path += sizeof("/sys/") - 1;
|
||||
else
|
||||
path += sizeof("/sys/class/") - 1;
|
||||
|
||||
#if !ENABLE_FEATURE_MDEV_CONF
|
||||
mode = 0660;
|
||||
@ -131,8 +169,8 @@ static void make_device(char *path, int delete)
|
||||
keep_matching = ('-' == val[0]);
|
||||
val += keep_matching; /* swallow leading dash */
|
||||
|
||||
/* Match against either subsystem/device_name
|
||||
* or device_name alone */
|
||||
/* Match against either "subsystem/device_name"
|
||||
* or "device_name" alone */
|
||||
name = strchr(val, '/') ? path : (char *) device_name;
|
||||
|
||||
/* Fields: regex uid:gid mode [alias] [cmd] */
|
||||
|
Loading…
Reference in New Issue
Block a user