static PyObject *setCapabilities(PyObject *self, PyObject *args, PyObject *keywds) { PyObject *PyCpblts; Py_ssize_t l, i; int ret; char *item; static char *kwlist[] = {"list", NULL}; PyObject *PyStr; if (! PyArg_ParseTupleAndKeywords(args, keywds, "O!", kwlist, &PyList_Type, &PyCpblts)) { return (NULL); } if ((l = PyList_Size(PyCpblts)) < 1) { PyErr_SetString(PyExc_ValueError, "The capabilities list must not be empty."); return (NULL); } nc_cpblts_free(global_cpblts); global_cpblts = nc_cpblts_new(NULL); for (i = 0; i < l; i++) { PyObject *PyUni = PyList_GetItem(PyCpblts, i); Py_INCREF(PyUni); if (!PyUnicode_Check(PyUni)) { PyErr_SetString(PyExc_TypeError, "Capabilities list must contain strings."); nc_cpblts_free(global_cpblts); global_cpblts = NULL; Py_DECREF(PyUni); return (NULL); } PyStr = PyUnicode_AsEncodedString(PyUni, "UTF-8", NULL); Py_DECREF(PyUni); if (PyStr == NULL) { nc_cpblts_free(global_cpblts); global_cpblts = NULL; return (NULL); } item = PyBytes_AsString(PyStr); if (item == NULL) { nc_cpblts_free(global_cpblts); global_cpblts = NULL; Py_DECREF(PyStr); return (NULL); } ret = nc_cpblts_add(global_cpblts, item); Py_DECREF(PyStr); if (ret != EXIT_SUCCESS) { nc_cpblts_free(global_cpblts); global_cpblts = NULL; return (NULL); } } Py_RETURN_NONE; }
static int ncSessionInit(ncSessionObject *self, PyObject *args, PyObject *keywords) { const char *host = NULL, *user = NULL, *transport_s = NULL; unsigned short port = 830; PyObject *PyCpblts = NULL; PyObject *PyStr; struct nc_session *session; struct nc_cpblts *cpblts = NULL; char cpblts_free_flag = 0; char* item = NULL; Py_ssize_t l, i; int ret; int fd_in = -1, fd_out = -1; NC_TRANSPORT transport = NC_TRANSPORT_UNKNOWN; char *kwlist[] = {"host", "port", "user", "transport", "capabilities", "fd_in", "fd_out", NULL}; /* Get input parameters */ if (! PyArg_ParseTupleAndKeywords(args, keywords, "|zHzzOii", kwlist, &host, &port, &user, &transport_s, &PyCpblts, &fd_in, &fd_out)) { return -1; } if ((fd_in >= 0 && fd_out < 0) || (fd_in < 0 && fd_out >= 0)) { PyErr_SetString(PyExc_ValueError, "Both or none of fd_in and fd_out arguments must be set."); return -1; } if (host != NULL) { /* Client side */ if (transport_s && strcasecmp(transport_s, NETCONF_TRANSPORT_TLS) == 0) { ret = nc_session_transport(NC_TRANSPORT_TLS); transport = NC_TRANSPORT_TLS; } else { ret = nc_session_transport(NC_TRANSPORT_SSH); transport = NC_TRANSPORT_SSH; } if (ret != EXIT_SUCCESS) { return -1; } } if (PyCpblts != NULL && PyCpblts != Py_None) { cpblts = nc_cpblts_new(NULL); cpblts_free_flag = 1; if (PyList_Check(PyCpblts)) { if ((l = PyList_Size(PyCpblts)) > 0) { for (i = 0; i < l; i++) { PyObject *PyUni = PyList_GetItem(PyCpblts, i); Py_INCREF(PyUni); if (!PyUnicode_Check(PyUni)) { PyErr_SetString(PyExc_TypeError, "Capabilities list must contain strings."); nc_cpblts_free(cpblts); Py_DECREF(PyUni); return -1; } PyStr = PyUnicode_AsEncodedString(PyUni, "UTF-8", NULL); Py_DECREF(PyUni); if (PyStr == NULL) { nc_cpblts_free(cpblts); return -1; } item = PyBytes_AsString(PyStr); if (item == NULL) { nc_cpblts_free(cpblts); Py_DECREF(PyStr); return -1; } ret = nc_cpblts_add(cpblts, item); Py_DECREF(PyStr); if (ret != EXIT_SUCCESS) { nc_cpblts_free(cpblts); return -1; } } } } else { PyErr_SetString(PyExc_TypeError, "Capabilities argument is expected to be a list of strings."); return -1; } } if (cpblts == NULL) { /* use global capabilities, that are, by default, same as libnetconf's * default capabilities */ cpblts = global_cpblts; } if (host != NULL) { /* Client side */ if (fd_in != -1 && fd_out != -1) { session = nc_session_connect_inout(fd_in, fd_out, cpblts, host, NULL, user, transport); } else { session = nc_session_connect(host, port, user, cpblts); } } else { /* Server side */ session = nc_session_accept_inout(cpblts, user, fd_in != -1 ? fd_in : STDIN_FILENO, fd_out != -1 ? fd_out : STDOUT_FILENO); /* add to the list of monitored sessions */ nc_session_monitor(session); } if (cpblts_free_flag) { nc_cpblts_free(cpblts); } if (session == NULL) { return -1; } nc_session_free(self->session); self->session = session; return 0; }