# CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

## Project Overview

**Nefarious IRCd** is an IRC server daemon based on ircu (the Undernet IRC daemon). This is a C codebase using GNU Autotools for building. It implements the P10 protocol and includes features like:
- Asynchronous event engines (epoll on Linux, kqueue on BSD, /dev/poll on Solaris)
- Account persistence during netsplits
- Dynamic configuration via F: (feature) lines
- SSL/TLS support for server-to-server and client connections

## Build Commands

```bash
# Configure the build
./configure --enable-debug --with-maxcon=4096

# Compile
make

# Install (by default to $HOME/bin, $HOME/lib)
make install

# Clean build artifacts
make clean
```

Configuration options can be viewed with `./configure --help`. Common options:
- `--enable-debug` - Enable debugging support
- `--with-maxcon=N` - Set maximum connections (default varies by platform)
- `--prefix=PATH` - Installation prefix (default: $HOME)
- `--libdir=PATH`, `--bindir=PATH`, `--mandir=PATH` - Specific install directories

## Docker Build

Docker support is in `tools/docker/`:

```bash
# Build Docker image
docker build -t nefarious .

# The Dockerfile:
# - Uses Debian 12 base
# - Installs build dependencies and Perl modules for iauthd
# - Runs as non-root user (UID/GID 1234)
# - Configures with --enable-debug --with-maxcon=4096
# - Removes build tools after compilation to reduce image size
```

## Configuration System

Nefarious uses a hierarchical configuration file (`ircd.conf`) with block-based syntax. The configuration format is documented in `doc/example.conf`.

### Docker Configuration

For Docker deployments, the configuration uses environment variable templating:
1. Template file: `tools/docker/base.conf-dist` contains `%VARIABLE_NAME%` placeholders
2. Entry point script: `tools/docker/dockerentrypoint.sh` substitutes environment variables via sed
3. Final config is written at container startup to `base.conf`

Required environment variables (with defaults in dockerentrypoint.sh):
- `IRCD_GENERAL_NAME` - Server name (default: localhost.localdomain)
- `IRCD_GENERAL_DESCRIPTION` - Server description
- `IRCD_GENERAL_NUMERIC` - Server numeric (0-4095, must be unique on network)
- `IRCD_ADMIN_LOCATION` - Admin location info
- `IRCD_ADMIN_CONTACT` - Admin contact info

The Docker setup uses multiple config files included by main `ircd.conf`:
- `base.conf` - Generated from base.conf-dist with variable substitution
- `local.conf` - Local server-specific settings
- `linesync.conf` - Line sync configuration

## Code Architecture

### Event Engine
Nefarious uses platform-specific event engines for efficient I/O multiplexing:
- **Linux**: `engine_epoll.c` (epoll family - most efficient)
- **FreeBSD**: `engine_kqueue.c` (kqueue)
- **Solaris**: `engine_devpoll.c` (/dev/poll)
- **Fallback**: `engine_poll.c`, `engine_select.c`

The engine is selected automatically at configure time based on platform.

### Command Handlers
IRC commands are implemented in `ircd/m_*.c` files (e.g., `m_join.c`, `m_privmsg.c`, `m_mode.c`). Each file handles one or more related IRC commands using a message table registration system.

### Core Subsystems
- **Client management**: `client.c`, `IPcheck.c` - Track connected clients and IP limits
- **Channel management**: `channel.c` - Channel state, modes, membership
- **Network I/O**: `listener.c` - Accept incoming connections; engine_*.c - Event handling
- **Protocol**: `ircd_relay.c`, `m_*.c` - P10 protocol implementation
- **Features**: `ircd_features.c` - Dynamic runtime configuration (F: lines)
- **DNS resolution**: `ircd_res.c`, `ircd_reslib.c` - Asynchronous DNS
- **Authentication**: Tools include `iauthd.pl` for external authentication

### Helper Tools
Located in `tools/`:
- `iauthd.pl` - IAuth daemon for external authentication (Perl)
- `linesync/` - Git-based configuration synchronization
- `docker/` - Docker configuration and entry point
- `convert-conf` - Convert old ircd.conf format to current format (built during make)

## Documentation

All documentation is in `doc/`:
- `example.conf` - Complete configuration file example with inline documentation
- `readme.features` - Detailed feature documentation (F: lines)
- `readme.iauth` - IAuth protocol documentation
- `p10.txt`, `p10.html` - P10 protocol specification
- `modes.txt` - Channel and user modes
- Platform-specific: `freebsd.txt`, `linux-poll.patch`
- Feature-specific: `readme.gline`, `readme.zline`, `readme.shun`, `readme.who`

## Important Notes

- Server numeric must be unique on the network and cannot be changed without restart
- Time synchronization via NTP is critical - clock skew causes serious issues
- The codebase is designed for high-performance with thousands of simultaneous connections
- SSL certificates are auto-generated by dockerentrypoint.sh if not present (ircd.pem)
