#!/usr/bin/perl -w $phonebook = "phonebook.txt"; #modemically $dialkillcmd = "killall -9 cu 2>/dev/null;" . "rm -f /var/spool/lock/LCK..modem /var/lock/LCK..modem;" . "chmod 777 /dev/modem;"; $cucmd = "cu -l modem -c"; $dialcmd = $dialkillcmd . $cucmd; #$dialextncmd = $dialkillcmd . "echo Manual dial: "; $dialextncmd = $dialkillcmd . "sleep 1;" . $cucmd; #soundcardwise #$dialcmd = "dial --tone-time 50 --volume 100"; #$dialextncmd = "dial --tone-time 150 --volume 100"; @numbers = (); if ($#ARGV == -1) { system("less -SCri $phonebook"); exit 0; } &parsedirectory($phonebook); if ($ARGV[0] eq "list") { $s = ""; foreach (@numbers) { %n = %{ $_ }; $s .= "\033[2m" if ($n{noring}); $s .= sprintf("%-25s %-25s $n{name}\n", "<".(donumber($n{num})).">", "($n{inpnum})"); $s .= "\033[0m" if ($n{noring}); } if (open(LESS, ("|less -Cri"))) { print LESS $s; close LESS; print "\033[0m"; } else { print $s; } } else { $_ = join(' ', @ARGV); if (/^[\d-]+$/) { print STDERR "Ring <$_> [Yn]? "; $r = &getkey; print "\n"; &dial($_) if (!($r =~ /^n$/i)); } else { $p = $_; @poss = (); %seen = (); foreach (@numbers) { %n = %{ $_ }; if ($n{name} =~ /\b$p\b/i) { if (!defined($seen{$n{num}})) { # uniq push @poss, $_; $seen{$n{num}} = 'yes'; } } } if ($#poss == -1) { print "No match found for $p, hard luck!\n"; } elsif ($#poss == 0) { %n = %{ $poss[0] }; print STDERR "Ring <" . donumber($n{num}) . "> - $n{name} [Ynq]? "; $r = &getkey; print "\n"; &dial(donumber($n{num})) if (!($r =~ /^n$/i || $r =~ /^q$/i)); } else { print "Multiple entries for $p -\n"; $i = 0; foreach (@poss) { %n = %{ $_ }; print " " . ++$i . ". <".donumber($n{num})."> - $n{name}\n"; } do { print "pick [1-$i] or any else to abort ([ \\n] defaults to 1): "; if ($i < 10) { $r = &getkey; print "\n"; } else { print "\b\b then press : "; $r = &getkey_enter; } } while ($r eq ""); $r = 1 if ($r eq " " || $r eq "\n"); if ($r =~ /^[1-9][0-9]*$/) { if ($r >= 1 && $r <= $i) { %n = %{ $poss[$r-1] }; print STDERR "Ringing <".donumber($n{num})."> - $n{name}\n"; &dial(donumber($n{num})); } } } } } sub dial { @n = split(/!/, $_[0]); if ($#n < 0) { die "No number given"; } $n[0] =~ s/-//g; system("$dialcmd $n[0] &"); foreach (@n[1..$#n]) { print STDERR "Press to dial $_ or to quit: "; do { $r = &getkey_silent; } while ($r cmp ' ' && $r cmp 'q'); print "$r\n"; if ($r eq 'q') { system($dialkillcmd); exit 1; } system("$dialextncmd $_ &"); } print STDERR "press any key to kill cu: "; &getkey_silent; system($dialkillcmd); print STDERR "\n"; } sub parsedirectory { @chk = (); $phonedir = $_[0]; open(FP,"$phonedir") || die "Phone directory $phonedir missing: $!\n"; @phone = ; close FP; foreach (@phone) { chomp; s/[ \t]*#.*$//; if (/./) { if (/^:/) { s/^://; push @chk, $_; } else { @_ = split / +|\t[ \t]*/; $p = $_[0]; $n = join(' ', @_[1..$#_]); $r = ($n =~ s/ *\[noring\] *//); $r = 0 if ($r eq ""); $_ = $p; s/^ *//; s/ *$//; $q = $_; $num{$n} = $_; $p = $_; #$p = donumber($p); push @numbers, { num => $p, inpnum => $q, name => $n, noring => $r }; } } } } sub donumber { $temp = $_; $_ = $_[0]; foreach $i (keys(%num)) { s/$i/$num{$i}/; } tr/A-Z/2223334445556667Q77888999Z/; s/(\d{3})(\d{4})/$1-$2/; s/(\d{3})(\d{3})/$1-$2/; $p = $_; #$num{$n} = $p; NUMBER_SUBST: foreach (@chk) { if (/ *\+$/) { $a = $_; $a =~ s/ *,,$//; ($x,$y) = split(/ +|\t[ \t]*/, $a); if ($p =~ /$x/) { $p =~ s/$x/$y/g; } } else { ($x,$y) = split / +|\t[ \t]*/; if ($p =~ /$x/) { eval "\$p =~ s/$x/$y/g"; last NUMBER_SUBST; } } } $_ = $temp; return $p; } #use Term::ReadKey; #sub getkey_silent { # open(TTY, "; close TTY; return $key; } sub getkey { $key = &getkey_silent; # print STDERR ($key eq "\n") ? "" : ($key eq " ") ? "" : $key; return $key; # uncomment this instead if Term::Readkey doesn't exist # return &getkey_enter; } sub getkey_enter { $r = ; if (!defined($r)) { exit 1; } chomp $r; return $r; }