Make editors slightly moist

Hacking

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 and HTTP at ftp.sdaoden.eu. It provides -latest symbolic links, e.g., s-web42-latest.tar.gz.asc.

 git(1) repositories are hosted via HTTPS and HTTP, they can be cloned via https://git.sdaoden.eu/scm/PROJECT.git, and also browsed at git.sdaoden.eu/browse after authentication (user and password are moon and mars).

Most projects are mirrored for free under my account at  sdaoden@ SourceForge.net, at  sdaoden@ Github.com, and some are also available under the nice and clean interface of  repo.or.czthank you!

sdaoden.eu uses the  GNU Mailman mailing-list manager, so users can manage their settings either via web browser by going to lists.sdaoden.eu, or by sending a mail with only the content help to LISTNAME-request@lists.sdaoden.eu. A receive-only very low-volume announcement list covering all my projects is S-announce at lists dot sdaoden dot eu.

I maintain a port collection for  Crux Linux with a few additional little not available by default.

S - n a i l (later S - m a i l x) — v14.9.24 (“Black ships ate the sky”), 2022-03-26
Announcement  <>  .tar.xz / .tar.xz.asc  <>  .tar.gz / .tar.gz.asc  <>  Manual
ML s-mailx@ with archive (also at  The Mail Archive, and via gmane.mail.s-mailx.general, thanks!)
Repository browse (clone: https://git.sdaoden.eu/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:  repo.or.cz/s-mailx.git      Coverity Scan:  S-nail (project 444)

S-nail (later S-mailx) 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, [Image: S-mailx heraldic animal] is MIME capable, and optionally offers extensions for line editing, S/MIME, SMTP and POP3, among others. Users are given tools for email appraisal and management, as well as increasingly powerful, reliable scripting capabilities.

Packages or recipes exist, sometimes as a core package, and sometimes under names like nail, mail, or mailx, for  Alpine Linux,  archlinux,  Crux,  Debian (going for Ubuntu, Devuan, and more),  Fedora (going for EPEL, CentOS),  FreeBSD,  Gentoo, macOS via  Homebrew,  KaOS, macOS via  MacPorts,  mageia,  NetBSD,  OpenBSD (cheesy maintainer),  OpenEmbedded,  OSUKISS,  Slackware,  The Void (Linux) distribution, as well as  Windriver Linux. Then there was Gavin, the man from the green island  AUR (s-nail-git). I am happy and prowd that it is included in the  The “Fossies” Software Archive that sails so close to the wind! The full list and the actualities of the packages can be queried via  Repology.org (s-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 https://git.sdaoden.eu/scm/s-nail.git
 $ cd s-nail
 $ git checkout master
 $ make CONFIG=MAXIMAL tangerine

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 \
    https://git.sdaoden.eu/scm/s-nail.git

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 \
    https://git.sdaoden.eu/scm/s-nail.git
 $ git fetch -v
S - S y m O b j — v0.8.2, 2016-10-24
.tar.gz.asc / .tar.gz (via  CPAN)  <>  Manual
Repository browse (clone: https://git.sdaoden.eu/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.

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 - T o o l b o x
S-cdda — v0.8.5, 2021-01-28 — .tar.gz.asc / .tar.gz  <>  Manual
S-cdda-to-db — v0.8.0, 2021-06-18 — .tar.gz.asc / .tar.gz  <>  Manual
pam_xdg — v0.8.1, 2022-08-02 — .tar.gz.asc / .tar.gz  <>  Manual
S-postgray — v0.8.0, 2022-09-16 — .tar.gz.asc / .tar.gz  <>  Manual
Repository browse (clone: https://git.sdaoden.eu/scm/s-toolbox.git), branch [master]

S-cdda and S-cdda-to-db are packaged on  Crux and  OpenBSD, pam_xdg on  Crux and  FreeBSD, S-postgray is available on  Alpine Linux,  Crux, and  OpenBSD; it is also included in  The “Fossies” Software Archive. Thank you!

The README as of 2022-09-16:

A repo of some small tools
==========================

pam_xdg.c (plus support) v0.8.1:
   XDG Base Directories support via PAM: creation of $XDG_RUNTIME_DIRs,
   injection of environment variables into sessions.  libpam and OpenPAM.
   ...
   2021-07-29: port to OpenPAM (BSD).  (Jan Beich)
   ...
   2021-09-16: Allow non-XDG-standard paths via make options. (Jan Beich)
   2022-08-02: Support XDG standard 0.8; make ball release v0.8.1.

s-cdda.c (plus support) v0.8.5:
   Access digital audio CDs (TOC, MCN, ISRC, CD-TEXT, audio tracks).
   Developed in 2020 on then current operating-systems and hardware.
   Not tested with CD-Extra etc (only proofed logically).  Linux and *BSD.

s-cdda-to-db.pl (plus support) v0.8.0:
   Queries content and data of audio CDs through s-cdda(1), collects
   informations (artist, album, song titles, etc.) of desired tracks,
   if possible correlates data with a web query against MusicBrainz,
   then places encoded tracks as well as a human readable and easily
   parseable database in a per-CD directory under a directory tree.
   The audio encoders (and sox(1) without --no-volume-normalize) need
   to be installed separately.
   (P.S.: the user will be asked to edit collected informations, and
   will be given a hand for the rather sophisticated, classical music
   aware) database layout while doing so.)
   (P.P.S.: nice foundation for link farms.)
   ...
   2021-05-17: fix: $MUSIC_DB now always needed, even in read-only mode.
               Talk about $LC_ALL and $PERL5OPT in the manual.
               MusicBrainz has HTTPS-query problems, henceforth require
               new --music-brainz-tls; add --music-brainz to avoid interactive
               prompt, v0.7.0.
   2021-06-18: use POSIX::setlocale() instead of relying on PERL5OPT=-C.
               The latter roots in old habits originating in perl(1) evolution
               problems Y2K2-3 (5.8.0 and 5.8.1).  Time to move on: v0.8.0.

s-postgray.c (plus support) v0.8.0:
   postfix(1) graylisting policy daemon.  See its README + manual for more.
   ...
   v0.8.0:
     - New --startup mode to allow it to be driven as a standalone daemon.
     - INCOMPAT!  The gray DB name did not adapt the makefile's VAL_NAME yet.
     - Client no longer exits after five unsuccessful connection attempts.
       Instead try as long as postfix is willing to let it.
     - "Fixes a miss": if on server startup the socket yet existed (no
       proper shutdown on last run), startup failed and the missing policy
       server would cause postfix to refuse acting.
       Whereas "rm -f PG-SOCKET" in a postfix-startup-script avoids this,
       it was never announced to be necessary, so henceforth automatize this.
     - Robustness against MFILE,NFILE,NOBUF,NOMEM in file/socket open paths.
     - Fixes some oddities, and clarifies documentation.

Not for the masses:

arena-manager:
   Offers some automatized operations on revision control repositories,
   like updating, (fast-forward) merging, garbage-collecting.

backup.sh:
   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).
   ...
   2016-08-27: FIX faulty xarg/tar -c invocations. (Ralph Corderoy)
   ...
   XXX No longer used: i switched to (subsets of) filesystem snapshots.

btrfs-snapshot.sh:
   Simple script to deal with BTRFS snapshots.
   ...
   2021-07-03: drop unused/broken "setmounts", add "setvols" command.
   2022-01-02: subvol sync after removal; if receiving a snapshot fails,
               remove it immediately via trap(1) EXIT, 'hope this works.

cdoc-freebsd.S:
   FreeBSD 5.3 x86 prog to open/close /dev/cdrom tray.  May work on
   newer ones, but have not tried it in a while.  It had 416 object
   file bytes when everything was placed in ``.text`` (no .EH frames
   back then).

entropy-saver.c:
   Linux: for my use cases i find it annoying that "entropy_avail" is not
   incremented when i restore the saved random seed that machines have
   collected so hard.  This little program touches this count also.
   (Thanks Bernd Petrovitsch for pointing out EAGAIN and EBUSY.)
   ...
   2022-02-23: work when /proc/sys/kernel/random/entropy_avail is not de-
               cremented when reading /dev/random.
   2022-04-20: Jason Donenfeld wrote something more generic that made it
               into busybox etc, and is therefore preferable:
                  https://git.zx2c4.com/seedrng/plain/seedrng.c
               P.S.: most preferable would be "echo seed > /dev/random"

fan-adaptive.sh:
   "Adaptive", more generic, and much more easily adaptable successor of
   fancontrol.sh.  For now with simulator and MacBook Air model support.
   See the script header for more.

find-command.sh:
   Find an executable command within a POSIX shell.
   which(1) is not standardized, and command(1) -v may return non-executable,
   so here is how it is possible to really find a usable executable file.
   Thanks to Robert Elz (kre).

   2021-12-16: allow prefilled variables with spaces, no longer find
               commands with spaces: $VAR (not "$VAR") now always correct.

gen-uushar-wrapper:
   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 the generated shell archive script to invoke
   any of its programs.  Upon first invocation the wrapper creates a
   hidden directory in $TMPDIR to unpack its members.
   Without arguments it shows its contents and the creation date.
   Simply execute it, it guides through the archive creation process.

git-topic-creator.pl:
   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 am
   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.

gmane-fetch.pl:
   Download NNTP articles from Gmane.org and Gwene.org, incrementally, and
   store them in (append them to) a local MBOX.
   Read and adjust the script header for documentation and configuration.

quote-rndtrip.sh:
   Round trip quote strings in POSIX (and elder) shell(s).
   Thanks to Robert Elz (kre).

   2019-05-27: ensure outer driver(s) do not leak variabes. (Steven Penny)

real-periodic.sh:
   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 does not 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/real-periodic.sh
      #1  3 * * * root periodic daily
      #15 4 * * 6 root periodic weekly
      #30 5 1 * * root periodic monthly
   ...

uushar (manual in uushar.1):
   Writes a sh(1) shell script to standard output that recreates 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

zte.sh:
   Control a ZTE modem (MF79 and many others according to web search)
   from the command line.  Needs curl(1) and OpenSSL(1).

# s-it-mode
S - W e b 4 2 — v0.9.3, 2020-05-16
.tar.gz.asc / .tar.gz  <>  Manual
Repository browse (clone: https://git.sdaoden.eu/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.

m d o c m x — v2 2015-05-12; v2.2 2022-09-09
Code is part of S-roff  <>  Manual
( groff(1) all-in-one patch 2015 (rejected)  https://savannah.gnu.org/bugs/?45034)
 groff(1) grotty OSC-8 patch (idea accepted, implementation by other means)  https://savannah.gnu.org/bugs/?60666
 less(1)  OSC-8 pull request
 groff(1) mdocmx-only patch 2022  https://savannah.gnu.org/bugs/?63042

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, like table of contents, and including (output device dependent) referencable external manuals, with a single new multiplexer command: .Mx.

Installations without mdocmx(7) support will ignore this request, the documents will render as if it would not have been used.

How does it work?

Non-multipass troff(1) implementations are not capable to generate forward references to anchors not yet defined, therefore the preprocessor mdocmx(1), implemented in portable sh(1) and awk(1), is necessary. However, a nice property of mdocmx(7) is that it “recognizes” its state, therefore preprocessed manuals can also be distributed.

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 terminal (typewriter-like) devices  groff(1) 1.23 and later comes with the new OSC 8 production command \X'tty: link' for grotty(1). OSC 8 escape sequences are understood by more and more terminals and console programs, like  less(1) (since version 566). With the OSC 8 search patch included (see enhancement request),  less(1) could even provide fully interactive internal and external references, like a web browser.

Note that due to the way that mdoc(7) is implemented section and subsection headers may not contain macro recursions, mdocmx(7) cannot deal with this. The next mdocmx(7) iteration will generate warnings for such use cases (at least in the preprocess stage); just as stated in the (first) enhancement request mdoc(7) itself has to be rewritten in order to overcome this restriction.

 mdoc() {
   mdocmx[.sh] "${1}" |
    ${MDOCMX_FLAGS-64} groff -Tutf8 -mdoc |
    LESS= less --RAW-CONTROL-CHARS
 }

 # mdoc unprocessed-file
 # With preprocessed manuals i can also simply do
 # man an-installed-manual
 # When i want a table of contents, i instead do
 # MDOCMX_FLAGS=64 man an-installed-manual
S - r o f f — working on it
Repository browse (clone: https://git.sdaoden.eu/scm/s-roff.git), release/{stable,latest},(next)]
Commit logs of [master,stable/*,release/*] s-roff-commit@
Repository mirror:  repo.or.cz/s-roff.git

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  X.org 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. [Image: 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 [Image: 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 by end of 2024.

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 used it on all my real-work boxes for almost a decade, but in 2021 i switched back to  bash everywhere after finding myself in a buggy dead end situation. Whereas  Dropbear SSH is sometimes used for outlined SSH cases, almost all of SSH is driven by the omnipresent  OpenSSH. I make heavy use of  WireGuard virtual private networks. 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.  lynx(1) for browsing if text based browsing is possible, thus decreasingly often, which i dislike, and  Firefox (pre-compiled) otherwise. Mail messages are being passed through  bogofilter for Bayesian filtering, 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  Ghostscript.com from the same source.

It would also not work without enscript, less, curl, openssl, all the compression tools, the filesystems and their tools, iwd, busybox, and all the other network tools, multimedia tools like ffmpeg, vorbis-tools, ogg123, sox, faad2, faac, of course xorg, and all the free compilers out there, gcc, clang, pcc and tinyc, and tools surrounding object files.

I am very thankful for being able to use virtual machines via  QEMU: 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 exclusively, and again since 2015. It and  Crux- Linux with nice SysV init are my development boxes. I am also using  Alpine Linux,  archlinux,  NetBSD,  OpenBSD and  The Void (Linux) distribution, and there are VMs with other systems, like  DragonFly. I am in favour of BSD, it is a complete, self-contained environment, with good and up-to-date documentation. Just like  Crux- Linux.

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 (except for dim memory on a very short notice in a German computer magazine), 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 sdaoden.eu 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.  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 sdaoden.eu are secured with a free certificate obtained from  Let's Encrypt, which is managed by cron job via  dehydrated. Inside a  WireGuard VPN  OpenSSH handles SSH, and  BusyBox offers some services, like rdate; it also offers a lot of other things. The server is a VM hosted by  Portunity with the use of green energy.

Copyright (c) 1997 - 2022, Steffen Nurpmeso <steffen@sdaoden.eu>
@(#)code.html-w42 1.389 2022-09-16T15:57:53+0000