python: Added a util module and moved serveloop thence.
[ashd.git] / python / ashd / util.py
1 import os, socket
2 import proto
3
4 def stdfork(argv, chinit = None):
5     csk, psk = socket.socketpair(socket.AF_UNIX, socket.SOCK_SEQPACKET)
6     pid = os.fork()
7     if pid == 0:
8         try:
9             os.dup2(csk.fileno(), 0)
10             for fd in xrange(3, 1024):
11                 try:
12                     os.close(fd)
13                 except:
14                     pass
15             if chinit is not None:
16                 chinit()
17             os.execvp(argv[0], argv)
18         finally:
19             os._exit(127)
20     csk.close()
21     fd = os.dup(psk.fileno())
22     psk.close()
23     return fd
24
25 def respond(req, body, status = ("200 OK"), ctype = "text/html"):
26     if type(body) == unicode:
27         body = body.decode("utf-8")
28         if ctype[:5] == "text/" and ctype.find(';') < 0:
29             ctype = ctype + "; charset=utf-8"
30     else:
31         body = str(body)
32     try:
33         req.sk.write("HTTP/1.1 %s\n" % status)
34         req.sk.write("Content-Type: %s\n" % ctype)
35         req.sk.write("Content-Length: %i\n" % len(body))
36         req.sk.write("\n")
37         req.sk.write(body)
38     finally:
39         req.close()
40
41 def serveloop(handler, sock = 0):
42     while True:
43         req = proto.recvreq(sock)
44         if req is None:
45             break
46         try:
47             handler(req)
48         finally:
49             req.close()