head	1.2;
access;
symbols
	RELENG_2_2_8_RELEASE:1.1.1.1
	RELENG_2_2_7_RELEASE:1.1.1.1
	RELENG_2_2_6_RELEASE:1.1.1.1
	RELENG_2_2_5_RELEASE:1.1.1.1
	RELENG_2_2_2_RELEASE:1.1.1.1
	RELENG_2_2_1_RELEASE:1.1.1.1
	RELENG_2_2_0_RELEASE:1.1.1.1
	RELENG_2_1_7_RELEASE:1.1.1.1.6.1
	RELENG_2_1_6_1_RELEASE:1.1.1.1.6.1
	RELENG_2_1_6_RELEASE:1.1.1.1.6.1
	RELENG_2_2:1.1.1.1.0.8
	RELENG_2_2_BP:1.1.1.1
	RELENG_2_1_5_RELEASE:1.1.1.1.6.1
	RELENG_2_1_0_RELEASE:1.1.1.1
	RELENG_2_1_0:1.1.1.1.0.6
	RELENG_2_1_0_BP:1.1.1.1
	RELENG_2_0_5_RELEASE:1.1.1.1
	RELENG_2_0_5:1.1.1.1.0.4
	RELENG_2_0_5_BP:1.1.1.1
	RELENG_2_0_5_ALPHA:1.1.1.1
	RELEASE_2_0:1.1.1.1
	BETA_2_0:1.1.1.1
	ALPHA_2_0:1.1.1.1.0.2
	perl_4_036_bmake:1.1.1.1
	lwall:1.1.1;
locks; strict;
comment	@# @;


1.2
date	98.09.09.06.49.05;	author markm;	state dead;
branches;
next	1.1;

1.1
date	94.09.10.06.27.47;	author gclarkii;	state Exp;
branches
	1.1.1.1;
next	;

1.1.1.1
date	94.09.10.06.27.48;	author gclarkii;	state Exp;
branches
	1.1.1.1.6.1
	1.1.1.1.8.1;
next	;

1.1.1.1.6.1
date	96.06.05.02.42.01;	author jkh;	state Exp;
branches;
next	1.1.1.1.6.2;

1.1.1.1.6.2
date	99.09.05.11.11.11;	author peter;	state Exp;
branches;
next	;

1.1.1.1.8.1
date	99.09.05.11.06.54;	author peter;	state Exp;
branches;
next	;


desc
@@


1.2
log
@Old Perl is leaving us. Goodbye, faithful friend.
@
text
@#! /usr/bin/perl

# $Header: /home/ncvs/src/gnu/usr.bin/perl/eg/g/gsh,v 1.1 1994/09/10 06:27:47 gclarkii Exp $

# Do rsh globally--see man page

$SIG{'QUIT'} = 'quit';			# install signal handler for SIGQUIT

sub getswitches {
    while ($ARGV[0] =~ /^-/) {		# parse switches
	$ARGV[0] =~ /^-h/ && ($showhost++,$silent++,shift(@@ARGV),next);
	$ARGV[0] =~ /^-s/ && ($silent++,shift(@@ARGV),next);
	$ARGV[0] =~ /^-d/ && ($dodist++,shift(@@ARGV),next);
	$ARGV[0] =~ /^-n/ && ($n=' -n',shift(@@ARGV),next);
	$ARGV[0] =~ /^-l/ && ($l=' -l ' . $ARGV[1],shift(@@ARGV),shift(@@ARGV),
				next);
	last;
    }
}

do getswitches();			# get any switches before class
$systype = shift;			# get name representing set of hosts
do getswitches();			# same switches allowed after class

if ($dodist) {				# distribute input over all rshes?
    `cat >/tmp/gsh$$`;			#  get input into a handy place
    $dist = " </tmp/gsh$$";		#  each rsh takes input from there
}

$cmd = join(' ',@@ARGV);			# remaining args constitute the command
$cmd =~ s/'/'"'"'/g;			# quote any embedded single quotes

$one_of_these = ":$systype:";		# prepare to expand "macros"
$one_of_these =~ s/\+/:/g;		# we hope to end up with list of
$one_of_these =~ s/-/:-/g;		#  colon separated attributes

@@ARGV = ();
push(@@ARGV,'.grem') if -f '.grem';
push(@@ARGV,'.ghosts') if -f '.ghosts';
push(@@ARGV,'/etc/ghosts');

$remainder = '';

line: while (<>) {		# for each line of ghosts

    s/[ \t]*\n//;			# trim trailing whitespace
    if (!$_ || /^#/) {			# skip blank line or comment
	next line;
    }

    if (/^(\w+)=(.+)/) {		# a macro line?
	$name = $1; $repl = $2;
	$repl =~ s/\+/:/g;
	$repl =~ s/-/:-/g;
	$one_of_these =~ s/:$name:/:$repl:/;	# do expansion in "wanted" list
	$repl =~ s/:/:-/g;
	$one_of_these =~ s/:-$name:/:-$repl:/;
	next line;
    }

    # we have a normal line

    @@attr = split(' ');			# a list of attributes to match against
					#   which we put into an array
    $host = $attr[0];			# the first attribute is the host name
    if ($showhost) {
	$showhost = "$host:\t";
    }

    $wanted = 0;
    foreach $attr (@@attr) {		# iterate over attribute array
	$wanted++ if index($one_of_these,":$attr:") >= 0;
	$wanted = -9999 if index($one_of_these,":-$attr:") >= 0;
    }
    if ($wanted > 0) {
	print "rsh $host$l$n '$cmd'\n" unless $silent;
	$SIG{'INT'} = 'DEFAULT';
	if (open(PIPE,"rsh $host$l$n '$cmd'$dist 2>&1|")) {	# start an rsh
	    $SIG{'INT'} = 'cont';
	    for ($iter=0; <PIPE>; $iter++) {
		unless ($iter) {
		    $remainder .= "$host+"
			if /Connection timed out|Permission denied/;
		}
		print $showhost,$_;
	    }
	    close(PIPE);
	} else {
	    print "(Can't execute rsh: $!)\n";
	    $SIG{'INT'} = 'cont';
	}
    }
}

unlink "/tmp/gsh$$" if $dodist;

if ($remainder) {
    chop($remainder);
    open(grem,">.grem") || (printf stderr "Can't make a .grem file: $!\n");
    print grem 'rem=', $remainder, "\n";
    close(grem);
    print 'rem=', $remainder, "\n";
}

# here are a couple of subroutines that serve as signal handlers

sub cont {
    print "\rContinuing...\n";
    $remainder .= "$host+";
}

sub quit {
    $| = 1;
    print "\r";
    $SIG{'INT'} = '';
    kill 2, $$;
}
@


1.1
log
@Initial revision
@
text
@d3 1
a3 1
# $Header: /home/cvs/386BSD/ports/lang/perl/eg/g/gsh,v 1.1.1.1 1993/08/23 21:29:44 nate Exp $
@


1.1.1.1
log
@Initial import of Perl 4.046 bmaked

@
text
@@


1.1.1.1.8.1
log
@$Id$ -> $FreeBSD$
@
text
@d3 1
a3 1
# $Header: /home/ncvs/src/gnu/usr.bin/perl/eg/g/Attic/gsh,v 1.1.1.1 1994/09/10 06:27:48 gclarkii Exp $
@


1.1.1.1.6.1
log
@This 3rd mega-commit should hopefully bring us back to where we were.
I can get it to `make world' succesfully, anyway!
@
text
@d3 1
a3 1
# $Header: /pub/FreeBSD/FreeBSD-CVS/src/gnu/usr.bin/perl/eg/g/gsh,v 1.1.1.1 1994/09/10 06:27:48 gclarkii Exp $
@


1.1.1.1.6.2
log
@$Id$ -> $FreeBSD$
@
text
@d3 1
a3 1
# $FreeBSD$
@

