Mon Sep 26 09:09:15 1994  Matti E. Aarnio  (mea@oj287.astro.utu.fi)

	* Dump 2.97mea

	* transports/mailbox/mailbox.c:
	    - MMDF-style mailbox separators with '-M' option!
	    - MIME-processing is now line oriented to facilitate
	      easier improving of it into handling beasts like
	      "message/alternate"  with multiple bodies..

Thu Sep 22 18:55:47 1994  Matti E. Aarnio  (mea@oj287.astro.utu.fi)

	* transports/smtp/smtp.c, transports/sm/sm.c, transports/hold/hold.c,
	  transports/mailbox/mailbox.c, transports/errormail/errormail.c,
	  scheduler/msgerror.c, scheduler/update.c, scheduler/transport.c,
	  scheduler/scheduler.c, smtpserver/smtpserver.c, libc/whathost.c,
	  lib/detach.c, transports/libta/warning.c, libmalloc/malloc.c,
	  libmalloc/getsize.c, libc/getdtblsiz.c, libsh/regexp.c,
	  libsh/execute.c, libsh/interpret.c, lib/rfc822date.c, router/db.c,
	  router/functions.c, transports/libta/ctlopen.c, hostenv/Linux:
	    Did port to Linux
	    (Various POSIX.1 problems..
	     Usually solved by "#include NDIR_H" ..)

	* transports/libta/buildbndry.c:
	    Added sequence "=_" into the boundary, thus rendering
	    it such which most likely will not be generated by any
	    MIME-compliant system in their message texts.

	* Makefile, libsh/Makefile, proto/Makefile:
	    Got rid of  /bin/ed  on file editing.
	    Instead uses AWK and SED. (Portability problems
	    to Linux caused this..)

	* Config, SiteConfig, bin/mklibsupport, ...
	    Configuring changed somewhat:
		- Compiler/compilation dependent things are on
		  file  Config
		- Site policy things (location of directories) are
		  on file  SiteConfig

	* transports/mailbox/mailbox.c ( putmail() ):
	    When CREATING a (mailbox) file, create it with ATIME of 0,
	    that is, "NEVER READ"...

Fri Sep 16 12:04:25 1994  Matti E. Aarnio  (mea@oj287.astro.utu.fi)

	* router/functions.c ( run_filepriv() ):
	    Added option  -M maxfilepriv  to the  $(filepriv XXX) to
	    get rid of a need to have system-wide compiled value for it.
	    Now I think we can create a system with  644 for ~user/.forward
	    and 664 for $MAILSHARE/lists/...  My users did ask for it..

Thu Sep 15 17:03:58 1994  Matti E. Aarnio  (mea@oj287.astro.utu.fi)

	* transports/mailbox/mailbox.c ( putmail() ):
	    Added ONE space to the FROM_ line:

	      From SPC from@addr SPC SPC date
				     ^^^ NEW
	    (To be compatible with competition -- err..  sendmail..)

Sat Sep 10 02:37:31 1994  Matti E. Aarnio  (mea@oj287.astro.utu.fi)

	* After a few days of testing at MAILHOST.UTU.FI, dumped 2.96..

	* smtpserver/smtpserver.c:
	    More fixes to the complex SMTP-option handling..

	* scheduler/readconfig.c:
	    SIGUSR1 -- rereadconfig() -- did crash on memory
	    corruption due to double-freeing a buffer.

	* scheduler/*.c:
	* transports/libta/ctlopen.c:
	    More fixes on the DSN, and related topics.

	* transports/mailbox/mailbox.c:
	    A message from  "channel error" (SMTP MAIL FROM:<>, or alike)
	    got bad UNIX mailbox header.  Now the "From_"-address is
	    always "postmaster" under such circumstances.

	* transports/smtp/smtp.c:
	    Do recognize the "DSN" (and "XDSN") magic tokens of NOTARY-DSN
	    capability on the remote system.
	    (Missing: actual DSN interaction..)

	* router/rfc822.c: ( sequencer() )
	* router/libdb/header.c:
	    Will accept DSN parameters, and carry them as attributes
	    to the router tasks, and in the end will output them to
	    the channels.  The scripts need to address problems on the
	    DSN data alteration, when it comes to list-expansions.
	    (Specs are developing..)

	    Thought: Internal list-expansion needs to be expanded into
		     a full-scale C-code which invokes router for the
		     recipients, and feeds them all the necessary attributes.
		     That way it will (perhaps) be SMALLER with its memory
		     usage as compared to the present   maprrouter()
		     script function.

	* router/rfc822hdrs.c, router/rfc822.c:
	    rfc822date() returns delivered UNIX-time in RFC822
	    format INCLUDING TIMEZONE CORRECTION, but we actually
	    want to create it only when it doesn't already exist,
	    othervice it shall be left alone.
	    Trouble on translating to the local TZ is on several
	    mismatches in the time-zones, and frankly it is too
	    painfull to be really usefull.  When the full header-
	    string is there already, off we go and use it.

	* router/rfc822.ssl, router/rfc822walk.c, router/rfc822hdrs.c:
	    Parse and "understand" "Received: ... convert XXX;" -token!

Fri Sep  2 11:35:53 1994  Matti E. Aarnio  (mea@oj287.astro.utu.fi)

	* scheduler/scheduler.c:
	* scheduler/scheduler.h:
	    Initial code for parsing DSN related transporter header
	    entries.

	* scheduler/msgerror.c:
	* scheduler/scheduler.h:
	    Print out  "Original-Envelope-Id:", and "Original-Rcpt:",
	    if data is available (if not, be quiet about them.)

	* smtpserver/smtpserver.c:
	    Accepts (and syntax-checks!) IETF-NOTARY-DRPT parameters,
	    and checks upon illegal characters on the input line, like
	    feed of control/8-bit chars on the SMTP protocol line..
	    (ASCII 0:es are also flagged!)

	* include/mail.h:
	    _CF_RCPTNOTARY-tag -- "DSN parameters for preceeding recipient"
	    _CF_DSNENVID-tag   -- "DSN ENVID data"

	* include/mailer.h:
	    enum HeaderClass got new elts:
		eToDSN, eEnvid

	* router/libdb/header.c:
	    Learned to recognize new transport envelope headers:
		todsn, envid

	* include/ta.h:
	* transports/libta/ctlopen.c:
	    "struct ctldesc" has now "envid" field, and it
	    gets filled in on the  ctlopen()  parser..
	    There is also "dsnflags", which also gets filled..

Thu Sep  1 11:13:03 1994  Matti E. Aarnio  (mea@oj287.astro.utu.fi)

	* libsh/optimizer.c:
	    Bad interaction with  USE_ALLOCA() -- the  ncode[]
	    array MUST be returnable to the callers scope, thus
	    it can't be alloca() buffer...

Mon Aug 29 22:45:09 1994  Matti E. Aarnio  (mea@oj287.astro.utu.fi)

	* Dump 2.95mea, and put it running at NIC.
	  Public release tomorrow ?

	* transports/smtp/smtp.c:
	    EHLO-processing had parameter bug on  smtpwrite()...

	* scheduler/msgerror.c:
	* scheduler/scheduler.c:
	   Still more wrestling with NOTARY error reporting..
	   Now it prints REWRITTEN headers also from within
	   scheduler's error reporter...

Sun Aug 28 22:26:26 1994  Matti E. Aarnio  (mea@oj287.astro.utu.fi)

	* transports/mailbox/mailbox.c:
	* transports/smtp/smtp.c:
	* transports/libta/diagnostics.c:
	    More wrestling with NOTARY error reporting..

	* transports/errormail/errormail.c:
	    More wrestling with NOTARY error reporting..
	    Will write out REWRITTEN headers -- so that there
	    is local "Received:" entry as well!

	* scheduler/msgerror.c:
	    Still more wrestling with NOTARY error reporting..

Wed Aug 24 02:00:17 1994  Matti E. Aarnio  (mea@oj287.astro.utu.fi)

	* Dumped 2.94mea

	* smtpserver/rfc821scn.c:
	    Address like:  <test@test_vms.domain>  is to be accepted,
	    even though it is illegal, if you have a strict look at
	    the standards..

	* transports/mailbox/mailbox.c:
	* transports/smtp/smpt.c:
	    Testing NOTARY message production.

	* transports/libta/diagnostics.c:
	    Produce the NOTARY diagnostics ( notaryreport() )

	* scheduler/transport.c:
	    Had a peek as to why some machines (SunOS 4.1.3 most notably)
	    can't run more than about 50 (!) channel programs at a time!
	    (Marco Hernandez @ CREN.ORG reported this problem..)
	    At the moment:  NO IDEA  :-/
	    (20 hours latter:
			Each scheduler file is kept open when it is in
			active processing, each active transporter has
			a diagnostics pipe back to the scheduler, and some
			systems have SIGNED CHARs as FD storage in FILE-
			structures..

			If transporters run with GANG-SCHEDULER, that is
			multiple files are spooled to same transporter,
			all those files must be kept open by the scheduler
			until the transporter acks them back..	)

	* scheduler/msgerror.c, scheduler/update.c,
	  transports/libta/diagnostic.c:
	    Revised report-back format, as well as error
	    reporting procedure fairly completely.

	    Now the transporters CAN report IETF-NOTARY data, and the
	    scheduler will then use it to report on the return email.
	    (Exact format evolves still, but one thing is sure:
	     it shall not contain \n's, nor \t's!)

	    Transporter main error reporter is  scheduler/msgerror.c,
	    NOT the  transports/errormsg/errormsg.c !
	    The latter can be used for some trivialities, though..
	    (How the heck it can get NOTARY data ? -- solved three
	     days latter..)

Tue Aug 23 21:52:18 1994  Matti E. Aarnio  (mea@oj287.astro.utu.fi)

	* transports/smtp/smtp.c:
	    An error in EHLO responce analysis did omit the
	    final responce line, which in one case did have
	    effect:
		250-XXXXX
		250 8BITMIME
	    Thus SMTP didn't learn that the receiver is 8-bit
	    capable..

	    Added an option to  smtp:  -E   -- try EHLO only if
	    the remote system has "EHLO" on one of its initial
	    message lines...  If not, don't do it.
	    Default case is to do  EHLO  ALWAYS, and if it fails
	    ("500 Unknown command", or hangup.., use HELO..)

	* transports/errormail/errormail.c:
	* scheduler/msgerror.c:
	    Skip over the Zmailer envelope lines in the original
	    email so that the file to be written out does not
	    contain anything but RFC-822 (+MIME) headers..

Wed Aug 17 14:12:06 1994  Matti E. Aarnio  (mea@oj287.astro.utu.fi)

	* utils/listexpand.c:
	    Wrote this to test how much 650 email recipients
	    will really expand the memory of the router.
	    Instead of running a built-in expansion within
	    the aliases.cf, this is to be called externally to
	    produce similar remapping and resubmitting the file
	    back to the router. (Via a trip thru scheduler, that is)
	    	    Internal expansion: 32 MB
	    	    External expansion: 3.5 MB (yes, only about 10 %!)

	* libsh/trap.c (eval): 
	    Carelessness on referring to the "savefile" buffer.
	    It can be NULL ptr under some occasions.
	    ( -> newaliases  crashed )

Tue Aug 16 17:04:43 1994  Matti E. Aarnio  (mea@oj287.astro.utu.fi)

	* Freezing and dumping 2.93mea

	* *.cf -files:
	    Processing of addresses which turn to be LOCAL to the
	    machine will with sample files (proto/cf/) produce
	    results like:
	    	(local nobody /dev/null 123)
		(local postmaster root 0)
		(local somealias "|/path/to/program args" 1234)
	    instead of the old style:
	        (local - /dev/null 123)
		(local - root 0)
		(local - "|/path/to/program args" 1234)
	    (These DO NOT contain my earlier quote additions, which
	     were for helping on expansions of esoteric addresses.
	     Oh well..  'Wrong' set of source scripts..)


	* many files..
	    FINALLY the mystic crashes on "router recipient" got
	    explained.  Stdio uses its own file descriptors, and
	    it takes only so many (resource: filehandles) leaked
	    (non closed) stdio buffers to use them all up, and even
	    though there are lotsa free fd's, there is no free
	    stdiobuf..  Mainly  router/functions.c: run_listaddrs()

	    Now the beast is written in portable manner, which only
	    assumes UNIX fd semantics (and that  dup() and dup2() work)

	    Mystic  libc/__fopen.c -file becomes used, if you define
	    -DDEBUG_FOPEN, Then it traces the usage of stdio files..

	* router/functions.c: run_daemon()
	    Fixed the memory allocation/freeup.  Memory that gets
	    freed explicitely is to be picked up from  MEM_MALLOC
	    space, not from anywhere else (did cause some cores..)

	* libs/ -- all libraries, most Makefile's, ..
	    All library files (*.a) get collected into one directory,
	    the "libs/"-directory.

	* transports/libta/mimeheaders.c:
	    Occasionally a transported file had:
	    	Content-Type: text
	    which caused carelessly written code to crash when
	    subtype (as in "text/plain") was not present at all..

	* hostenv/SunOS4.1:
	    Define  GETDTABLESIZE so that  libc/getdtblsiz.c won't
	    get compiled into a code and thus override system library
	    routine..

	* hostenv/SunOS5.2:
	    Use only  "MAILLOCK"  on Solaris, not the LOCKF at all!

	* transports/mailbox/mailbox.c:
	    On Solaris the file locking shall not be used on
	    "/dev/null"..
	    Incorporated  Edwin Allum's Solaris patches into
	    the code -- maillock() et.al.

	* transports/smtp/smtp.c:
	    Some minor tuneups on detecting when to downgrade headers,
	    and when not to.

	* libsh/interpret.c:
	    Under some conditions under-read varstack.  PURIFY test
	    use did help me to detect that at all..

      ( * At some non-defined point in history did dump
          zmailer-2.92 --- 940802 it appears to be.	)

Wed Jul 27 02:31:28 1994  Matti E. Aarnio  (mea@oj287.astro.utu.fi)

	* Freeze and dump zmailer-2.91mea-940727.tar.gz

	* many files..
	    Converting   emalloc(strlen(buf)+1) + strcpy()
	    to  strsave()  did cause amazing amount of problems.
	    They aren't all gone (don't know for sure, though),
	    and some others may have surfaced.

	* transports/errormail/errormail.c, scheduler/msgerror.c:
	    Alter error reporting towards that of the IETF NOTARY
	    working group draft -- not yet there by million miles,
	    I am afraid..
	    THIS ALTERED ALSO THE SYSTEM ERROR MESSAGE FILES!

	* */Makefile{,.in}:
	    Lotsa things..  Mainly on getting things to compile
	    ALL the related libraries before linking them in.

	* transports/libta/ctlopen.c, transports/libta/mimeheaders.c,
	  transports/libta/writeheaders.c, ...
	    Improve email header conversion facilities.
	    Proper email BODY conversion is still missing..
	    (text/plain gets processed, but  other formats
	     call for improvements..)

Mon Jun 27 07:24:44 1994  Matti E. Aarnio  (mea@oj287.astro.utu.fi)

	* transports/libta/mimeheaders.c :
	    Improved processing of "Content-Type:", and
	    added "Received: .... convert rfc822-to-XXXX;..."
	    clauses.  ( to "quoted-printable" and to "8bit")

	* BUGS, ChangeLog, README, README.solaris, INSTALL :
	    Updated documentation, worklist, ....


Sun Jun 26 01:31:54 1994  Matti E. Aarnio  (mea@oj287.astro.utu.fi)

	* Freeze and dump   zmailer-2.90-940626.tar.gz

	* router/functions.c (run_listaddrs):
	    An empty "include" file (empty .forward, as was the case)
	    caused SIGSEGV due to a NULL-ptr dereference.
	    Created smarter error handling.

	* router/rfc822.ssl:
	    Teached "AMailboxList" to understand '<>' as a valid
	    address ("channel error" source..) as is often case
	    with error-messages from mailers..  Now it accepts:
			From: <>

	    That unearthed a lot of problems elsewere with NULL-pointer
	    dereferrence and now don't even remember where everywhere...
	    ( s_copy_tree() at least )

Sat Jun 25 01:31:54 1994  Matti E. Aarnio  (mea@oj287.astro.utu.fi)

	* libsh/builtins.c, libsh/path.c, libsh/vcall.c,
	  router/functions.c, router/rfc822.c:
	    USE_ALLOCA -- use alloca() for some local buffer allocations
	                  which don't need to be preserved over the scope
			  of stack-frame existance.

	* hostenv/ :
	    Don't select on own  getopt() vs. system supplied one.
	    Use the own one always.

	* libsh/interpret.c:
	    Improve interaction with the  getopt()

	* libmalloc/ :
	    Improved the integration with the Zmailer -- this is a new
	    version of the "Toronto Malloc", and quite a headache to
	    integrate..

Tue Jun 21 09:52:21 1994  Matti E. Aarnio  (mea@oj287.astro.utu.fi)

	* router/rfc822.c (run_rfc822): 
	    Argument processing bombed -- possibly due to usage of
	    the GCC, possibly due to something else.


Tue Jun 21 09:52:21 1994  Matti E. Aarnio  (mea@oj287.astro.utu.fi)

	* Created this file to track changes

	  Building Zmailer 2.90xxx -- that is, alphas/betas of 3.0

	* Pre-ChangeLog transcript follows:


Various features/fixes done at Univ of Turku by Matti Aarnio <mea@utu.fi>


Compiling with  GCC 2.3.3, and 2.4.5 with -Wall  -- generated a lot of
warnings, which one after another have been eradicted..  Found also some
real bugs with that.  (BUT NOT ALL!)

I am compiling it on SunOS 4.1.3 with  GCC 2.5.6, and "-traditional"
option..


Referred <Emil> is IDA's big-brother (IDA-sendmail's MIME processing toolbox)


Multilevel incoming mail priorizing into router:
	- mail(3) has  mail_priority  variable, which must be set
	  to desired value before  mail_close() is called.
	  Value 0 means normal behaviour (and is the default).
	  Any positive value means picking further down into
	  ROUTERDIRS Z-environment variable.  (See mail(3), and router(8))

	- compat/sendmail/sendmail accepts  -Pnn, which is feed to
	  mail_priority (see above)  As an alternate, it also honours
	  environment variable   MAILPRIORITY which has numeric value.
	<Maybe "Precedence:" header should be processed ?>

	- Router processes at first all files from the  POSTOFFICE/router/
	  directory, and once it is empty, it looks into alternates.
	  If alternate had anything to work upon, directory scanning returns
	  to the first level dir.
	  As an end result, the further messages are into the alternate
	  directories, that less frequently they get processed.

router/functions.c:
router/conf.c:
router/dateparse.c:
router/rfc822.c:
router/router.c:
	- Implemented first real multi-router system with working locks.
	- Extended it with ROUTERDIRS - multiple priority levels.
	- Added some {}'s into dateparse.c
	- Added configurability of  $(filepriv ...) into conf.c
	- Accepted and inserted a patch on RFC header processing which
	  blew on "header"-line like:  ": some text"
	  (Some programs inserted such junk into HEADERS - tin among them.)
	  Source: "Michael S. Shappe" <mss1@cornell.edu>
	- Added option  -E  into $(listaddresses ...) creating
	  an "Errors-To:" header, and making sure the SMTP
	  'MAIL FROM:<>' contains that address.
	<Should use Emil ?>

router/libdb/bind.c:
	- added query-type 'any' to be used in place of '-t cname' on
	  DNS canonization. (In manner of  BSD sendmail.)

smtpserver/smtpserver.c:
	- SMTP-server does check syntax of RFC821 inputs, specifically
	  it checks "MAIL FROM:< .... >" and "RCPT TO:< .... >" syntaxes,
	  and is adamant with them.  -- many misconfigured PC-mail programs
	  have been found with it...   --  rfc821scn.c  does most of it.
	- Uses  Remote Authentication Service (RFC 1413) to (try to)
	  see who is it, who contacts us.  (See also: "libauth/*")

	- SMTP-server supports RFC 1425-1428   EHLO greeting (in place of
	  HELO command), and related  8BITMIME, and SIZE extensions.
	  Summa summarum:  Now we advertice that we can accept 8-bit SMTP,
	  not just blindly accept it..
	- SMTP-server fully uses RFC 1427 SIZE feature (if user defines it),
	  and thus can report "insufficient storage space at the moment",
	  if sender tries to send email which is far too big..
	<Should check MIME-compiance of the message, if it has 8-bit stuff
	 in it, and not give   250 Ok  if check fails.  Also maybe should
	 check syntax of RFC822 headers, and complain at the "." time, if
	 that check fails..  Precedence can be found from PP.>
	<Should use Emil ?>


transports/libta/routermxes.c (new)
	- router can feed target "mx" information, same as it got when
	  analyzing routing, to the actual transporter program.
	  In place of a  hostname,  it codes:  ((mxer)(mxer mxer)(mxer))
	  (This is into the router results!)

transports/libta/ctlopen.c
transports/libta/mimeheaders.c (new)
	- new way to read in the headers, and to handle them when
	  rewriting them.  Original was to get them in as single
	  multiline string.  This splits them to individual lines
	  and keeps track of them in that way..


transports/smtp/smtp.c:
	- Better support for local sender verbose trace
	- If connection setup fails (channel open timeout, or remote
	  closes the channel upon our face -- whatever before HELO),
	  we try to talk to next assigned MX target.
	- Support of RFC 1425-1428  8BITMIME transport
	- Uses RFC 1427 SIZE=, if receiving system knows it (EHLO protocol)
	- Downgrades message to "Content-Transfer-Encoding: QUOTED-PRINTABLE",
	  1) "Content-Transfer-Encoding: 8BIT" is present
	     in the primary headers,
	  2) remote system has no  8BITMIME capability,
	  3) message contains 8-bit characters.
	- Downgrades message header to "Content-Transfer-Encoding: 7BIT",
	  if message data is 7-bit, and said header is present.
	- If "C-T-E:" was turned to "7BIT", and "Content-Type:" was
	  "text/plain; charset=ISO-*", then update "C-T:" to have
	  "charset=US-ASCII" -- simplifies things (?)
	- Doesn't do full job of analyzing things like "Content-Type:",
	  rather assumes that "C-T-E:" is present on "C-T: text/plain"
	  messages, and any complex things are built properly.
	- setsockopt() arguments corrected.
	<Should use Emil>

transports/sm/sm.c:
	- Support for local sender verbose trace
	- Downgrades messages in same manner as smtp does, if "sm"
	  doesn't have "-8" in its options when running some subchannel.
	<Should use Emil>


transports/mailbox/mailbox.c:
	- Allow local addresses to be   user@domain, and use that kind
	  of addresses on storing mails to mailboxes.
	<Really should only do header rewrites into FQDN format, and
	 have local users feed to via scheduler as   `username' (non FQDN)>
	- Use proper NFS locking  ( lockf() )
	<Should use Emil>
	- Partial MIME converter:
		A  text/plain; Quoted-Printable  message will be converted
		into  8BIT  format, IF the "mailbox" program is called with
		argument: "-8"!  (If that argument is not present, nothing
		new is done.)

libc/libc.a:
	- mail_open() does a  whathost() to figure out NFS-mounted
	  postoffices.  <Guy Middleton>
	- using free()d storage -- Matthias Urlichs, et.al. in   mail.c
	- whathost.c  generalizes NFS mountpoint figuring system.
	- mail_close() is affected by  mail_priority variable, as well
	  as  ROUTERDIRS  Z-environment.  See  mail(3)

libauth/*:
	- RFC 1413 using identd protocol using library.
	  (Host configuration option  USE_AUTH)


compat/sendmail/sendmail:
	- Accept (and ignore) options:  -oem, -J, -em
	- Accept option -Pnn, see above about  mail_priority (mail(3))
	- Making sure "to <address>" -lines contain only valid
	  characters -- well, don't contain newlines!
	- Accept "From " (FROM-SPACE) input (sendmailism), and
	  drop such line away, if next line looks like a real header.
	- Do binary (-t option) processing buffer at a time, instead of
	  a character at a time..
	<Check MIME-headers, and correct 8-bit handling ???>
	<Check submitted headers (syntactically), and barf if fail ???>

compat/rmail/rmail:
	- Bill Wisner's rmail patch applied.


lib/rfc822scan.c:
	- Nested comments fix -- don't remember who
	- Kicked out bit-stripping -- headers are 7-bit stuff!

lib/linebuffer.c:
	- Explicit exits with  ferror() amd feof() conditions!
	  Suggested by  haa@cs.hut.fi
	- Made a serious mistake, and two weeks later found it..
	- accepted a patch from  Ken Lalonde <ken@cs.toronto.edu>,
	  finally did it corrently !

ssl/ssl.c:
	- array space reservation one-off, fix by 	Matthias Urlichs

utils/makendbm/
	- wrote whole package

utils/zmstats.perl
	- wrote this small piece

utils/fullnamealiasmaker.perl
	- wrote this (larger) piece

support/vacation/
	- extended to behave somewhat like SunOS  vacation(1), only better :)
