#!/path/to/perl

# forkwar.pl by deprogramming.us
# Windows binary and cross-platform perl source available from deprogramming.us
# Copyright/left 2003
# v. 1.0, 17 February 2003
# Distributed under the GPL - http://www.gnu.org/copyleft/gpl.html

# A "forkbomb" is a computer algorithm that chases its tail, repeating and multiplying itself until it
# eventually crashes the system. 
# This special "graphically-enhanced" implementation illustrates a forkbomb using the easy-to-understand 
# example of U.S foreign policy! 
#
# Shouts to Alex McLean (forkbomb.pl - of which this is an adaptation.)
# See his original at http://www.slab.org/forkbomb.pl.tt2
# and the anonymous ASCII artist who created the image at http://www.textfiles.com/art/art0 - which we will also appropriate.


# First, some preparation.. 
$inputstrength = shift(@ARGV);
if (not defined $inputstrength) { 
	print "This program crashes your system!\nTo run it, you must define a strength - for example:\n forkwar 99\n";
	sleep 10;
	exit;
}
else {
	undef ($strength);
}

$count = 1;
$ammo = lock_n_load();

################################:-/#################################
# Now here is the actual "forkbomb." In plain English, it says: 
# If the justification isn't defined, it must be hiding - so spew. 
# However, if there's zero justification, spew and start anew. 
# (Sometimes spewings are ornamented by reversals, fits n starts, and generalized fraying, but they keep spewing.)
# Lather, rinse, repeat - until you've spawned (forked) so many times you crash the system!"
# Simple, isn't it? OK, now here it is in code:

while (1) {
	$count++;
	fray ();
	my $justification = fork();

	if (not defined $justification) { 
		exit unless --$strength; 
		# You could also set this next line to "terrorist" or "evil" or  
		# whatever else you like, since it's actually just smoke and mirrors... 
		$justification = "hiding"; 
		spew ($ammo);
	    	fits_n_starts();	
		
	}

	elsif ($justification == 0) { 	
		exit unless --$strength; 

		if (int(rand(9) > 5)) {
			$ammo = reverse($ammo);
							
		}
			
		spew ($ammo);			
		system("$0 $inputstrength") or warn "$!\n";
		
	 } 

}

# End o' forkbomb. 
###############################:-\##################################


sub lock_n_load {
	# ascii cannon-stuffing as obfuscation - wheeee!
	my $ammo =
     	'м|   л *  *  *  *  *  *ллллВБм|   л  *  *  *  *  *  ллллВллВллллллллллллВБм|   л *  *  *  *  *  *ллллВББВллллллллллллВББВлллллВБ|   л  *  *  *  *  *  ллллВллВллллллллллллВББВлллллВБ|   л *  *  *  *  *  *ллллВББВллллллллллллВББВлллллВБ|   л  *  *  *  *  *  ллллВББВллллллллллллВББВлллллВБ|   л *  *  *  *  *  *ллллВББВллллллллллллВББВлллллВБ|   л  *  *  *  *  *  ллллВББВллллллллллллВББВлллллВБ|   л *  *  *  *  *  *ллллВББВллллллллллллВББВлллллВБ|   ллллллллллллллллллллллВББВллллллллллллВББВлллллВБ|   ллллллллллллллллллллллВББВллллллллллллВББВлллллВБ|   ллллллллллллллллллллллВББВллллллллллллВББВлллллВБ|   ллллллллллллллллллллллВББВллллллллллллВББВлллллВБ|   л                      пБВллллллллллллВББВлллллВБ|   л                                      пБВлллллВБ|   л|   л                           ФФФ   ФЭЭбЭ|   л                   _ ФФ___л     ___Г\   К|   л      xxoo... -love, W  >-пп\XXXXX ФЭЭЯЭ лли|   л                            ФФФ __ФФ   К|                                       ФФ(њ)|||||||||||||||||||||||';
	$ammo =~ s/\|/\n/g;
	return $ammo;
}

sub fits_n_starts {
	# have some fits n starts
	if (int(rand(555) > 550)) {
		$ammo =~ s/(.*)\n+$/$1\n/;		
		sleep 1; 
	}
}

sub fray {
	# gradual disintegration of the image
	if (($count > 70) and (rand(30) > 22)){
		$ammo =~ s/(\л\л\л\л)/$1 /g;
	}
	if (($count > 100) and (rand(30) > 28)){

		$ammo =~ s/(\*)/$1 /g;
	}
}

sub spew {
	# spew
	my $you_know_what_comes_out = shift(@_);
	print $you_know_what_comes_out;
}