home *** CD-ROM | disk | FTP | other *** search
- From: csu@alembic.acs.com (Dave Mack)
- Newsgroups: alt.personals,alt.sources,comp.lang.perl
- Subject: Anonymous Contact Service Software Posted
- Message-ID: <1990Jul7.182135.19069@alembic.acs.com>
- Date: 7 Jul 90 18:21:35 GMT
-
- 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@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);
-