[comp.lang.perl] CBREAK/RAW Input

rbj@uunet.UU.NET (Root Boy Jim) (01/15/91)

HELP! I need to do CBREAK/RAW I/O from a tty.
For debugging purposes I and using /dev/tty,
which is still open as STD{IN,OUT,ERR}.

I am running on SunOS 4.1.1 Perl 3.0@41.
I copied the ioctl.pl from a Sequent (4.2 BSD),
but it seems to jive with #include <sys/ttold.h>.

Here's my relevant (probably ugly) code:

#! /bin/perl

require 'ioctl.pl';

$IN = $0;					# any file will do
open(IN) || die "can't open $0: $!";

&openNDC || die "can't open NDC $!";
while (<IN>) { &authorize; }
&closeNDC || die "can't close NDC $!";
exit(0);

sub openNDC
{
        $sgtty = 'ioekfl';                      # place holder
 
        open(NDC,'+>/dev/tty') ||               # for testing
                die("/dev/tty: $!\n");

        ioctl(NDC,$TIOCGETP,$sgtty) || die("TIOCGETP: $!\n");

        @sgtty=unpack("ccccs",$sgtty);
        @sgtty[4] |= $CBREAK;
        @sgtty[4] &= $ECHO;

        ioctl(NDC,$TIOCSETP,pack('cccs',@sgtty)) ||
                die("TIOCSETP: $!\n");

#	Do I need these?

        select(NDC);    $| = 1;                 # no buffer
        select(STDOUT); $| = 1;                 # no buffer
}
 
sub closeNDC
{
        ioctl(NDC,$TIOCGETP,$sgtty) || die("TIOCGETP: $!\n");
        close(NDC);
}

sub authorize
{
        $ans = 'y';                             # answer
	chop;
        print("authorize $_? ");		# ask

#	Choice of next two methods

        sysread(NDC,$ans,1);                    # get answer
#       $ans = getc(NDC);                       # get answer
        print("$ans\r\n");                      # echo
}
-- 

	Root Boy Jim Cottrell <rbj@uunet.uu.net>
	Close the gap of the dark year in between