# This software was originally developed as a part of a project paid for by
# UNINETT, Norway.

import os, signal

class subproc:
   def __init__(self, path, args):
      self.path = path
      self.args = args
      self.subout, new_out = os.pipe()
      new_in, self.subin = os.pipe()
      pid = os.fork()
      if pid:
         os.close(new_in); os.close(new_out)
         self.pid = pid
      else:
         os.dup2(new_in, 0); os.dup2(new_out, 1)
         os.close(new_in); os.close(new_out)
         os.execvp(path, args)
   def restart(self):
      self.close()
      self.__init__(self.path, self.args)
   def fileno(self):
      return self.readfd()
   def child_status(self):
      return os.waitpid(self.pid, os.WNOHANG)
   def child_pid(self):
      return self.pid
   def read(self, n):
      return os.read(self.subout, n)
   def write(self, text):
      return os.write(self.subin, text)
   def readfd(self):
      return self.subout
   def writefd(self):
      return self.subin
   def kill(self, sig):
      return os.kill(self.pid, sig)
   def close(self):
      try:
         os.kill(self.pid, signal.SIGTERM)
         os.close(self.subin); os.close(self.subout)
         return os.waitpid(self.pid, os.WNOHANG)
      except:
         return None

class wsubproc(subproc):
   def fileno(self):
      return self.writefd()

if __name__ == "__main__":
   import sys
   test = subproc("ls", ["ls","-l"])
   data = test.read(1024)
   while data:
      sys.stdout.write(data)
      data = test.read(1024)
