I spent the last day and a half writing a vaguely interesting Perl
module for testing some code which gives a subtly different answer
each time (i.e. incorporates data from time() and /dev/urandom) and
has side effects (i.e. writes to the file system).
By overriding Perl's built-in 'open' function, it is possible to
prefix each filename with the location of a temporary directory,
effectively emulating chroot(). I also replaced Perl's time() with
one that always returned the same answer. This meant that the login
code I was testing would return a reliable result.
You have to be careful with prototypes. Spot the difference:
my $result = gmtime(time+$seconds);
my $result = gmtime(time()+$seconds);
Without adding a prototype to the new time() function, these will
give different answers. I now have to go back to work tomorrow and
close a bug I mistakenly filed. :)
I'm hoping to finish off my evil hacky overriding module and
release it to CPAN. I want to add some routines to set up and tear
down temporary chroot directories. Obviously there are some
limitations to my approach; I'm not currently handling relative paths
very well, and system() calls will not be "chrooted". But it should
be quite handy and reusable in any case.