#!/usr/bin/perl
#
# baud - Run commands safley at their native baud, eg 2400, 9600, etc.
#
# This allows older commands to be executed safely at their original native baud.
# Commands are now often run over high speed telnet or ssh sessions, at speeds
# they were not designed for - sometimes called "overbauding". Overbauding
# can cause command overheating, resulting in Command Fault Heat State Exception
# (CFHSE) errors.
#
# Many command line programs, especially those for Unix, were orginially written
# to run at bauds such as 300, 1200, 2400 or even 9600. This was the days of serial
# connections to teletypes or dumb terminals (aka glass teletypes, green screens,
# etc). While links to servers have increased in speed, the code for most commands
# has remained the same. Some operating systems have a man page, fastcommands(5),
# that lists commands that are high speed link safe.
#
# Most Unix commands can be run at 2400 baud, vi or emacs may be run at 9600.
#
# 02-Jul-2005, ver 1.20
#
# USAGE: baud [-baudrate] [command]
# eg,
# baud ls -l # defaults to 2400 baud
# baud -2400 ls -l # running ls at 2400 baud
# baud -9600 vi /etc/motd # running vi at 9600 baud
# ls -l | baud # read from pipe
#
# COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is 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, write to the Free Software Foundation,
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# (http://www.gnu.org/copyleft/gpl.html)
#
# 08-Nov-2004 Brendan Gregg Created this.
$| = 1;
#
# Command Line Arguments
#
&usage() if $ARGV[0] eq "-h";
&usage() if $ARGV[0] eq "--help";
if ($ARGV[0] =~ /^-(\d+)/) {
$baud = $1;
shift(@ARGV);
} else {
$baud = 2400;
}
$command = "@ARGV";
$delay = 10/$baud;
#
# Run Command
#
if ($command ne "") {
close(STDIN);
open(STDIN,"$command |");
}
# else read from STDIN
#
# Process Input
#
while (sysread(STDIN,$key,1)) {
print $key;
$pause += $delay;
if ($pause > 0.01) {
select(undef, undef, undef, $pause);
$pause = 0;
}
}
close STDIN;
#
# Subroutines
#
sub usage {
print STDERR <