ttycat
author A.M. Thurnherr <athurnherr@yahoo.com>
Fri, 03 Jul 2020 10:25:08 -0400
changeset 12 5e67754f6457
parent 0 648bde652211
permissions -rwxr-xr-x
V1.6: no more master/slave terminology
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
     1
#!/usr/local/bin/perl
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
     2
#======================================================================
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
     3
#                    T T Y C A T 
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
     4
#                    doc: Tue Aug  8 13:58:51 2006
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
     5
#                    dlm: Tue Oct  3 12:15:33 2006
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
     6
#                    (c) 2006 turbulence@
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
     7
#                    uE-Info: 15 57 NIL 0 0 72 10 2 8 NIL ofnI
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
     8
#======================================================================
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
     9
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    10
# read from tty, write to stdout
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    11
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    12
# HISTORY:
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    13
#  Aug  8, 2006: - created from [bbabble] on DYNAMUCK cruise
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    14
#  Oct  3, 2006: - added -B)reak
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    15
#	         - added dummy -n for [find_comms_params]
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    16
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    17
use Getopt::Std;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    18
use POSIX ();
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    19
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    20
#----------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    21
# Usage
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    22
#----------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    23
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    24
$USAGE = "Usage: $0 [-b)aud <rate[9600]>] " .
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    25
		   "[-d)ata <bits[8]>] [-s)top <bits[1]>] " .
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    26
	 	   "[-e)ven | -o)dd | -n)o parity] " .
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    27
	 	   "[send -B)reak] " .
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    28
		   "<tty device>\n";
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    29
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    30
die($USAGE) unless (getopts('Bb:d:ns:eo'));
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    31
die($USAGE) if ($opt_e+$opt_o+$opt_n > 1);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    32
die($USAGE) unless (@ARGV == 1);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    33
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    34
$opt_b = 9600 unless defined($opt_b);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    35
$opt_s = 1    unless defined($opt_s);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    36
$opt_d = 8    unless defined($opt_d);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    37
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    38
die("$0: data bits must be 5, 6, 7 or 8\n")
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    39
	unless ($opt_d >= 5 && $opt_d <= 8);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    40
die("$0: stop bits must be 1 or 2\n")
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    41
	unless ($opt_s == 1 || $opt_s == 2);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    42
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    43
$TTY = $ARGV[0];
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    44
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    45
#----------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    46
# determine correct tcsetospeed() argument for non-POSIX speeds
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    47
#----------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    48
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    49
# This is ugly, slow, but seems fairly portable.
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    50
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    51
open(TMP,'>/tmp/tt.c');
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    52
print(TMP "#include <termios.h>\nB$opt_b\n");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    53
close(TMP);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    54
$SPEED = `gcc -E /tmp/tt.c | tail -1`;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    55
$SPEED = hex($SPEED) if ($SPEED =~ /^0x/);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    56
$SPEED = oct($SPEED) if ($SPEED =~ /^0/);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    57
unlink('/tmp/tt.c');
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    58
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    59
#----------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    60
# setup TTY
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    61
#----------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    62
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    63
print(STDERR "Opening $TTY...");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    64
my($sfd);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    65
open(TTY,$TTY) || die(" $!\n");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    66
$sfd = fileno(TTY);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    67
print(STDERR "\n");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    68
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    69
print(STDERR "Configuring $TTY...");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    70
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    71
my($t) = POSIX::Termios::new();
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    72
die(" tcgetattr: $!\n")
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    73
	unless defined($t->getattr($sfd));
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    74
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    75
$t->setiflag($t->getiflag() & ~(POSIX::IGNBRK() |
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    76
				POSIX::BRKINT() |
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    77
				POSIX::PARMRK() |
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    78
				POSIX::ISTRIP() |
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    79
				POSIX::INLCR()	|
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    80
				POSIX::IGNCR()	|
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    81
				POSIX::ICRNL()	|
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    82
				POSIX::IXON()));
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    83
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    84
$t->setoflag($t->getoflag() & ~POSIX::OPOST());
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    85
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    86
$t->setlflag($t->getlflag() & ~(POSIX::ECHO() |
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    87
				POSIX::ECHONL() |
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    88
				POSIX::ICANON() |
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    89
				POSIX::ISIG() |
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    90
				POSIX::IEXTEN()));
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    91
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    92
$cf = $t->getcflag();
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    93
	$cf &= ~POSIX::CSIZE();				# word length
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    94
	$cf |= POSIX::CS5() if ($opt_d == 5);	
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    95
	$cf |= POSIX::CS6() if ($opt_d == 6);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    96
	$cf |= POSIX::CS7() if ($opt_d == 7);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    97
	$cf |= POSIX::CS8() if ($opt_d == 8);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    98
	$cf &= ~POSIX::CSTOPB();			# stop bits
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    99
	$cf |= POSIX::CSTOPB() if ($opt_s == 2);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   100
	$cf &= ~POSIX::PARENB(); 			# parity
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   101
	if ($opt_e || $opt_o) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   102
		$cf |= POSIX::PARENB();
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   103
		$cf |= POSIX::PARODD() if $opt_o;
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   104
	}
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   105
$t->setcflag($cf);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   106
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   107
$t->setcc(POSIX::VMIN,1);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   108
$t->setcc(POSIX::VTIME,0);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   109
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   110
$t->setispeed($SPEED);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   111
$t->setospeed($SPEED);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   112
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   113
die(" tcsetattr: $!\n")
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   114
	unless defined($t->setattr($sfd,POSIX::TCSANOW));
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   115
print(STDERR "\n");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   116
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   117
#----------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   118
# send BREAK if requested
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   119
#----------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   120
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   121
if ($opt_B) {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   122
	print(STDERR "Sending BREAK...");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   123
	die(" tcsendbreak: $!\n")
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   124
		unless defined(POSIX::tcsendbreak($sfd,0));
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   125
	print(STDERR "\n");
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   126
}
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   127
	    
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   128
#----------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   129
# TTY reader
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   130
#----------------------------------------------------------------------
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   131
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   132
do {
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   133
	my($buf,$nread);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   134
	$nread = POSIX::read($sfd,$buf,64);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   135
	POSIX::write(1,$buf,$nread);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   136
} while ($nread >= 0);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   137
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   138
exit(0);
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   139
648bde652211 created from V1.4beta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
   140