Perl4-CoreLibs
view release on metacpan or search on metacpan
lib/chat2.pl view on Meta::CPAN
## &chat::close([$handle,])
## $handle is from previous &chat::open().
## like close $handle
sub close { ## public
if ($_[0] =~ /$nextpat/) {
*S = shift;
}
close(S);
if (defined $S{"needs_close"}) { # is it a listen socket?
local(*NS) = $S{"needs_close"};
delete $S{"needs_close"};
close(NS);
}
}
## @ready_handles = &chat::select($timeout, @handles)
## select()'s the handles with a timeout value of $timeout seconds.
## Returns an array of handles that are ready for I/O.
## Both user handles and chat handles are supported (but beware of
## stdio's buffering for user handles).
sub select { ## public
local($timeout) = shift;
local(@handles) = @_;
local(%handlename) = ();
local(%ready) = ();
local($caller) = caller;
local($rmask) = "";
for (@handles) {
if (/$nextpat/o) { # one of ours... see if ready
local(*SYM) = $_;
if (length($SYM)) {
$timeout = 0; # we have a winner
$ready{$_}++;
}
$handlename{fileno($_)} = $_;
} else {
$handlename{fileno(/(?:::|')/ ? $_ : "$caller\::$_")} =
$_;
}
}
for (sort keys %handlename) {
vec($rmask, $_, 1) = 1;
}
select($rmask, undef, undef, $timeout);
for (sort keys %handlename) {
$ready{$handlename{$_}}++ if vec($rmask,$_,1);
}
sort keys %ready;
}
# ($pty,$tty) = $chat::_getpty(PTY,TTY):
# internal procedure to get the next available pty.
# opens pty on handle PTY, and matching tty on handle TTY.
# returns undef if can't find a pty.
# Modify "/dev/pty" to "/dev/pts" for Dell Unix v2.2 (aka SVR4.04). Joe Doupnik.
sub _getpty { ## private
local($_PTY,$_TTY) = @_;
$_PTY =~ s/^([^':]+)$/(caller)[$[]."::".$1/e;
$_TTY =~ s/^([^':]+)$/(caller)[$[]."::".$1/e;
local($pty, $tty, $kind);
if( -e "/dev/pts000" ){ ## mods by Joe Doupnik Dec 1992
$kind = "pts"; ## SVR4 Streams
} else {
$kind = "pty"; ## BSD Clist stuff
}
for $bank (112..127) {
next unless -e sprintf("/dev/$kind%c0", $bank);
for $unit (48..57) {
$pty = sprintf("/dev/$kind%c%c", $bank, $unit);
open($_PTY,"+>$pty") || next;
select((select($_PTY), $| = 1)[0]);
($tty = $pty) =~ s/pty/tty/;
open($_TTY,"+>$tty") || next;
select((select($_TTY), $| = 1)[0]);
system "stty nl>$tty";
return ($pty,$tty);
}
}
undef;
}
1;
( run in 0.525 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )