summaryrefslogtreecommitdiff
path: root/gpsfake
diff options
context:
space:
mode:
authorEric S. Raymond <esr@thyrsus.com>2005-06-22 17:45:16 +0000
committerEric S. Raymond <esr@thyrsus.com>2005-06-22 17:45:16 +0000
commit480a8cc26dcacae900bd13fa7a22e2914cc4bc15 (patch)
tree2d86cbb1da59613c5e2beb2d0f929477eea3a447 /gpsfake
parent78b24c3dcb50fdfa39779f9594b647b7f1f97638 (diff)
downloadgpsd-480a8cc26dcacae900bd13fa7a22e2914cc4bc15.tar.gz
Daemon control is now encapsulated.
Diffstat (limited to 'gpsfake')
-rwxr-xr-xgpsfake73
1 files changed, 54 insertions, 19 deletions
diff --git a/gpsfake b/gpsfake
index 589ab0a8..ef0ef86c 100755
--- a/gpsfake
+++ b/gpsfake
@@ -144,6 +144,54 @@ class FakeGPS:
i += 1
return True
+class DaemonInstance:
+ def __init__(self, control_socket):
+ self.sockfile = None
+ self.pid = None
+ self.control_socket = control_socket
+ self.pidfile = "/tmp/gpsfake_pid-%s" % os.getpid()
+ def spawn(self, doptions, background=False, gdb=False):
+ "Spawn a daemon instance."
+ spawncmd = "gpsd -N -P %s %s" % (self.pidfile, doptions)
+ spawncmd = spawncmd.strip()
+ if gdb:
+ spawncmd = "gdb --args " + spawncmd
+ if background:
+ spawncmd += " &"
+ os.system(spawncmd)
+ def wait_pid(self):
+ "Get the running daeomon's PID from where it's written."
+ while True:
+ try:
+ fp = open(self.pidfile)
+ except IOError:
+ time.sleep(1)
+ continue
+ self.pid = int(fp.read())
+ fp.close()
+ break
+ def __del__(self):
+ "Kill the daemon instance and remove its pid file."
+ if self.pid:
+ os.kill(self.pid, signal.SIGTERM)
+ if os.path.exists(self.pidfile):
+ os.remove(self.pidfile)
+ def gpsd_control_connect(self):
+ "Acquire a connection to the GPSD control socket."
+ if not os.path.exists(self.control_socket):
+ return None
+ try:
+ sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM, 0)
+ sock.connect(self.control_socket)
+ self.sockfile = sock.makefile()
+ except socket.error, msg:
+ if sock:
+ sock.close()
+ sock = None
+ self.sockfile = None
+ return self.sockfile
+
+
# Main sequence
def fakehook(linenumber, fakegps):
@@ -215,18 +263,15 @@ except OSError:
raise SystemExit, 1
if verbose:
sys.stderr.write("gpsfake: interpreting as %s packets\n" % testload.packtype)
-pidfile = "/tmp/gpsfake_pid-%s" % os.getpid()
-spawncmd = "gpsd -N -P %s %s %s" % (pidfile, doptions, fakegps.slave)
-spawncmd = spawncmd.strip()
-if gdb:
- spawncmd = "gdb --args " + spawncmd
+
+daemon = DaemonInstance("/tmp/gpsfake-%d.sock" % os.getpid())
# Next step: Launch the daemon and the thread to monitor it
child = os.fork()
if child:
# Parent side
try:
- os.system(spawncmd)
+ daemon.spawn(doptions + " " + fakegps.slave)
except OSError:
sys.stderr.write("gpsfake: '%s' failed.\n" % spawncmd)
os.kill(child, signal.SIGTERM)
@@ -235,16 +280,7 @@ if child:
sys.exit(0)
else:
# Child side -- wait for daemon to make pidfile so we know it's running
- while True:
- try:
- fp = open(pidfile)
- except IOError:
- time.sleep(1)
- continue
- pid = int(fp.read())
- fp.close()
- os.remove(pidfile)
- break
+ daemon.wait_pid()
if not pipe or verbose:
sys.stderr.write("gpsfake: '%s' launch OK.\n" % spawncmd)
@@ -255,7 +291,7 @@ else:
sys.stderr.write("gpsfake: gpsd unreachable.\n")
raise SystemExit, 1
try:
- status = fakegps.feed(pid, fakehook)
+ status = fakegps.feed(daemon.pid, fakehook)
except KeyboardInterrupt:
status = True
if not status:
@@ -264,6 +300,5 @@ else:
baton.end()
sys.stdout.write("".join(fakegps.responses))
finally:
- if pid:
- os.kill(pid, signal.SIGTERM)
+ del daemon
sys.exit(0)