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 "libbb.h"
|
||||||
#include "xregex.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 {
|
struct globals {
|
||||||
int root_major, root_minor;
|
int root_major, root_minor;
|
||||||
char *subsystem;
|
char *subsystem;
|
||||||
@ -96,8 +131,11 @@ static void make_device(char *path, int delete)
|
|||||||
if (strstr(path, "/block/"))
|
if (strstr(path, "/block/"))
|
||||||
type = S_IFBLK;
|
type = S_IFBLK;
|
||||||
|
|
||||||
/* Make path point to subsystem/device_name */
|
/* Make path point to "subsystem/device_name" */
|
||||||
path += sizeof("/sys/class/") - 1;
|
if (path[5] == 'b') /* legacy /sys/block? */
|
||||||
|
path += sizeof("/sys/") - 1;
|
||||||
|
else
|
||||||
|
path += sizeof("/sys/class/") - 1;
|
||||||
|
|
||||||
#if !ENABLE_FEATURE_MDEV_CONF
|
#if !ENABLE_FEATURE_MDEV_CONF
|
||||||
mode = 0660;
|
mode = 0660;
|
||||||
@ -131,8 +169,8 @@ static void make_device(char *path, int delete)
|
|||||||
keep_matching = ('-' == val[0]);
|
keep_matching = ('-' == val[0]);
|
||||||
val += keep_matching; /* swallow leading dash */
|
val += keep_matching; /* swallow leading dash */
|
||||||
|
|
||||||
/* Match against either subsystem/device_name
|
/* Match against either "subsystem/device_name"
|
||||||
* or device_name alone */
|
* or "device_name" alone */
|
||||||
name = strchr(val, '/') ? path : (char *) device_name;
|
name = strchr(val, '/') ? path : (char *) device_name;
|
||||||
|
|
||||||
/* Fields: regex uid:gid mode [alias] [cmd] */
|
/* Fields: regex uid:gid mode [alias] [cmd] */
|
||||||
|
Loading…
Reference in New Issue
Block a user