X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=chiark-utils.git;a=blobdiff_plain;f=scripts%2Frandom-word;h=649af152a3c074a55be6e3b3ef33e081ec03881f;hp=a7a27999fd9589cdeb025eb5e4c16bacd42e5ebe;hb=041833cff43c78a9c588590473977632649de31b;hpb=e7284b3f690305c0dca5d2c16b961da3c86bcf4f diff --git a/scripts/random-word b/scripts/random-word index a7a2799..649af15 100755 --- a/scripts/random-word +++ b/scripts/random-word @@ -1,26 +1,47 @@ -#!/usr/bin/perl +#!/usr/bin/perl -w + +# Copyright 2004 Ian Jackson +# +# This script and its documentation (if any) are free software; you +# can redistribute it and/or modify them under the terms of the GNU +# General Public License as published by the Free Software Foundation; +# either version 3, or (at your option) any later version. +# +# chiark-named-conf and its manpage are distributed in the hope that +# it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, consult the Free Software Foundation's +# website at www.fsf.org, or the GNU Project website at www.gnu.org. + +use strict; use IO::Handle; use IO::File; use POSIX; -$want= 1; -$filename= "/usr/share/dict/words"; -@randfile= ("/dev/urandom", "/dev/random"); +our $want= 1; +our $filename= "/usr/share/dict/words"; +our @randfile= ("/dev/urandom", "/dev/random"); +our $filemaxlen; sub fail ($) { die "random-word: $_[0]\n"; } open D, ">/dev/null" or fail("open /dev/null: $!"); -while ($ARGV[0] =~ m/^\-/) { +while (@ARGV && $ARGV[0] =~ m/^\-/) { $_= shift @ARGV; if (m/^\-\-?$/) { last; } elsif (m/^\-n(\d+)$/) { $want= $1; } elsif (m/^\-f/ && length > 2) { - $filename= $'; + $filename= $'; #'; + } elsif (m/^\-F(\d+)$/) { + $filemaxlen= $1; } elsif (m/^\-r/ && length > 2) { - @randfile= ($'); + @randfile= ($'); #'); } elsif (m/^\-D$/) { open D, ">&STDERR" or fail("dup stderr for debug: $!"); } else { @@ -33,6 +54,9 @@ sub debug ($) { or fail("write debug: $!"); } +our $randfile; +our $r; + for $randfile (@randfile) { $r= new IO::File "$randfile", 'r'; debug("open $randfile ".($r ? "ok" : "failed $!")); @@ -42,17 +66,28 @@ for $randfile (@randfile) { $r or fail("could not open any random device: $!\n (tried @randfile)"); $r->autoflush(0); -$w= new IO::File $filename, 'r'; +our $w= new IO::File $filename, 'r'; $w or fail("cannot open $filename: $!"); debug("open $filename ok"); -@words= <$w>; +our @words; +if (defined $filemaxlen) { + while (@words < $filemaxlen) { + my $l = <$w>; + last unless defined $l; + push @words, $l; + } +} else { + @words= <$w>; +} $w->error and fail("cannot read $filename: $!"); debug("read $filename ok"); +our @out; while (@out < $want) { + my $rbytes; $!=0; read $r,$rbytes,4; length $rbytes==4 or fail("cannot read $randfile: $!"); - $wordno= unpack 'L',$rbytes; + my $wordno= unpack 'L',$rbytes; $wordno &= ~0x80000000; $wordno %= @words; $_= $words[$wordno];