# FS Config Generator

The `fs_config_generator.py` tool uses the platform `android_filesystem_config.h` and the
`TARGET_FS_CONFIG_GEN` files to generate the following:
* `fs_config_dirs` and `fs_config_files` files for each partition
* `passwd` and `group` files for each partition
* The `generated_oem_aid.h` header

## Outputs

### `fs_config_dirs` and `fs_config_files`

The `fs_config_dirs` and `fs_config_files` binary files are interpreted by the libcutils
`fs_config()` function, along with the built-in defaults, to serve as overrides to complete the
results. The Target files are used by filesystem and adb tools to ensure that the file and directory
properties are preserved during runtime operations. The host files in the `$OUT` directory are used
in the final stages when building the filesystem images to set the file and directory properties.

See `./fs_config_generator.py fsconfig --help` for how these files are generated.

### `passwd` and `group` files

The `passwd` and `group` files are formatted as documented in man pages passwd(5) and group(5) and
used by bionic for implementing `getpwnam()` and related functions.

See `./fs_config_generator.py passwd --help` and `./fs_config_generator.py group --help` for how
these files are generated.

### The `generated_oem_aid.h` header

The `generated_oem_aid.h` creates identifiers for non-platform AIDs for developers wishing to use
them in their native code.  To do so, include the `oemaids_headers` header library in the
corresponding makefile and `#include "generated_oem_aid.h"` in the code wishing to use these
identifiers.

See `./fs_config_generator.py oemaid --help` for how this file is generated.

## Parsing

See the documentation on [source.android.com](https://source.android.com/devices/tech/config/filesystem#configuring-aids) for details and examples.


## Ordering

Ordering within the `TARGET_FS_CONFIG_GEN` files is not relevant. The paths for files are sorted
like so within their respective array definition:
 * specified path before prefix match
   * for example: foo before f*
 * lexicographical less than before other
   * for example: boo before foo

Given these paths:

    paths=['ac', 'a', 'acd', 'an', 'a*', 'aa', 'ac*']

The sort order would be:

    paths=['a', 'aa', 'ac', 'acd', 'an', 'ac*', 'a*']

Thus the `fs_config` tools will match on specified paths before attempting prefix, and match on the
longest matching prefix.

The declared AIDs are sorted in ascending numerical order based on the option "value". The string
representation of value is preserved. Both choices were made for maximum readability of the
generated file and to line up files. Sync lines are placed with the source file as comments in the
generated header file.

## Unit Tests

From within the `fs_config` directory, unit tests can be executed like so:

    $ python -m unittest test_fs_config_generator.Tests
    .............
    ----------------------------------------------------------------------
    Ran 13 tests in 0.004s

    OK

One could also use nose if they would like:

    $ nose2

To add new tests, simply add a `test_<xxx>` method to the test class. It will automatically
get picked up and added to the test suite.
