merlyn@iwarp.intel.com (Randal Schwartz) (03/27/90)
I needed to send something to another BSD-like Unix site recently, and
it turned out to be larger than the mailer would allow. Knowing that
they had uudecode and uncompress, and dreading the idea of splitting a
lot of mixed text and binary up into shars (and needing only the
slightest excuse to spend some time hacking yet another Perl tool), I
came up with the 'shipit' utility.
Shipit takes a username and tar spec, and tars those files together,
compresses the resulting archive, splits that compressed image into
sections which when uuencoded will fit into a predefined target
bytesize. It then prepends a header telling the reciever what to do:
namely, take each mail message, pump it through uudecode, cat the
resulting files collectively through uncompress, feeding *that* into a
tar 'x' to get the original data. (Maybe I should have called this
program 'rube'? :-)
Anyway, here it is for your enjoyment:
================================================== snip snip
#!/local/merlyn/bin/perl
# usage: shipit user tar-spec...
$msgsize = int((32000-2000)/1.35);
$TMP = "/usr/tmp/shipit.$$";
$| = 1;
$user = shift;
system "tar cf - @ARGV | compress >$TMP";
$totalbytes = (stat($TMP))[7];
open(TMP) || die "Cannot open $TMP ($!)";
unlink($TMP);
$totalmsgs = int(($totalbytes+$msgsize-1)/$msgsize);
$arcid = sprintf("shipit%d",time);
for $msgno (1..$totalmsgs) {
read(TMP,$bytes,$msgsize);
unless (fork) { # child: mail
unless(open(STDIN,"-|")) { #child child: perl processing
unless(open(STDIN,"-|")) { #child^3: uuencode
unless(open(STDIN,"-|")) { #child^4: print data
print $bytes;
exit 0;
}
exec 'uuencode',
sprintf("%s.tar.Z.%03d",$arcid,$msgno);
die "Cannot exec uuencode ($!)";
}
print <<"HEAD";
This is part $msgno of a $totalmsgs-part shipit(TM :-) archive.
To extract, run each message through uudecode, then enter:
cat $arcid.tar.Z.* | uncompress | tar xvf -
HEAD
print while ($_ = <STDIN>);
exit 0;
}
exec '/bin/mail', $user;
die "Cannot exec mail ($!)";
}
wait;
}
close(TMP);
exit 0;
================================================== snip snip
As an example, here's shipit as a shipit archive:
This is part 1 of a 1-part shipit(TM :-) archive.
To extract, run each message through uudecode, then enter:
cat shipit638496913.tar.Z.* | uncompress | tar xvf -
begin 666 shipit638496913.tar.Z.001
M'YV0<]"D@9.&#H"#"!,J7,BPH<.'$"-*1 BBXHV+( !4E!%CAHV,%4'$H$$#
M9,B3%6%HI&$#1HP;-6S$@%%2Y,R6&F6X</%BYXN 8>24>2$FC9N? @D:G,BT
MJ=.G4*-*G4JUJM6K6+-JW<JUJ]>O8,.*'4NVK-FS:-.J7<NVK=NW<./*G4NW
GKMV[>//JW<NWK]^_@ ,+'DRXL.'#B!,K7LRXL>/'D"-+GDRYLN6#
end
Enjoy.
Notice the smiley face in the following sig. Where does it go? :-)
$_=q(q-q:!print "Just another Perl hacker," :-) ;-7 while$_=eval
--
/=Randal L. Schwartz, Stonehenge Consulting Services (503)777-0095 ==========\
| on contract to Intel's iWarp project, Beaverton, Oregon, USA, Sol III |
| merlyn@iwarp.intel.com ...!any-MX-mailer-like-uunet!iwarp.intel.com!merlyn |
\=Cute Quote: "Welcome to Portland, Oregon, home of the California Raisins!"=/