diff --git a/mailcap-server.py b/mailcap-server.py index 5fdf001..c00507d 100755 --- a/mailcap-server.py +++ b/mailcap-server.py @@ -8,6 +8,7 @@ import sys import argparse import daemon import hashlib +import getpass sockpath = "mailcap.sock" @@ -41,20 +42,16 @@ class Server(object): retval += data return retval - def __init__(self, path="mailcap.sock", dir = None): + def __init__(self, path="mailcap.sock"): self._socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) self._socket.bind(path) self._socket.listen(3) - if dir: - if not os.path.exists(dir): - os.makedirs(dir) - self._dir = dir - else: - self._dir = tempfile.TemporaryDirectory(prefix="mailcapd") + if not os.path.exists(dir): + os.makedirs(dir) + self._dir = dir def close(self): self._socket.close() - self._dir.cleanup() def next_file(self, initial_timeout=None, timeout=5): conn = self.Connection(self._socket.accept()[0]) @@ -97,7 +94,7 @@ class Server(object): if data is None: return None - full_name = os.path.join(self._dir.name, fn) + full_name = os.path.join(self._dir, fn) append = 0 # While the filename already exists, check if we have a hash match print("Trying path %s" % (full_name,)) @@ -117,9 +114,9 @@ class Server(object): hash = hashlib.sha256() name_parts = fn.split('.') if len(name_parts) > 1: - full_name = os.path.join(self._dir.name, "%s-%d.%s" % ('.'.join(name_parts[:-1]), append, name_parts[-1])) + full_name = os.path.join(self._dir, "%s-%d.%s" % ('.'.join(name_parts[:-1]), append, name_parts[-1])) else: - full_name = os.path.join(self._dir.name, "%s-%d" % (fn, append)) + full_name = os.path.join(self._dir, "%s-%d" % (fn, append)) print("Accepted filename %s" % (full_name,)) conn.send(b'\x01') @@ -130,7 +127,7 @@ class Server(object): file_len = struct.unpack("!I", data)[0] # Receive the file data - fn = os.path.join(self._dir.name, fn) + fn = os.path.join(self._dir, fn) with open(fn, "wb+") as f: while file_len > 0: data = conn.recv(min(4096, file_len)) @@ -147,24 +144,35 @@ class Server(object): def run_server(args): sv = Server(path=args.socket, dir=args.dir) - caps = mailcap.getcaps() open(args.pid, "w+").write(str(os.getpid())) while True: rv = sv.next_file() if rv: f, mime = rv print(f, mime) + caps = mailcap.getcaps() match = mailcap.findmatch(caps, mime.split(';')[0], filename=f) if match and match[0]: - os.system(match[0]) + pid = os.fork() + if pid != 0: + os.waitid(os.P_PID, pid, os.WEXITED) + else: + pid2 = os.fork() + if pid2 != 0: + exit(0) + else: + os.system(match[0]) if __name__ == "__main__": + tempbase = tempfile.gettempdir() + user = getpass.getuser() + parser = argparse.ArgumentParser() parser.add_argument('--pid', '-p', default=os.path.join(os.environ['HOME'], '.mailcap.pid')) parser.add_argument('--action', '-a', default='run', choices=['run', 'kill']) parser.add_argument('--no-daemonize', '-n', action='store_true') parser.add_argument('--socket', '-s', default=os.path.join(os.environ['HOME'], '.mailcap.sock')) - parser.add_argument('--dir', '-d', default=None) + parser.add_argument('--dir', '-d', default=os.path.join(tempbase, "mailcap-server_" + user)) parser.add_argument('--force', '-f', action='store_true') args = parser.parse_args()