# Frogger 🐸
Simple file system implementation using the 9P protocol
## Bind
The P9 protocol for file systems requires a unique feature called `bind`, which allows for flexible control over the namespace
(file hierarchy). The bind operation maps a file, directory, or another namespace tree into a new location in the namespace.
It supports three binding modes: Before, After, and Replace. Each mode provides different behaviors for resolving file
lookups when multiple resources are mapped to the same namespace.
### Replace Binding: `frg bind src mountpoint`
This mode replaces whatever was previously mounted at the mountpoint with the src. Only the new src is visible at the specified
mountpoint.
- **Behavior**: The `src` completely overrides any existing content at the `mountpoint`.
- **Example use cases**:
- Temporarily replacing a default configuration directory with a test or alternative version
```shell
frg bind /test/config /etc
```
After this, processes see `/test/config` contents instead of the original `/etc`.
- Redirecting access to `/bin` to a custom toolchain directory for development:
```shell
frg bind /custom/tools/bin /bin
```
### Before binding `frg bind -b src mountpoint`
In this mode the `src` is placed *before* the existing contents of the mountpoint. When a lookup occurs,
a Plan9 file system searches `src` first, and if the file isn't found there, it searches the original `mountpoint`.
- **Behavior**: Adds `src` at a higher priority, leaving the existing content accessible as a fallback.
- **Use case**:
- Overlaying new tools or files over existing directories without completely replacing them. For example,
adding custom binaries that take precedence over system binaries:
```shell
frg bind -b /custom/bin /bin
```
In this case, `/custom/bin/ls` will be used instead of `/bin/ls` if both exist.
- **Example**: Temporarily prioritizing a new set of libraries or data over the default paths for testing or debugging.
### After binding `frg bind -a src mountpoint`
This mode appends the `src` to the `mountpoint`'s search path. Plan 9 resolves lookups by searching the original
`mountpoint` first, and if the file isn't found there, it checks the `src`.
- **Behavior**: Adds `src` as a fallback while maintaining the existing content's priority.
- **Use case**:
- Adding extra directories to extend a namespace without interfering with its current operation. For example, appending a directory with additional fonts:
```shell
frg bind -a /extra/fonts /fonts
```
Here, `/fonts` will use default system fonts first and fall back to `/extra/fonts` if needed.
- **Example**: Supplementing a default configuration directory with additional files:
```shell
frg bind -a /additional/config /etc
```
This ensures `/etc` retains its default behavior but gains the additional configuration files if the defaults don’t exist.
### Union directories
Using `frg bind -b` and `frg bind -a`, you can create union directories where files from multiple sources appear merged.
For example:
```shell
frg bind -b /local/bin /bin
frg bind -a /backup/bin /bin
```
This setup prioritizes `/local/bin`, followed by `/bin`, and finally `/backup/bin`.
### Custom environments
For isolating environments, such as creating chroot-like environments or managing per-process views of namespaces.