#!/usr/bin/perl -w # # Signatures should be seperated by a % on it's own line, eg: # # I like pies in the sky. # % # Milk and cookies are also nice. # # Especially cold milk. # % # JAPH # % # <% `uptime` %> # use strict; use Fcntl qw(:DEFAULT :flock); my $signature = "$ENV{HOME}/.signature"; # The FIFO. my $sigs_data = "$ENV{HOME}/.randsig.dat"; # Sigs go in here. my $pid_file = "$ENV{HOME}/.randsig.pid"; my $seperator = "%"; # See if the randsig.pid file exists, and whether or not # the file has a lock on it (just to check to see if randsig # is already running. If it is locked then exit gracefully. if (-e $pid_file) { sysopen PID_F, $pid_file, O_RDWR|O_CREAT or die "Couldn't open '$pid_file': $!\n"; exit unless flock PID_F, LOCK_EX|LOCK_NB; print PID_F $$ + 1; # I know... but I'm just too lazy. } $0 =~ s#.*/##; print "$0: going into background.\n"; fork && exit; my ($l_mod, @sigs) = 0; while (1) { # Compare last modified timestamps of the sigs data file. my $n_mod = (stat($sigs_data))[9] || $l_mod; if ($n_mod != $l_mod) { $l_mod = $n_mod; @sigs = get_sigs(); } my $sig = $sigs[rand @sigs]; $sig =~ s#<%\s+(.*?)\s+%>#eval $1#eg; sysopen SIG_F, $signature, O_WRONLY|O_TRUNC or die "Couldn't open '$signature': $!\n"; print SIG_F $@ ? $@ : $sig; close SIG_F; sleep 1; } sub get_sigs { sysopen SIGS_F, $sigs_data, O_RDONLY or die "Couldn't open '$sigs_data': $!\n"; local $/ = "\n$seperator\n"; return map { s#^\n##; s#%$##; s#\n$##g; $_ } ; }