buildroot/docs/manual/makedev-syntax.adoc
Yann E. MORIN 738fb6dfa4 docs/manual: extend makedev syntax section
The section of the manual describing the makedev syntax is not
up-to-date with the current features, and does not properly describe
existing ones.

  - extend the list of types with the requirements on the existence of
    the target file or directory; for 'c', 'b', and 'p', the existence
    requirement is inherited from mknod(2):

    ERRORS
        ...
        ENOENT A directory component in pathname does not exist or is a
               dangling symbolic link.

    for the other types, the existence requirements are extracted from
    the source of makedev.c;

  - format the types flags, so they are rendered in monospace;

  - extend the 'mode' description, as it can be set to -1 for 'f', 'd',
    or 'r', so that only the uid and gid are set. This is most useful
    for 'r', where setting the same mode recursively for all the
    sub-directories and files alike does not really make sense; indeed
    in this case, the modes are usually set correctly when the package
    (or rootfs overlay) installs the files, and only the uid and gid are
    interesting to set;

  - extend and update the examples to show-case the -1 mode use-case.

Signed-off-by: Yann E. MORIN <yann.morin@orange.com>
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
2024-02-06 11:52:09 +01:00

109 lines
3.7 KiB
Plaintext

// -*- mode:doc; -*-
// vim: set syntax=asciidoc:
[[makedev-syntax]]
== Makedev syntax documentation
The makedev syntax is used in several places in Buildroot to
define changes to be made for permissions, or which device files to
create and how to create them, in order to avoid calls to mknod.
This syntax is derived from the makedev utility, and more complete
documentation can be found in the +package/makedevs/README+ file.
It takes the form of a space separated list of fields, one file per
line; the fields are:
|===========================================================
|name |type |mode |uid |gid |major |minor |start |inc |count
|===========================================================
There are a few non-trivial blocks:
- +name+ is the path to the file you want to create/modify
- +type+ is the type of the file, being one of:
* `f`: a regular file, which must already exist
* `F`: a regular file, which is ignored and not created if missing
* `d`: a directory, which is created, as well as its parents, if missing
* `r`: a directory recursively, which must already exist
* `c`: a character device file, which parent directory must exist
* `b`: a block device file, which parent directory must exist
* `p`: a named pipe, which parent directory must exist
- +mode+ are the usual permissions settings (only numerical values
are allowed);
for type `d`, the mode of existing parents is not changed, but the mode
of created parents is set;
for types `f`, `F`, and `r`, +mode+ can also be set to +-1+ to not
change the mode (and only change uid and gid)
- +uid+ and +gid+ are the UID and GID to set on this file; can be
either numerical values or actual names
- +major+ and +minor+ are here for device files, set to +-+ for other
files
- +start+, +inc+ and +count+ are for when you want to create a batch
of files, and can be reduced to a loop, beginning at +start+,
incrementing its counter by +inc+ until it reaches +count+
Let's say you want to change the ownership and permissions of a given
file; using this syntax, you will need to write:
----
/usr/bin/foo f 755 0 0 - - - - -
/usr/bin/bar f 755 root root - - - - -
/data/buz f 644 buz-user buz-group - - - - -
/data/baz f -1 baz-user baz-group - - - - -
----
Alternatively, if you want to change owner of a directory recursively,
you can write (to set UID to `foo` and GID to `bar` for the directory
`/usr/share/myapp` and all files and directories below it):
----
/usr/share/myapp r -1 foo bar - - - - -
----
On the other hand, if you want to create the device file +/dev/hda+
and the corresponding 15 files for the partitions, you will need for
+/dev/hda+:
----
/dev/hda b 640 root root 3 0 0 0 -
----
and then for device files corresponding to the partitions of
+/dev/hda+, +/dev/hdaX+, +X+ ranging from 1 to 15:
----
/dev/hda b 640 root root 3 1 1 1 15
----
Extended attributes are supported if
+BR2_ROOTFS_DEVICE_TABLE_SUPPORTS_EXTENDED_ATTRIBUTES+ is enabled.
This is done by adding a line starting with +|xattr+ after
the line describing the file. Right now, only capability
is supported as extended attribute.
|=====================
| \|xattr | capability
|=====================
- +|xattr+ is a "flag" that indicate an extended attribute
- +capability+ is a capability to add to the previous file
If you want to add the capability cap_sys_admin to the binary foo,
you will write :
----
/usr/bin/foo f 755 root root - - - - -
|xattr cap_sys_admin+eip
----
You can add several capabilities to a file by using several +|xattr+ lines.
If you want to add the capability cap_sys_admin and cap_net_admin to the
binary foo, you will write :
----
/usr/bin/foo f 755 root root - - - - -
|xattr cap_sys_admin+eip
|xattr cap_net_admin+eip
----