callfcgi: Improved recvrec implementation.
[ashd.git] / python / htp.c
CommitLineData
4942dacd
FT
1/*
2 ashd - A Sane HTTP Daemon
3 Copyright (C) 2008 Fredrik Tolf <fredrik@dolda2000.com>
4
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17*/
18
19#include <Python.h>
20#include <errno.h>
21
e8b7861a
FT
22#include <ashd/utils.h>
23#include <ashd/proc.h>
4942dacd
FT
24
25static PyObject *p_recvfd(PyObject *self, PyObject *args)
26{
27 int fd, ret;
28 char *data;
29 size_t dlen;
30 PyObject *ro;
31
32 fd = 0;
33 if(!PyArg_ParseTuple(args, "|i", &fd))
34 return(NULL);
b9f22456
FT
35 Py_BEGIN_ALLOW_THREADS;
36 ret = recvfd(fd, &data, &dlen);
37 Py_END_ALLOW_THREADS;
38 if(ret < 0) {
4942dacd
FT
39 if(errno == 0)
40 return(Py_BuildValue("OO", Py_None, Py_None));
41 PyErr_SetFromErrno(PyExc_OSError);
42 return(NULL);
43 }
173e0e9e 44 ro = Py_BuildValue("Ni", PyString_FromStringAndSize(data, dlen), ret);
4942dacd
FT
45 free(data);
46 return(ro);
47}
48
49static PyObject *p_sendfd(PyObject *self, PyObject *args)
50{
b9f22456 51 int sock, fd, ret;
173e0e9e 52 PyObject *data;
4942dacd 53
173e0e9e 54 if(!PyArg_ParseTuple(args, "iiO", &sock, &fd, &data))
4942dacd 55 return(NULL);
173e0e9e
FT
56 if(!PyString_Check(data)) {
57 PyErr_SetString(PyExc_TypeError, "datagram must be a string");
58 return(NULL);
59 }
b9f22456 60 Py_BEGIN_ALLOW_THREADS;
173e0e9e 61 ret = sendfd(sock, fd, PyString_AsString(data), PyString_Size(data));
b9f22456
FT
62 Py_END_ALLOW_THREADS;
63 if(ret < 0) {
4942dacd
FT
64 PyErr_SetFromErrno(PyExc_OSError);
65 return(NULL);
66 }
67 Py_RETURN_NONE;
68}
69
70static PyMethodDef methods[] = {
71 {"recvfd", p_recvfd, METH_VARARGS, "Receive a datagram and a file descriptor"},
72 {"sendfd", p_sendfd, METH_VARARGS, "Send a datagram and a file descriptor"},
73 {NULL, NULL, 0, NULL}
74};
75
173e0e9e 76PyMODINIT_FUNC inithtlib(void)
4942dacd 77{
173e0e9e 78 Py_InitModule("ashd.htlib", methods);
4942dacd 79}