README.md

<!--
SPDX-FileCopyrightText: 2025 Łukasz Niemier <~@hauleth.dev>

SPDX-License-Identifier: Apache-2.0
-->

# e9p

Implementation of [9p2000][] file protocol in Erlang

## Goals

- [x] Message parsing
- [ ] Client implementation
    + [ ] Establishing connection
    + [ ] Tree walking
    + [ ] IO server implementation for reading/writing files
    + [ ] File/directory creation
    + [ ] File/directory deletion
    + [ ] File stats
- [ ] Server implementation
    + [x] Establishing connection
    + [x] Tree walking
    + [x] File/directory creation
    + [x] File/directory deletion
    + [x] File stats
    + [x] Customisable FS implementations

### Example FS

- [x] UnixFs - which will simply allow accessing some "real" directory in
  system FS. **WIP**: Implemented directory traversal, file
  writing/reading/deletion, but so far no file nor directory creation.
- [x] ErlProcFS - which will expose Erlang process tree and other internal data
  via API similar to `procfs` from Linux. Read-only for the time of being.

## Reasoning

I want to implement `procfs`-like API for Erlang to allow non-Erlang-fluent
operators to navigate through Erlang processes. There is something similar
implemented in [`fuserl`][fuserl], but that uses [`libfuse`][libfuse], which is
[NIF][] implemented. That requires compilation of native code and can be
problematic wrt cross compilation and stuff. On the other hand [9p2000][] is
network protocol that can be implemented fully in Erlang, thus do not require
any additional tools or compilation steps. It can also be accessed remotely if
needed.

[9p2000]: http://ericvh.github.io/9p-rfc/rfc9p2000.html
[fuserl]: https://github.com/tonyrog/fuserl
[libfuse]: https://github.com/libfuse/libfuse
[NIF]: https://www.erlang.org/doc/system/nif.html#

## License

Apache-2.0 with exception to PropEr tests which are GPL-3.0-only. This do not
affect possibility to run this project as dependency of non-GPL projects, as GPL
code is not used in runtime. Unfortunately that workaround is needed due to
PropEr licensing.