diff --git a/runxboxdrv/runxboxdrv b/runxboxdrv/runxboxdrv index fcfa629..c2efb66 100755 --- a/runxboxdrv/runxboxdrv +++ b/runxboxdrv/runxboxdrv @@ -2,15 +2,43 @@ import os, sys import fcntl +import time import ConfigParser from subprocess import check_call, Popen, PIPE -from signal import SIGINT +from signal import SIGINT, SIGKILL from asyncproc import Process, with_timeout, Timeout +XBOXDRVNAME = "xboxdrv" +LOADEDTEXT = "quit" + class RunXBoxDrv(object): def __init__(self, configfile, appandparams=[]): self.configfile = configfile self.appandparams = appandparams + if self.killExistingXBoxDrv(SIGINT, "SIGINT"): + time.sleep(1) + if self.killExistingXBoxDrv(SIGINT, "SIGINT again"): + time.sleep(1) + if self.killExistingXBoxDrv(SIGKILL, "SIGKILL"): + time.sleep(1) + + @staticmethod + def killExistingXBoxDrv(sig, signame): + callps = Popen("ps", shell=True, stdout=PIPE) + outputps = callps.communicate() + print outputps + lines = outputps[0].split("\n") + for line in lines: + fields = line.split() + if len(fields) < 4: + continue + pid = fields[0] + process = fields[3] + if process.find(XBOXDRVNAME) != -1: + print "Using %s on existing %s" % (signame, XBOXDRVNAME) + os.kill(int(pid), sig) + return True + return False @staticmethod def checkminusvalue(key, value): @@ -33,6 +61,13 @@ class RunXBoxDrv(object): buf = "%s%s" % (buf, out) return buf + @staticmethod + def checkLoaded(myProc): + out = "" + while out.lower().find(LOADEDTEXT) == -1: + out = RunXBoxDrv.getNext(myProc) + print out + def process(self): parser = ConfigParser.ConfigParser() parser.optionxform = str @@ -41,7 +76,7 @@ class RunXBoxDrv(object): raise Exception("XBoxDrv game config not found: " + self.configfile) cfg = dict([(s, dict(parser.items(s))) for s in parser.sections()]) - commandlist = ["xboxdrv"] + commandlist = [XBOXDRVNAME] for sectionname in cfg: section = cfg[sectionname] if sectionname == "options": @@ -61,10 +96,7 @@ class RunXBoxDrv(object): commandlist.append(paramline[:-1]) print commandlist myProc = Process(commandlist) - out = "" - while out.lower().find("quit") == -1: - out = self.getNext(myProc) - print out + with_timeout(1, self.checkLoaded, myProc) if len(self.appandparams) == 0: print("WARNING: No path to application specified!") else: