#!/usr/bin/env python

import os
import sys
import string

#def no_eol(line):
#    if sys.line[-1:] == '\n':
#        return line[:-1]
#    else:
#        return line

def usage(retval):
    sys.stderr.write('%s sets up multiple pipes and sends a copy of stdin to each of them\n' % sys.argv[0])
    sys.stderr.write('\n')
    sys.stderr.write('Usage: %s [-f file_of_commands1] [-f file_of_commands2] ... [-f file_of_commandsn] [-h] [--] command1 command2 ... commandn\n' % sys.argv[0])
    sys.stderr.write('\n')
    sys.stderr.write('-h shows this help message\n')
    sys.stderr.write('-- signals the end of options, so that commands may start with a "-"\n')
    sys.stderr.write('-f filename reads commands to set up pipes with, one command per line\n')
    sys.stderr.write('-q says to operate quietly\n')
    sys.stderr.write('commandx says to use commandx to set up a pipe\n')
    sys.exit(retval)

commands = []
quiet = 0

while sys.argv[1:] and sys.argv[1][0:1] == '-':
    if sys.argv[1] == '--':
        del sys.argv[1]
        break
    elif sys.argv[1] == '-f' and sys.argv[2:]:
        filename = sys.argv[2]
        commands += open(filename, 'r').readlines()
        del sys.argv[1]
    elif sys.argv[1] == '-h':
        usage(0)
    elif sys.argv[1] == '-q':
        quiet = 1
    else:
        sys.stderr.write('%s: Illegal option: %s\n' % (sys.argv[0], sys.argv[1]))
        usage(1)
    del sys.argv[1]

commands += sys.argv[1:]

# Bourne shell (or bash, as the case may be) doesn't care about leading and trailing whitespace anyway
commands = map(string.strip, commands)

pipes=[]
if not quiet:
    sys.stderr.write('Creating %d pipes\n' % len(commands))
for i in xrange(len(commands)):
    if not quiet:
        sys.stderr.write('popening command %d: %s\n' % (i, commands[i]))
    pipes.append([os.popen(commands[i],'w'),1])
    
eof = 0
while 1:
    at_least_one_pipe_remains=0
    buf = sys.stdin.read(1024 * 1024)
    if not buf:
        eof = 1
        break
    for p in xrange(len(pipes)):
        if pipes[p][1]:
            try:
                pipes[p][0].write(buf)
                at_least_one_pipe_remains = 1
            except:
                if not quiet:
                    sys.stderr.write('terminated: %s\n' % commands[p])
                pipes[p][1] = 0
    if not at_least_one_pipe_remains:
        break

if eof:
    for p in xrange(len(pipes)):
        if pipes[p][1]:
            pipes[p][0].close()