rasm2 — The Radare2 Assembler/Disassembler That Fits in a Pipeifne's Forgotten Sibling: errno — Look Up Any System Error Code Without Grepping /usr/include2026-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:
grep -r 'define E' /usr/include — slow, noisy, wrong on musl systemsstrerroros.strerror(24)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.
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.
