From: Tom Christiansen <tchrist@convex.COM>
Subject: Re: Fortunes
Originator: tchrist@pixel.convex.com
Reply-To: tchrist@convex.COM (Tom Christiansen)
Organization: CONVEX Realtime Development, Colorado Springs, CO
Date: Thu, 23 Jul 1992 14:34:41 GMT
X-Disclaimer: This message was written by a user at CONVEX Computer
              Corp. The opinions expressed are those of the user and
              not necessarily those of CONVEX.

From the keyboard of sparky@polari.online.com:
:Don't know if this is the correct place to post this question, but...
:
:I know there is a way to create one's own "fortune" file for use in
:mail and messages.  How is this done, and how can I make mush, for
:example, use *my* fortune file instead of the default one?

This way:

--tom


#!/usr/bin/perl
#
# sigrand -- supply random fortunes for .signature file

################################################################
# begin configuration section 

$MKNOD = "/etc/mknod";

&gethome;

# for rec/humor/funny instead of rec.humor.funny
$NG_IS_DIR 	= 1; 	

$FULLNAME 	= "$HOME/.fullname";
$FIFO 		= "$HOME/.signature";
$ART 		= "$HOME/.article";
$NEWS 		= "$HOME/News";
$SIGS 		= "$NEWS/SIGNATURES";
$SEMA		= "$HOME/.sigrandpid";

# end configuration section -- HOME and FORTUNE get autoconf'd
################################################################

&setup;

&justme;

fork && exit; 	# be a daemon 

open (SEMA, ">$SEMA") || die "can't write $SEMA: $!";
print SEMA "$$\n";
close SEMA || die "can't close $SEMA: $!";

MAIN: while (1) {
    open (FIFO, "> $FIFO") || die "can't write $FIFO: $!";
    &load_sigs;
    $sig = $sig[rand @sig];
    print FIFO $name, "\n" x (3 - ($sig =~ tr/\n//)), $sig;
    close FIFO;
    sleep 2; # to avoid dup sigs
}

################################################################

sub setup {
    if (-e $FULLNAME) {
	$name = `cat $FULLNAME`;
	die "$FULLNAME should contain only 1 line, aborting" 
	    if $name =~ tr/\n// > 1;
    } else {
	chop($host = `hostname`);
	($host) = gethostbyname($host) unless $host =~ /\./;
	$user = $ENV{USER} || $ENV{LOGNAME} || $pw[0] || die "intruder alert";
	($name = $pw[6]) =~ s/,.*//;
	$name =~ s/&/$user/g; # can't believe some folks still do this
	$name = "\t$name\t$user\@$host\n";
    } 


    &check_fortunes if !-e $SIGS;

    unless (-p $FIFO) {
	if (!-e _) {
	    system("$MKNOD $FIFO p") && die "can't mknod $FIFO";
	    warn "created $FIFO as a named pipe\n";
	} else {
	    die "$0: won't overwrite file .signature\n";
	} 
    }


    srand(time|$$);
}

sub load_sigs {
    local($sigfile) = &ng;
    if (!-e $sigfile) {
	@sig = (&fortune);
	return;
    } 
    open (SIGS,$sigfile) || die "can't open $sigfile";
    local($/) = "%%\n";
    undef @sig;
    while (<SIGS>) {
	s!$/$!!o;
	push(@sig,$_);
    } 
    close SIGS;
} 

sub ng {
     open ART || return $SIGS;   
     local($/) = '';
     $_ = <ART>;
     ($ng) = /Newsgroups:\s*([^,\s]*)/;
     $ng =~ s!\.!/!g if $NG_IS_DIR; 	# if rn -/,  or SAVEDIR=%p/%c
     $ng = "$NEWS/$ng/SIGNATURES";
     -f $ng ? $ng : $SIGS;
} 

sub fortune {
   local($_, $tries);
   do { 
       $_ = `$FORTUNE -s`; 
   } until tr/\n// < 4 || $tries++ > 20;
   local($*) = 1;
   s/^/ /g;
   $_ || " SIGRAND: deliver random signals to all processes.\n";
} 

sub check_fortunes {
    return if $FORTUNE;
    foreach $dir (split(/:/, $ENV{PATH}), '/usr/games') {
	return if -x ($FORTUNE = "$dir/fortune");
    } 
    die "Need either $SIGS or a fortune program, bailing out";
} 

sub gethome {
    @pw = getpwuid($<);
    $HOME = $ENV{HOME} || $ENV{LOGDIR} || $pw[7]
		       || die "no home directory for user $<";
}

# "There can be only one."  --the Highlander
sub justme {
    if (open SEMA) {
	chop($pid = <SEMA>);
	kill(0, $pid) && die "$0 already running (pid $pid)\n";
	#warn "COOL: no $pid: $!";
	close SEMA;
    } 
} 
__END__
-- 
    Tom Christiansen      tchrist@convex.com      convex!tchrist

One word sums up probably the responsibility of any vice president,
and that one word is 'to be prepared'.  --Vice President Dan Quayle
Newsgroups: comp.unix.questions,comp.unix.programmer,comp.unix.wizards