4.8 KiB
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
# 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/:
# 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:
- Template file:
tools/docker/base.conf-distcontains%VARIABLE_NAME%placeholders - Entry point script:
tools/docker/dockerentrypoint.shsubstitutes environment variables via sed - 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 descriptionIRCD_GENERAL_NUMERIC- Server numeric (0-4095, must be unique on network)IRCD_ADMIN_LOCATION- Admin location infoIRCD_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 substitutionlocal.conf- Local server-specific settingslinesync.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.plfor external authentication
Helper Tools
Located in tools/:
iauthd.pl- IAuth daemon for external authentication (Perl)linesync/- Git-based configuration synchronizationdocker/- Docker configuration and entry pointconvert-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 documentationreadme.features- Detailed feature documentation (F: lines)readme.iauth- IAuth protocol documentationp10.txt,p10.html- P10 protocol specificationmodes.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)