python: Converted ashd.htlib to Python 3 API.
[ashd.git] / python / htp.c
index 0405809..ec4ebab 100644 (file)
@@ -19,8 +19,8 @@
 #include <Python.h>
 #include <errno.h>
 
-#include <utils.h>
-#include <proc.h>
+#include <ashd/utils.h>
+#include <ashd/proc.h>
 
 static PyObject *p_recvfd(PyObject *self, PyObject *args)
 {
@@ -32,29 +32,32 @@ static PyObject *p_recvfd(PyObject *self, PyObject *args)
     fd = 0;
     if(!PyArg_ParseTuple(args, "|i", &fd))
        return(NULL);
-    if((ret = recvfd(fd, &data, &dlen)) < 0) {
+    Py_BEGIN_ALLOW_THREADS;
+    ret = recvfd(fd, &data, &dlen);
+    Py_END_ALLOW_THREADS;
+    if(ret < 0) {
        if(errno == 0)
            return(Py_BuildValue("OO", Py_None, Py_None));
        PyErr_SetFromErrno(PyExc_OSError);
        return(NULL);
     }
-    ro = Py_BuildValue("Ni", PyString_FromStringAndSize(data, dlen), ret);
+    ro = Py_BuildValue("Ni", PyBytes_FromStringAndSize(data, dlen), ret);
     free(data);
     return(ro);
 }
 
 static PyObject *p_sendfd(PyObject *self, PyObject *args)
 {
-    int sock, fd;
-    PyObject *data;
+    int sock, fd, ret;
+    Py_buffer data;
     
-    if(!PyArg_ParseTuple(args, "iiO", &sock, &fd, &data))
+    if(!PyArg_ParseTuple(args, "iiy*", &sock, &fd, &data))
        return(NULL);
-    if(!PyString_Check(data)) {
-       PyErr_SetString(PyExc_TypeError, "datagram must be a string");
-       return(NULL);
-    }
-    if(sendfd(sock, fd, PyString_AsString(data), PyString_Size(data)) < 0) {
+    Py_BEGIN_ALLOW_THREADS;
+    ret = sendfd(sock, fd, data.buf, data.len);
+    Py_END_ALLOW_THREADS;
+    PyBuffer_Release(&data);
+    if(ret < 0) {
        PyErr_SetFromErrno(PyExc_OSError);
        return(NULL);
     }
@@ -67,7 +70,14 @@ static PyMethodDef methods[] = {
     {NULL, NULL, 0, NULL}
 };
 
-PyMODINIT_FUNC inithtlib(void)
+static struct PyModuleDef module = {
+    PyModuleDef_HEAD_INIT,
+    .m_name = "htlib",
+    .m_size = -1,
+    .m_methods = methods,
+};
+
+PyMODINIT_FUNC PyInit_htlib(void)
 {
-    Py_InitModule("ashd.htlib", methods);
+    return(PyModule_Create(&module));
 }