Make editors slightly moist


Happiness comes out of contentment, and contentment always comes out of service.
--Harbhajan Singh Yogi

There is no easy walk to freedom anywhere, and many of us will have to pass through the valley of the shadow of death again and again before we reach the mountaintop of our desires.
--Nelson Mandela

There are no happy endings in history, only crisis points that pass.
--Isaac Asimov

From me to you

My download area is accessible via HTTPS/HTTP at It provides -latest symbolic links, e.g., s-web42-latest.tar.gz.asc. The git(1) repositories are hosted via HTTPS and HTTP at; To clone, replace /cgit/ with /scm/, as in (You could wait five minutes after reading this before cloning from scratch.) Most projects are mirrored for free under my account at, and some are also available under the nice and clean interface of repo.or.czthank you! uses the GNU Mailman mailing-list manager, so users can manage their settings either via web browser by going to, or by sending a mail with only the content help to A receive-only very low-volume announcement list covering all my projects is S-announce at lists dot sdaoden dot eu.

S - n a i l (later S - m a i l x) — v14.9.11 (“Tit family enjoying a bath”), 2018-08-08
Announcement  <>  .tar.xz / .tar.xz.asc  <>  .tar.gz / .tar.gz.asc
ML s-mailx@ with archive (also at The Mail Archive, and via gmane.mail.s-mailx.general, thanks!)
Repository{cgit,scm}/s-nail.git, branches [master,stable/{stable,latest},release/{stable,latest},(timeline),(unix-mail),(bsd-Mail),(next)]
Commit logs of [master,stable/*,release/*] are posted to s-mailx-commit@
Repository mirror:

S-nail provides a simple and friendly environment for sending and receiving mail. It is intended to provide the functionality of the POSIX mailx(1) (Wikipedia) command, but is MIME capable and optionally offers extensions for line editing, S/MIME, SMTP and POP3, among others. It divides incoming mail into its constituent messages and allows the user to deal with them in any order. S-mailx heraldic animal It offers many COMMANDS and INTERNAL VARIABLES for manipulating messages and sending mail. It provides the user simple editing capabilities to ease the composition of outgoing messages, as well as providing the ability to define and send to names which address groups of users, and increasingly powerful and reliable non-interactive scripting capabilities. ... read the complete manual.

S-nail ships with archlinux (Wiki) and KaOS. I am happy and prowd that “Fossies” — the Fresh Open Source Software Archive included S-nail in its software collection that sails so close to the wind! Packages or recipes are available for Alpine Linux, Crux, Debian and deriviates, macOS (via Homebrew), OpenBSD, and Slackware. Not necessarily up-to-date versions can be obtained for or from AUR (s-nail-git), Funtoo, and The Void (Linux) distribution. The goal of this project is to provide an efficient and standard compliant implementation on 2020-03-25, the 42nd birthday of the Berkeley Mail codebase, and then start loitering (maybe). It is based upon the BSD Mail fork Heirloom mailx, formerly known as nail.

There are no prerequisites but a normal Unix environment (make(1), an ISO C89 C compiler etc.) and it is also possible to work directly with a repository checkout. The repository layout has been extended after release v14.8.10, and is documented in the projects README file. Users which are only interested in stable changes, but which do not want to wait for releases to gain, e.g., bugfix commits, should probably track only the [stable/stable] branch. Users which also accept backward incompatible changes can track [master], it will eventually be used to create new major or minor releases. To clone the entire repository and locally select what you want, do

 $ git clone
 $ cd s-nail
 $ git checkout master
 $ make CONFIG=MAXIMAL all

It is possible to save a quite a bit of disk space. With a newer git(1) you can say

 $ git clone --single-branch -b stable/stable \

But even otherwise you can be selective:

 $ mkdir s-nail.git
 $ cd s-nail.git
 $ git init
 $ git remote add origin -t stable/stable -t 'release/*' -t timeline \
 $ git fetch -v
m d o c m x — v2, 2015-05-12
Code is part of S-roff
groff(1) enhancement request:

The mdoc(7) manual semantic markup language does not support any kind of anchoring: whereas you can exactly state what x is whenever you refer to it – variable, function etc. –, you have no option to define the exact place where x is itself defined, or whether it is at all defined in a given manual page.

Also, whereas mdoc(7) does support differentiation in between anchors and references for headlines (.Sh / .Ss and .Sx, respectively), referencing a headline is only of notational interest, the reference is in no way “active”, never.

mdocmx(7) extends mdoc(7) by adding all the missing functionality and more, including (dependent on the output device) referencable external manuals, with a single new multiplexer command: .Mx (read the manual page).

And because non-multipass troff(1) implementations are not capable to generate forward references to anchors not yet defined there is a preprocessor necessary to circumvent this problem: mdocmx(1), implemented in portable sh(1) and awk(1). (A nice property of mdocmx(7) is that it “knows” whether a document has been preprocessed or not, therefore making it possible to distribute preprocessed manuals and still being backward- and forward-compatible.)

For extended user control all parts of the usual manual pipeline require the environment variable MDOCMX_ENABLE=1 to be set to a non-empty value (it must be non-empty because of groff(1) deficiencies). E.g., on a system where groff(1) as well as less(1) have been patched to support mdocmx(7), the following shell functions could be used to read mdoc(7) manuals directly (use ^A, i.e., control-A in less(1) to jump to anchors or read external manuals):

 mdoc() { (
   : ${MDOCMXFLAGS:=-dmx-toc-force=tree} "${1}" |
   groff -Tutf8 -mdoc ${MDOCMXFLAGS} |
   LESS= less --RAW-CONTROL-CHARS --ignore-case --no-init
 ) }

How does it work?

For output devices like HTML or PDF mdocmx(7) will use the corresponding and well-known support troff(1) macro packages to generate anchor and reference information.

For the TTY output device (grotty(1) in groff(1)) it will inject context information (anchor?, link? and their name) directly via a new troff(1) \X'' command; The TTY output device therefore needs to be extended in order to understand this new command. The context information will then be written to the PAGER as backspace-escaped text — since on Unix backspace-escaped sequences are used to create manual page style formatting information (bold text, text underlining, etc.) since decades, most tested pagers are able to silently ignore those sequences. (Despite the fact that “backspace” is the control character to delete the character before it.)

If the Pager has been extended to actually interpret the backspace-escaped sequences as anchor and reference context information, it can use its normal search facilities to search for anchors and could also offer the possibility to startup man(1) to follow external manual page references.

Note that due to the way that mdoc(7) is implemented section and subsection headers may not contain macro recursions. Please see the referenced groff(1) enhancement request for more on this; the next mdocmx(7) iteration will generate warnings for such use cases (at least in the preprocess); just as stated in the enhancement request mdoc(7) itself has to be rewritten in order to overcome this restriction.

S - r o f f — working on it
Repository{cgit,scm}/s-roff.git, branches [master,stable/{stable,latest},release/{stable,latest},(next)]
Commit logs of [master,stable/*,release/*] s-roff-commit@
Repository mirror:

S-roff is a text processor that formats text. It accepts lines of text interspersed with lines of format control information and formats the text into a printable, paginated document having a user-designed style. S-roff offers unusual freedom in document styling: arbitrary style headers and footers; arbitrary style footnotes; multiple automatic sequence numbering for paragraphs, sections, etc; multiple column output; dynamic font and point-size control; arbitrary horizontal and vertical local motions at any point; and a family of automatic overstriking, bracket construction, and line-drawing functions.

S-roff is a fork of groff(1), stripped-down to not include any related facility, the output devices grolj4 and grolbp as well as most contributed packages. The fork happened on the last commit that is still GPL2 licensed (1.19.2-574-gecbf4f1), but almost all changes up to and including v1.22.3 are included, as well as further bug reports.

The plan is to make it UTF-8 clean all through the toolchain, to make it more user friendly, e.g., by adding automatic detection of required preprocessors. Nonetheless keeping backward compatibility and accessibility of individual subcomponents, like nroff, troff and all the preprocessors. S-roff logo -- magnolia night I would like to see the manual all in manual pages (mdoc). I really would like to have builtin support for TTF/OTF fonts. All of this is mid– to long–term.

First i will completely rework the build system and adapt It still takes a while this codebase to not need any autotool, but only the shell and make, just the same easy way as is used for S-nail, then perform a lot of rather invisible but desired code overhauling, like implementing consistent argument parsing etc. I hope this step can be finished in summer 2018, followed by an early initial release.

S - W e b 4 2 — v0.9.0, 2016-10-24
.tar.gz.asc / .tar.gz
Repository{cgit,scm}/s-web42.git, branch [master]

One more option to manage your website. A camel approach to website building. vim(1) and it actually generated what you are looking at. ... read the complete documentation.

S - S y m O b j — v0.8.2, 2016-10-24
.tar.gz.asc / .tar.gz (via CPAN)
Repository{cgit,scm}/s-symobj.git, branch [master]

Throw an eye on my Symbol table and Object perl(1) module, it offers a somewhat easy symbol table and object creation/management. It is also available in the Comprehensive Perl Archive Network. ... read the complete PODocumentation.

I am using perl(1) since 1997 in many projects and for a lot of purposes. In all that time i have not found a single bug! Hoooray and thanks, perl(1) porters!

S - C T e x t — early alpha on 2013-07-06 (and 2017-12-14)
Repository{cgit,scm}/s-ctext.git, branches [master,(next)]
Commit logs of [master] are posted to s-ctext-commit@

Unix / POSIX continues to be byte-based, slowly drifting towards the byte-based UTF-8 multibyte character set. But the C and POSIX standards do not offer any option to work on multibyte character data except by first converting it into wide character strings. S-CText logo -- Spring This means that expensive and most often completely redundant round-trip conversions are necessary, even for the most simple tasks.

Furthermore, Unicode defines multi-codepoint characters — characters that are composed out of multiple codepoints, so-called graphems (see Unicode Text Segmentation), many of which do not have a precomposed single-codepoint representation. Neither ISO C nor POSIX define an interface that can deal with these sequences-of-codepoints that form a single character.

S-CText provides a programming interface that addresses these problems. It offers sets of string functions which deal with (possible) multibyte strings in the encoding of the / a LC_CTYPE locale (sct_ prefix function family, optional) as well as with UTF-8 encoded strings (sut_ prefix function family). In addition the internal representation of the Unicode character database can be accessed (sud_ prefix function family). And there is an optional character set conversion interface (scc_ prefix function family).

Expect a first usable version ... before 2020. (It has to rock!)

S - T o o l b o x
Repository{cgit,scm}/s-toolbox.git, branch [master]

The README as of 2018-11-29:

A repo of some small tools

Somewhat useful:
   A simple fancontrol shell script for an MacBook Air.
   Can be adjusted to others, of course.
   2018-11-16: added signal traps for openrc integration.
   2018-11-18: add EXIT trap, a bit of cleanup.

   Creates a shell archive similar to uushar as below, except that the
   archive (1) consists only of executable file members, and (2) will
   be itself executable.  Run it (the generated shell archive script)
   to invoke any of the programs contained therein.  On the first run,
   the wrapper will create a hidden directory in your $TMPDIR to unpack
   the archive members therein.  Run without arguments to show its
   contents and the creation date.
   It needs no manual, simply execute it and it will guide you through
   the archive creation process.

   Note that the uudecode(1) program must be capable of decoding to
   /dev/stdout, i.e., it must be POSIX compliant (Issue 6 iirc).

   2014-03-05: rewritten: check and forbid filenames with embedded
               double quotes, ensure the given default executable, if any,
               is part of the generated archive, reexecute after archive
               expansion, truly disallow empty archive name.
   2016-01-05: port to FreeBSD: uudecode(1) doesn't honour /dev/stdout
               in-stream, so give -o command line option.
   To ease maintaining of topic branches i use a linear history, so
   that i can use ``$ git rebase -i`` for fixups and squashes, without
   having to worry about recreation of topic branches.  Instead i tag
   commit messages, and use this script to create the topics once i'm
   finished.  Read the --help output for more, and make use of verbosity
   when you use it first.

   2013-09-13: newer git(1) reverse ``rev-parse`` output: adjusted.
   Download NNTP articles from and, incrementally, and
   store them in (append them to) a local MBOX.
   Read and adjust the script header for documentation and configuration.

   2017-06-17: ensure resource file is updated as necessary even when script
               dies due to failure.  Add $SAFE_FSYNC, default on.
   2017-07-24: add support for multiple servers and add

uushar (manual: uushar.1):
   Writes a sh(1) shell script to the standard output which will
   recreate the file hierarchy specified by the command line operands.
   Directories will be recreated and must be specified before the files
   they contain.  Compared to the well-known shar(1) program, uushar(1)
   adds optional compression and an uuencode(1)/uudecode(1) binary
   safe layer::

      $ uushar [-(Z|z|J|j)] file ...

   It is easy to insert trojan horses into uushar files.  It is thus
   strongly recommended that all shell archive files be examined before
   running them through sh(1).  Archives produced using this
   implementation of uushar may be easily examined with the command::

      $ grep '^[^X#]' shar.file

   Note that the uudecode(1) program must be capable of decoding to
   /dev/stdout, i.e., it must be POSIX compliant (Issue 6 iirc).

   2014-02-27: rewritten: short options, check and forbid filenames with
               embedded double quotes, added uushar.1 manual.
   2016-01-05: port to FreeBSD: uudecode(1) doesn't honour /dev/stdout
               in-stream, so give -o command line option.
               mdocmx(7)ified++ manual.

You likely do not wanna know:

   Offers some automatized operations on revision control repositories,
   like updating, (fast-forward) merging, garbage-collecting.
   My private backup script.  Simple (uses tar(1)), but does some stuff
   which i need for my work flow (backups data which is in local repo
   clones but not yet pushed to their "real" counterparts).  Needs perl(1).
   P.S.: it is fantastic to have a filesystem with snapshots thats can be
   "send" in addition!

   2015-09-02: no longer following symbolic links.
   2015-10-09: add -b/--basename option, add $COMPRESSOR variable, start
               via shell and $PERL5OPT clear to avoid multibyte problems.
   2015-12-25: excluding symbolic links from archives; change
               $SYMLINK_INCLUDE in the script header to change this.
   2016-08-27: FIX faulty xarg/tar -c invocations (Ralph Corderoy)
   2016-10-19: Renamed from "now" that we start via sh(1).
   2016-10-19: Removed support for Mercurial: not tested in years.
   ..2017-06-12: Various little fixes still due to the xarg/tar stuff.
   2017-06-13,14: Add $HOOK mechanism, an alternative archiver approach.
   2018-10-12: Fix $HOOK mechanism for filenames with spaces as shown by
               POSIX, assuming no newlines are in a name:
                  sed −e 's/"/"\\""/g' −e 's/.*/"&"/'
   2018-11-12: add -p option to tar.
   2018-11-13: change builtin path set.

   FreeBSD 5.3 x86 prog to open/close /dev/cdrom tray.  May work on
   newer ones, but haven't tried it in a while.  It had 416 object
   file bytes when everything was placed in ``.text`` (no .EH frames
   back then).,
   Simple scripts to ease maintaining of OpenBSD plus.html entries.
   A _real_ periodic for NetBSD, FreeBSD, DragonFly BSD and OpenBSD that
   ensures that the daily/weekly/monthly maintenance stuff is executed,
   even if your laptop is running only one hour a day.  Invoke this once
   per hour in the roots crontab and disable the usual periodic stuff of
   your system instead.  Note it doesn't deal with timezone and DST
   (daylight saving time) switches, but instead only checks the day of
   the year that is reported by date(1).  E.g., on my FreeBSD 10.0 box::

      # do daily/weekly/monthly maintenance
      15  * * * * root /usr/bin/nice -n 15 /usr/libexec/
      #1  3 * * * root periodic daily
      #15 4 * * 6 root periodic weekly
      #30 5 1 * * root periodic monthly

   2015-08-24: newer periodic(8) sleep in between jobs, so update the DB
               before we start it!
   2017-08-05: oh, fix the latter mess!  No more sleeps there, too?

   Single setuid root BSD program to invoke /sbin/shutdown(8), either
   to reboot or to halt the system.
   You've been warned.

# s-it-mode
S - M u s i c b o x
Repository{cgit,scm}/s-musicbox.git, branch [master]

A complete rewrite of our internal rather shitty jukebox, that managed to encapsulate HTML interface, CGI server side (TCP server using MPG321 remote control for playback), ripping (split on CDROM size boundaries with best fit, and that was the best feature of it) in a single script. It only supported MP3 (lame(1), that is). It ran (and still runs) on Linux and FreeBSD. Its database (using a lout-style trigger followed by a content line) did not store much information about recordings:


 # [PLAYTIME(0000:00.00 string..)] TAB [COMMENT] NL

 # [PLAYTIME(0000:00.00 string)] TAB [GENRE] TAB [COMMENT] NL



Yes, it is really, really odd, but remember it was indeed FILE based and splitted on CDROM size boundaries, so that each CDROM's database had to contain all the information of all files on it. The final database could be gained by cat(1)ing all those together, redundant entries would be removed upon load ...

So it becomes obvious why i actually wanted to have a new musicbox with a more sophisticated database, one that is capable to deal with the odds of classical music. Well, i did and re-ripped all my CDs with the script, which is yet the only ready component of S-Musicbox. Its CDInfo:: class, the one that is responsible for actual CDROM detection and ripping, supports only Mac OS X at the moment, however. It is pretty easy to extend, though. And the is a rather mature program, that i like.

Stale stuff

S - P o s t m a n — v0.4.0-beta7, 2013-01-16

This script was in daily use for SSL-secured POP3 download from mid 2011 until the begin of june 2013, but it has not been completed: please see its README first! ... read the complete documentation.

An unsophisticated end-user mail fetcher, processor and sender; it is easy configurable and offers a pretty good rule matching engine. This application has been written in Python.

In january 2011 this very project caused me to try Payprout 3000. Since then i stumbled over the discovery of dozens of bugs (in the standard library) and even got involved a little bit on their bug tracker. Payprout? Yes! (The details perhaps had had a negative influence on the emotional well-being of at least one of the mentioned characters.)

Well, it turns out that i curse the day when i decided that it try Python for this. The basic idea was that a Python installation always ships with the standard library, and that was supposed to already include most things ever needed. But if this projects takes that much longer there will not remain that many stdlib modules being used in the end.

S - X S y s t e m

The basic library of my S programming framework. It encapsulates almost all CPU and OS dependencies under its generic interface.

This will in fact be my free clone of my (our) internal non-free C++ library; different to that with full Unicode support, however. It will also be possible to use that as a normal library, whereas the C++ version does not link against any libraries and ships its own threading module. That however implies that there will be speed impacts, because then the extremely time critical s_thr_self() function will depend on some system thread-library provided thing etc. The situation is somewhat better on platforms with ELF TLS, but still worse than a fast manual driven thread-local storage (though completely automatic, on the other hand). And then of course: signals. As if that would not be hard enough in a monolithic situation, only interacting with the OS. Horror in the pipeline!

It is pretty large so that i need at least until 2020 to port it (P.S.: likely it will never happen as such due to lack of time):

 $ du -s cvsroot/cpp-sys
 5460 cvsroot/cpp-sys
S - X C o n s o l e

S library for (basic) console screen management. This is my free clone of my (our) internal non-free C++ library, which is conversely called Terminal. Different to that with full Unicode support.

It is already finished in theory, but since it requires the S-XSystem library it will take some years until it is really usable. At that time it will be clear whether it runs in practice, too. :-). (P.S.: this simple minded port would not really work with real Unicode characters but only with single Unicode codepoints. The README file talks a bit about that.)

It will be extended once a normal development cycle is possible (P.S.: likely that will never happen as such due to lack of time): there will be (non-overlapping) windows, a single-line-only mode will perhaps be implemented. The drawing mechanism can be improved in respect to performance. And a termcap interface would be a win, too. (I.e., dynamically extending the static builtin database of supported terminals.)

T R 9 n support
OpenBSD / OpenSSH

In november 2011 i became the maintainer of the german translations of the OpenBSD website, and after a lot of work i got synchronized with the tree on 2012-01-22. Because of character deficiencies of Mr. de Raadt the OpenBSD/[de] maintainership was discontinued on 2014-01-24. (P.S.: in the meantime the translation project has been shut down.) Thus the following paragraphs are partially outdated.

I hope i can realize and afford it to provide a uniform style through all pages until the release of OpenBSD 5.7. See DEification for a wordlist of changes that have been applied to [de], or will be applied to it in the future.

Unfortunately i had to drop my anti-german-language-reform attitude after one and a half decade for this maintainership (and only for it), so this reveals that the first paragraph of my homepage is actually a lie. But hey, do you know what: this standard committee currently is and furthermore always was deeply broken! You possibly do not want to see a photo of the current chairman. But anyway, it is official german, now. (Sob.)

I also did my part to maintain the daily changelog from the beginning of november 2011 until the end of june 2012; being part of a team that was formed out of the australian-based male Alpha Centaurian Brett Mahar (brett@), the swedish sweetheart Janne Johannson (jj@) and the flying german unionist Ingo Schwarze (schwarze@; all [openbsd DOT org]).

So i finally contribute(d) a little bit to the OpenBSD and OpenSSH projects, just as i had promised in 2001 (that could also have been 2002).

From you to me

I love C, perl(1) and dig plain old sh(1) and awk(1) more and more. I would love C++ (again) if it would be a plain C with classes; maybe not even automatic ctors and dtors. (If i really would go for learning a new language i think i would most likely have a go with Nim or Julia. I will however have to and look forward to dig into Lua.) I have discovered mksh(1) and use it on all my real-work boxes for years; but bash is there, too. Whereas Dropbear SSH is sometimes used for outlined SSH cases, almost all of SSH is driven by the omnipresent OpenSSH. Since about year 2000 i am a fan (though not a sophisticated user) of vim(1), it gave up in an endless loop twice. I am thankful for being able to use git(1) for version control today, after a lot of distress with other VCSs.

When on X(1) i was used to run the fantastic ahwm(1) window manager from about 2002/3 to November 2018, may Alex Hioreanu himself refer to it as historical or not; but ... i am now using cwm(1). Because i mostly stay within the tmux(1) terminal multiplexer, to which i have switched (back) after about six years of using screen(1), i am satisfied with the minimalistic st(1) terminal — rxvt-unicode and its server mode served me very well before that. For browsing there is lynx(1), if text based browsing is possible, thus decreasingly often, which i dislike, and chromium is used if not. Mail messages are passed through bogofilter for Bayesian filtering before being read, i have written and use a LMDB backend for and with it. I ended up using solely groff(1) for document preparation, viewing PDFs with mupdf(1); i do use from the same source.

I am very thankful for being able to use virtual machines via QEMU and VirtualBox (on the old Mac OS box): it is so handy to have a bunch of operating systems at hand for immediate testing, just as necessary! I have used FreeBSD for about ten years, and again since 2015. It and Alpine Linux are my development boxes, unfortunately i do not have the hardware to compile all packages myself, otherwise Crux-Linux, with its simple RC file setup, would be in use much more often. I am also using archlinux, NetBSD, OpenBSD and The Void (Linux) distribution, and there are VMs with other systems, like DragonFly (and am waiting for HAMMER2). I am in favour of BSD, it is a complete, self-contained environment, with good and up-to-date documentation.

While looking around for Unicode aware software i have been pointed to the Plan9 from Bell Labs operating system, which has been unknown to me before, and its 9atom and 9front extenders, which unfortunately have all died in the meantime, except for the latter; sometimes i wish i would have known Plan9 15 years earlier, and that it would have been licensed under BSD copyright back then, who knows how that relationship would have ended.

This server

The server is driven by the Alpine Linux operating system (after a month of a quick-and-dirty (via inetd) setup FreeBSD system) with tc(8) (iproute2) traffic shaping in combination with an iptables(8) firewall. Dnsmasq caches DNS queries. OpenSSH handles SSH, OpenNTPD synchronizes the system clock. Postfix manages SMTP and provides mailing lists via GNU Mailman. Web pages are served by the lighttpd web server and cgit makes the git(1) repositories accessible via HTTPS/HTTP for browsing purposes. Most services of are secured with a free certificate obtained from Let's Encrypt, which is managed by cron job via dehydrated. The server is a VM hosted by Portunity with the use of green energy.

Copyright (c) 1997 - 2018, Steffen (Daode) Nurpmeso <>
@(#)code.html-w42 1.320 2018-11-28T23:18:14+0000