Anonymous Contact Service Software Posted

Dave Mack csu at alembic.acs.com
Sun Jul 8 04:21:35 AEST 1990


Immediately following this article, I will post the ACS software to
alt.sources. It will be in three parts. The source is in a uuencoded,
compressed tar file. This annpouncement has been crossposted to comp.lang.perl
because most of the ACS code is written in Perl and may be of interest
to Perl hackers, but the source itself will only be posted to alt.sources.

This distribution also includes the complete source for smail2.5,
because I had to make a minor modification to it to get things to
work properly. You can build a completely vanilla smail2.5 using the
instructions and Makefile in the "mailer" subdirectory. Building the
ACS version is automatic when you invoke the Makefile in the ACS
toplevel directory, or when you use "make -f Makefile.acs install" in
the "mailer" subdirectory.

To assist in unpacking this distribution, I'm enclosing a Perl script
I wrote called uumerge, which will take a split uuencoded file, strip
headers and trailers off, and uudecode the concatenated chunks.
Simply save the ACS software articles in files (acs.part[1-3], for
example), then say "uumerge acs.part*". Make sure that the pieces
on the command line are in the right order. This should result in
the production of a file called "acs1.0.tar.Z", which you should be
able to uncompress and untar. Please do the latter in a new directory,
as the tar file doesn't provide an acs toplevel directory.

--------------------------uumerge: cut here --------------------------------
#! /usr/local/bin/perl
#
# Combine split uuencoded files into a single data stream with
# e-mail garbage removed and pipe into uudecode. The uuencoded
# files must be in the correct order on the command line - in
# particular the first file must contain the "begin" line and
# the last file must contain the "end" line.
#
# WARNING: this code relies on uuencode putting out all lines
# of the form "M[61 ASCII characters]\n" for every line of the
# file except the last few before the "end" line. If you come
# across a uuencoded file that doesn't do this, you'll need to
# modify the code to handle it.
#
# DISCLAIMER: You use this code at your own risk. Also, don't
# take this is as a sterling example of Perl programming. Corrections
# and improvements welcome. You may do whatever you like with this
# code as long as you leave in some reminder of who the original
# culprit^H^H^H^H^H^H^Hauthor was.
#
# Usage: uumerge filename [filename...]
# Requires Perl 3.0 - my copy is at patchlevel 18
#
# Dave Mack csu at alembic.ACS.COM
#
# TODO: modify to allow more than one collection of files on
#	command line.
#
# KNOWN BUGS: 
#
# If some bozo puts a line beginning with "M" in the body of one
# of the intermediate/last chunks, uumerge will assume that uuencoded
# part starts there.
#
# If the last chunk only contains the last two or three lines of
# the uuencoded file (the ones that don't start with "M"), uumerge
# will die.
#
# CHANGES
#
# PATCH 1:
# It appears that some versions of uudecode are too stupid to skip
# past the lines preceding the "begin" line, so feeding a one-part
# uuencoded file to uumerge will bomb.
#
if ($#ARGV < 0 ) {
	print "Usage: uumerge filename [filename...]\n";
	exit 1;
}

$| = 1;
# open a pipe into uudecode
open(DECO,"|uudecode") || die "Can't pipe into uudecode\n";

# if we only have one file, pump it straight into uudecode and die
if ( $#ARGV == 0 ) {
	open(FIRST,"<$ARGV[0]") || die "Can't open $ARGV[0] for input\n";

	while ( <FIRST> ) {
		# skip past everything before the "begin" line
		next unless /^begin [0-9]/;
		last;
	}
	die "$ARGV[0] doesn't contain \"begin\"\n" if eof(FIRST);
	
	print DECO $_; # the begin line

	while ( <FIRST> ) {
		print DECO $_ unless /^end/;
		if ( /^end/ ) {
			print DECO $_;
			last;
		}
		die "$ARGV[0] doesn't contain \"end\"\n" if eof(FIRST);
	}

	# done with file
	close(FIRST);
	exit 0;
}

# process the first file - make sure we have a "begin" line

open(FIRST,"<$ARGV[0]") || die "Can't open $ARGV[0] for input\n";

while ( <FIRST> ) {
	# skip past everything before the "begin" line
	next unless /^begin [0-9]/;
	last;
}
die "First file on command line doesn't contain \"begin\"\n" if eof(FIRST);
	
print DECO $_; # the begin line

# the remaining "real" uuencoded lines in this file should begin with "M"
while ( <FIRST> ) {
	if ( /^M/ ) {
		print DECO $_;
	}
	else {
		last;
	}
}

# done with the first file
close(FIRST);

# do all except the last file
$maxindex = $#ARGV;
$curr = 1;

while ( $curr < $maxindex ) {
	open(CURR,"<$ARGV[$curr]") || die "Can't open $ARGV[$curr]\n";
	# skip the header junk
	while ( <CURR> ) {
		next unless /^$/;
		last;
	}
	# at the body of the message - start looking for /^M/
	while ( <CURR> ) {
		next unless /^M/;
		last;
	}
	die "$ARGV[$curr] isn't a uuencoded file\n" if eof(CURR);
	# OK, we're at the start of the good stuff (probably)
	print DECO $_;
	while ( <CURR> ) {
		if (/^M/) {
			print DECO $_;
		}
		else {
			last;
		}
	}
	# done with current file
	close(CURR);
	$curr++;
}

# time to do the last file in the set
$curr = $maxindex;
open(CURR,"<$ARGV[$curr]") || die "Can't open $ARGV[$curr]\n";
# skip the header junk
while ( <CURR> ) {
	next unless /^$/;
	last;
}
# at the body of the message - start looking for /^M/
while ( <CURR> ) {
	next unless /^M/;
	last;
}
# OK, we're at the start of the good stuff (probably)
print DECO $_;
while ( <CURR> ) {
	print DECO $_ unless /^end/;
	if ( /^end/ ) {
		print DECO $_;
		last;
	}
	die "Last file on command line doesn't contain \"end\"\n" if eof(CURR);
}
# done with final file
close(CURR);
# close the pipe to uudecode and exit
close(DECO);
exit(0);



More information about the Alt.sources mailing list