import vfs

class proc(object):
	def __init__(self,man,user,grp,uin,uout,uerr,prog,arg):
		self.man = man		#process manager
		self.user = user	#process owner name
		self.grp = grp		#process group name
		self.uin = uin		#input channel
		self.uout = uout	#ouput channel
		self.uerr = uerr	#error channel
		self.prog = prog(self,arg)	#the program
		self.status = 'running'	#'running' 'stopped' 'killed' 'ended' 'bg'

	def do(self):
		self.prog.do()
		#do stdio operation too

class procman(object):
	def __init__(self,fs):
		self.fs = fs		#all go from filesystem
		self.procs = {}		#all procs key by pid

	def job(self,pid):
		return self.proc[pid].status

	def new_proc(self,user,grp,uin,uout,uerr,prog,arg):
		pid = 0
		self.procs[pid] = proc(self,user,grp,uin,uout,uerr,prog,arg)
		return pid

	def kill(self,pid):
		del self.proc[pid]

	def do(self):
		for pid in self.procs:
			run = self.procs[pid]
			if run.status == 'ended':
				del self.proc[pid]
			else:
				run.do()


class program(object):
	def __init__(self,prog_proc,prog_arg):
		self.proc = prog_proc
		self.arg = prog_arg

	def read(self,fileid):
		fileobj = self.proc.man.fs.get_nod(fileid)
		if fileobj:
			return fileobj.read(self.proc.user,self.proc.grp)
		else:
			return None

	def write(self,fileid,data):
		fileobj = self.proc.man.fs.get_nod(fileid)
		if fileobj:
			return fileobj.write(self.proc.user,self.proc.grp,data)
		else:
			return None

	def stdin(self):
		return self.read(self.proc.uin)

	def stdout(self,data):
		return self.write(self.proc.uout,data)

	def stderr(self,error):
		return self.write(self.proc.uerr,error)

	def do():
		pass

if __name__=="__main__":
	euh = vfs.build_root()

	import bin

	ls = euh.get_nod('/bin/ls').read('root','root')

	bof = procman(euh)
	nu = bof.new_proc('root','root','/usr/home/in','/usr/home/out','/usr/home/err',ls,'/usr/home')

	bof.do()

	mo = euh.get_nod('/usr/home/out')
	no = mo.read('root','root')
	print no
	
