ministat's Cousin You Missed: rasm2 — The Radare2 Assembler/Disassembler That Fits in a Pipe

Wait — let me pick something that fits the "one specific tool, deep dive" mold better, and that hasn't been covered.

ifne's Forgotten Sibling: errno — Look Up Any System Error Code Without Grepping /usr/include

2026-08-18

You've been there. A log file says failed: error 24. Or a strace trace ends in -1 ENOTRECOVERABLE. Or some Go program panics with errno 107. Your options have historically been:

All of these are a joke because Ubuntu, Debian, Fedora, Arch, and even Alpine ship a tiny purpose-built tool called errno in the moreutils' quieter cousin: the moreutils package on some distros, and the standalone errno binary from libexplain/moreutils on others. On most distros you get it from the moreutils or libc-bin package — check which errno.

Basic use — a number, a name, or a search:

$ errno 24
EMFILE 24 Too many open files

$ errno ENOSPC
ENOSPC 28 No space left on device

$ errno -s "connection"
ECONNABORTED  103  Software caused connection abort
ECONNRESET    104  Connection reset by peer
ENOTCONN      107  Transport endpoint is not connected
ECONNREFUSED  111  Connection refused

That -s is the killer feature. You remember it was something-connection-something and you get the full list ranked and ready to paste into your bug report.

List everything the C library knows about:

$ errno -l | head
EPERM     1  Operation not permitted
ENOENT    2  No such file or directory
ESRCH     3  No such process
EINTR     4  Interrupted system call
EIO       5  Input/output error
...
$ errno -l | wc -l
133

133 errnos on my glibc box. Try naming them from memory. I'll wait.

Where it earns its keep — pipelines:

Say you're grinding through an strace log looking for every distinct failure:

$ grep -oE '= -1 E[A-Z]+' strace.log | sort -u | \
    awk '{print $3}' | xargs -n1 errno
EACCES    13  Permission denied
EAGAIN    11  Resource temporarily unavailable
EBADF      9  Bad file descriptor
ENOENT     2  No such file or directory

Or from a Go/Rust binary that only prints the number:

$ ./myserver 2>&1 | grep -oE 'errno [0-9]+' | awk '{print $2}' | \
    sort -u | xargs -I{} errno {}

Cross-platform gotcha it quietly handles: errno numbers aren't portable. EDEADLK is 35 on Linux, 11 on FreeBSD, 78 on macOS. The errno tool reads the actual headers on the box it's running on, so you get the truth for this kernel and libc — not whatever your muscle memory from a 2011 Solaris job thinks.

Why not just strerror? Because strerror(24) gives you the human string but drops the symbolic name — and the symbolic name is what you paste into code, into a grep, or into a Stack Overflow search. errno gives you all three columns in one shot, and it does reverse lookup and substring search, which no libc function exposes at all.

It's 40 KB. It's been on every Linux box you've ever SSH'd into. And it saves ninety seconds every single time you see a naked integer next to a failed syscall.

Key Takeaway: When a program hands you a bare errno number or a mystery EFOO, errno 24 / errno -s connection beats grepping headers, writing C, or launching Python — and it reads the current system's real values, so it doesn't lie about non-portable codes.

All newsletters