#!/bin/bash # Copyright (c) 2023 Rodrigo Arias Mallo # SPDX-License-Identifier: GPL-3.0-or-later IFS= read -d '>' auth # Ignore auth IFS= read -d '>' cmd case "$cmd" in "\n" printf "Content-type: text/plain\r\n\r\n" $manpage="$1" $apropos="$2" if [ -z "$1" ]; then echo "Not found" exit 0 fi echo "Manual page not found: $1" if [ -n "$apropos" ]; then printf "\nRelated pages:\n" man -k "$apropos" fi } inject_css() { css=$(cat "$(dirname $(readlink -f $0))/style.css" | tr '\n' ' ') sed "s__$css\n_" } link_xrefs() { # Link references to other pages to a man:xyz link # mandoc(1) sed 's_\([^<]*\)_\1_g' | # bzip2(1) sed 's_\([^<]*\)(\([0-9][^)]*\))_\1(\2)_g' | # nroff(1) sed 's_\([^<]*\)(\([0-9][^)]*\))_\1(\2)_g' } serve_manpage() { url="$1" ref="${url#"man:"}" # Reverse open(3) -> 3 open if given manpage=$(echo "$ref" | sed 's/\(.*\)(\(.*\))/\2 \1/') # If page not found, return 404 if [ -z "$manpage" ]; then serve_404 exit 0 fi if ! man -w $manpage 2>/dev/null; then apropos=$(echo "$ref" | sed 's/(.*)//') serve_404 "$manpage" "$apropos" else printf "\n" printf "Content-type: text/html\r\n\r\n" man -T html $manpage | inject_css | link_xrefs 2>&1 fi } case "$url" in man:*) serve_manpage "$url";; *) serve_404;; esac