python: Added a util module and moved serveloop thence.
[ashd.git] / python / ashd / util.py
CommitLineData
4e7888f7
FT
1import os, socket
2import proto
3
4def 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
25def 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
41def 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()