vhost: CLI delete interface by name
[vpp.git] / vpp-api / python / vpp_papi / pneum_wrap.c
index 7a51197..5763707 100644 (file)
 
 #include <Python.h>
 #include "../pneum/pneum.h"
+#include <vppinfra/hash.h>
 
 static PyObject *pneum_callback = NULL;
 
-int
-wrap_pneum_callback (char *data, int len)
+static void
+wrap_pneum_callback (unsigned char * data, int len)
 {
   PyGILState_STATE gstate;
   PyObject *result;//, *arglist;
@@ -38,30 +39,35 @@ wrap_pneum_callback (char *data, int len)
     PyErr_Print();
 
   PyGILState_Release(gstate);
-  return (0);
 }
 
 static PyObject *
 wrap_connect (PyObject *self, PyObject *args)
 {
-  char *name;
+  char * name, * chroot_prefix = NULL;
   int rv;
-  PyObject *temp;
+  PyObject * temp = NULL;
+  pneum_callback_t cb = NULL;
 
-  if (!PyArg_ParseTuple(args, "sO:set_callback", &name, &temp))
+  if (!PyArg_ParseTuple(args, "s|Os:wrap_connect",
+                       &name, &temp, &chroot_prefix))
     return (NULL);
 
-  if (!PyCallable_Check(temp)) {
-    PyErr_SetString(PyExc_TypeError, "parameter must be callable");
-    return NULL;
-  }
-
-  Py_XINCREF(temp);         /* Add a reference to new callback */
-  Py_XDECREF(pneum_callback);  /* Dispose of previous callback */
-  pneum_callback = temp;       /* Remember new callback */
-
+  if (temp)
+    {
+      if (!PyCallable_Check(temp))
+       {
+         PyErr_SetString(PyExc_TypeError, "parameter must be callable");
+         return NULL;
+       }
+
+      Py_XINCREF(temp);         /* Add a reference to new callback */
+      Py_XDECREF(pneum_callback);  /* Dispose of previous callback */
+      pneum_callback = temp;       /* Remember new callback */
+      cb = wrap_pneum_callback;
+    }
   Py_BEGIN_ALLOW_THREADS
-  rv = pneum_connect(name);
+    rv = pneum_connect(name, chroot_prefix, cb);
   Py_END_ALLOW_THREADS
   return PyLong_FromLong(rv);
 }
@@ -90,8 +96,6 @@ wrap_write (PyObject *self, PyObject *args)
   return PyLong_FromLong(rv);
 }
 
-void vl_msg_api_free(void *);
-
 static PyObject *
 wrap_read (PyObject *self, PyObject *args)
 {
@@ -110,15 +114,44 @@ wrap_read (PyObject *self, PyObject *args)
 #endif
   if (!ret) { Py_RETURN_NONE; }
 
-  vl_msg_api_free(data);
+  pneum_free(data);
   return ret;
 }
 
+static PyObject *
+wrap_msg_table (PyObject *self, PyObject *args)
+{
+  int i = 0, rv = 0;
+  hash_pair_t *hp;
+  uword *h = pneum_msg_table_get_hash();
+  PyObject *ret = PyList_New(pneum_msg_table_size());
+  if (!ret) goto error;
+  hash_foreach_pair (hp, h,
+  ({
+    PyObject *item = PyTuple_New(2);
+    if (!item) goto error;
+    rv = PyTuple_SetItem(item, 0, PyLong_FromLong((u32)hp->value[0]));
+    if (rv) goto error;
+    rv = PyTuple_SetItem(item, 1, PyString_FromString((char *)hp->key));
+    if (rv) goto error;
+    PyList_SetItem(ret, i, item);
+    i++;
+  }));
+
+  return ret;
+
+ error:
+  /* TODO: Raise exception */
+  printf("msg_table failed");
+  Py_RETURN_NONE;
+}
+
 static PyMethodDef vpp_api_Methods[] = {
   {"connect", wrap_connect, METH_VARARGS, "Connect to the VPP API."},
   {"disconnect", wrap_disconnect, METH_VARARGS, "Disconnect from the VPP API."},
   {"write", wrap_write, METH_VARARGS, "Write data to the VPP API."},
   {"read", wrap_read, METH_VARARGS, "Read data from the VPP API."},
+  {"msg_table", wrap_msg_table, METH_VARARGS, "Get API dictionary."},
   {NULL, NULL, 0, NULL}        /* Sentinel */
 };