X-Git-Url: http://git.dolda2000.com/gitweb/?a=blobdiff_plain;f=python%2Fashd%2Futil.py;fp=python%2Fashd%2Futil.py;h=15d61b098625b8ac6976d53d42d9949563d44fd9;hb=4e7888f79c780b6d79420374f5ab3843d7784fad;hp=0000000000000000000000000000000000000000;hpb=70d942a7e2c1e7abb4fbddcea5b9c47cf5105590;p=ashd.git diff --git a/python/ashd/util.py b/python/ashd/util.py new file mode 100644 index 0000000..15d61b0 --- /dev/null +++ b/python/ashd/util.py @@ -0,0 +1,49 @@ +import os, socket +import proto + +def stdfork(argv, chinit = None): + csk, psk = socket.socketpair(socket.AF_UNIX, socket.SOCK_SEQPACKET) + pid = os.fork() + if pid == 0: + try: + os.dup2(csk.fileno(), 0) + for fd in xrange(3, 1024): + try: + os.close(fd) + except: + pass + if chinit is not None: + chinit() + os.execvp(argv[0], argv) + finally: + os._exit(127) + csk.close() + fd = os.dup(psk.fileno()) + psk.close() + return fd + +def respond(req, body, status = ("200 OK"), ctype = "text/html"): + if type(body) == unicode: + body = body.decode("utf-8") + if ctype[:5] == "text/" and ctype.find(';') < 0: + ctype = ctype + "; charset=utf-8" + else: + body = str(body) + try: + req.sk.write("HTTP/1.1 %s\n" % status) + req.sk.write("Content-Type: %s\n" % ctype) + req.sk.write("Content-Length: %i\n" % len(body)) + req.sk.write("\n") + req.sk.write(body) + finally: + req.close() + +def serveloop(handler, sock = 0): + while True: + req = proto.recvreq(sock) + if req is None: + break + try: + handler(req) + finally: + req.close()