Ravel and unravel pack and unpack mime-encoded messages. I wrote these for Mastodon Linux because the exiting mime packers and unpackers seemed to be too complicated for such a simple spec. A few dozen code revisions later, I realized my mistake. But here they are; I’ve grown used to them, and prefer them to the traditional standards.
1.2.5 adds one option to
the unravel
program – the ‘-d’ (–dryrun) option
doesn’t actually extract files, but tells you what
files are being extracted (this was implemented once
before, but the changes got submerged when that
copy of the mimecode sccs files got out of sync
with everything else.) It also fixes one
bug with memory allocation; I keep a stack of
mime boundaries so I can rewind out from multiply
nested mime bundles, and I’d completely misdone
the memory allocation for that stack to the point
that often it wouldn’t actually expand the stack
but would instead just sort of wander off into
random memory building a stack. This was an annoying
bug, because it would only rarely either make the
program dump core (on Linux, via the memory management
code in libc; this would dump so much information that
it as difficult to track) or drop into an infinite
loop as things got progressively more corrupt.
Resorting to valgrind pointed
me to the problem in a hurry (a placeholder malloc(1)
which SHOULD have been reallocated to fit if the rest
of the memory management worked) so it’s fixed to the
point where valgrind doesn’t complain about that
anymore (it still complains about orphaned memory
segments and I know exactly where that’s happening;
that’s a bugfix for a different day, though) and maybe?
unravel won’t dump core or go into an infinite loop in
the middle of make test
.
1.2.4 adds two options to
the unravel
and uudecode
programs – the -q
option
makes them run as quietly as possible, and the -t
option
makes them write extracted files into the specified directory
instead of where the pathname wants to put them.
1.2 – codenamed ‘superfussy’ –
is a massively cleaned up version that improves on the
cleanups in version 1.1.1 plus has more and better documentation
and a few additional features.
I’ve added the -c
(extract files to current directory) and -f
(overwrite
files) options, documented them, added a
README describing the package,
and added an
INSTALL document which, in
about the tersest way possible, attempts to tell you how
to install it.
For completeness, I’ve complemented uudecode
with a uuencode
program (providing both base64 and uuencode formats,) based
on code from 4.4bsd.
To wall off my uuencode/uudecode from any that might already be on the system, I’ve added the
--enable-uuencode
flag toconfigure.sh
so you need to really want the uu family before you get it.
1.1.1 is a cleanup version of the 1.1;
I went in and did a generalized cleanup of the manpages, the
build process, and the install process. Version 1.1.1 now
uuencode manpage [a lightly edited version of the BSD
page], has the other manpages redone from the USG (.TH/.SH/
&tc)
to the newer -mandoc
style that BSD uses, has been lightly edited
to use my standard method of carrying around a program name
(global char* pgm;
, populated by pgm=basename?basename():strrchr()
)
and to have the arguments to ->encode()
and ->decode()
cast to the mimeread
and mimewrite
types,
and, finally, has a version of configure.sh
that tries to look for the existance of $prefix/share/man
so it can put the manpages there instead of $prefix/man
.
Amazingly, none of this appears to have actually broken the rest of the code.
1.1, codenamed Rip Van Winkle, was provoked by trying – after a several-year interval – to run the program on a new machine. It didn’t work, and when I looked at the code I realized that there were parts in it that were pretty much guaranteed to NEVER work. So I’ve ripped out the guts of the program and restructured it, and now it appears to run on Mastodon, MacOS, and FreeBSD.
1.0 was ripped out of the Mastodon toolkit and stuffed into its own little tarball. These compile (for some version of “compile”) on FreeBSD 4.8 and Mastodon INST0067, unlike the old code that wouldn’t compile anywhere except in the Mastodon build tree.