// -*- 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
  * d: a directory
  * r: a directory recursively
  * c: a character device file
  * b: a block device file
  * p: a named pipe
- +mode+ are the usual permissions settings (only numerical values
  are allowed)
- +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 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 - - - - -
----

Alternatively, if you want to change owner/permission of a directory
recursively, you can write (to set UID to foo, GID to bar and access
rights to rwxr-x--- for the directory /usr/share/myapp and all files
and directories below it):

----
/usr/share/myapp r 750 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
----
