X-Git-Url: https://jfr.im/git/irc/evilnet/x3.git/blobdiff_plain/92fb809beb2963a5b331a59e589430c989c9cbde..b39754f763284af8fc45de2d5b734b2ce072b8c7:/src/mod-python.c diff --git a/src/mod-python.c b/src/mod-python.c index fd279ee..80c9401 100644 --- a/src/mod-python.c +++ b/src/mod-python.c @@ -112,25 +112,19 @@ static int _dict_iter_fill_tuple(char const* key, UNUSED_ARG(void* data), void* return 0; } -/* get a tuple with all users in it */ static PyObject* -emb_get_users(UNUSED_ARG(PyObject *self), PyObject *args) { +pyobj_from_dict_t(dict_t d) { PyObject* retval; - size_t num_clients, n = 0; + size_t n = 0; struct _tuple_dict_extra extra; - if (!PyArg_ParseTuple(args, "")) - return NULL; - - num_clients = dict_size(clients); - retval = PyTuple_New(num_clients); - if (retval == NULL) + if ((retval = PyTuple_New(dict_size(d))) == NULL) return NULL; extra.extra = &n; extra.data = retval; - if (dict_foreach(clients, _dict_iter_fill_tuple, (void*)&extra) != NULL) { + if (dict_foreach(d, _dict_iter_fill_tuple, (void*)&extra) != NULL) { pyobj_release_tuple(retval, n); return NULL; } @@ -138,78 +132,38 @@ emb_get_users(UNUSED_ARG(PyObject *self), PyObject *args) { return retval; } -/* get a tuple with all channels in it */ +/* get a tuple with all users in it */ static PyObject* -emb_get_channels(UNUSED_ARG(PyObject* self), PyObject* args) { - PyObject* retval; - size_t num_channels, n = 0; - struct _tuple_dict_extra extra; - +emb_get_users(UNUSED_ARG(PyObject *self), PyObject *args) { if (!PyArg_ParseTuple(args, "")) return NULL; - num_channels = dict_size(channels); - retval = PyTuple_New(num_channels); - if (retval == NULL) - return NULL; - - extra.extra = &n; - extra.data = retval; + return pyobj_from_dict_t(clients); +} - if (dict_foreach(channels, _dict_iter_fill_tuple, (void*)&extra) != NULL) { - pyobj_release_tuple(retval, n); +/* get a tuple with all channels in it */ +static PyObject* +emb_get_channels(UNUSED_ARG(PyObject* self), PyObject* args) { + if (!PyArg_ParseTuple(args, "")) return NULL; - } - return retval; + return pyobj_from_dict_t(channels); } static PyObject* emb_get_servers(UNUSED_ARG(PyObject* self), PyObject* args) { - PyObject* retval; - size_t n = 0; - struct _tuple_dict_extra extra; - if (!PyArg_ParseTuple(args, "")) return NULL; - retval = PyTuple_New(dict_size(servers)); - if (retval == NULL) - return NULL; - - extra.extra = &n; - extra.data = retval; - - if (dict_foreach(servers, _dict_iter_fill_tuple, (void*)&extra) != NULL) { - pyobj_release_tuple(retval, n); - return NULL; - } - - return retval; + return pyobj_from_dict_t(servers); } static PyObject* emb_get_accounts(UNUSED_ARG(PyObject* self), PyObject* args) { - PyObject* retval; - size_t n = 0; - struct _tuple_dict_extra extra; - if (!PyArg_ParseTuple(args, "")) return NULL; - retval = PyTuple_New(dict_size(nickserv_handle_dict)); - if (retval == NULL) - return NULL; - - extra.extra = &n; - extra.data = retval; - - if (dict_foreach(nickserv_handle_dict, _dict_iter_fill_tuple, (void*)&extra) != NULL) { - pyobj_release_tuple(retval, n); - return NULL; - } - - return retval; + return pyobj_from_dict_t(nickserv_handle_dict); } static PyObject* @@ -496,6 +450,56 @@ pyobj_from_modelist(struct modeList* mode) { return retval; } +static PyObject* +pyobj_from_banlist(struct banList* bans) { + size_t n; + struct banNode* bn; + PyObject* tmp; + PyObject* retval = PyTuple_New(bans->used); + + if (retval == NULL) + return NULL; + + for (n = 0; n < bans->used; ++n) { + bn = bans->list[n]; + + tmp = Py_BuildValue("{s:s,s:s,s:l}", + "ban", bn->ban, "who", bn->who, "set", bn->set); + + if (tmp == NULL || PyTuple_SetItem(retval, n, tmp)) { + pyobj_release_tuple(retval, n); + return NULL; + } + } + + return retval; +} + +static PyObject* +pyobj_from_exemptlist(struct exemptList* exmp) { + size_t n; + struct exemptNode* en; + PyObject* tmp; + PyObject* retval = PyTuple_New(exmp->used); + + if (retval == NULL) + return NULL; + + for (n = 0; n < exmp->used; ++n) { + en = exmp->list[n]; + + tmp = Py_BuildValue("{s:s,s:s,s:l}", + "ban", en->exempt, "who", en->who, "set", en->set); + + if (tmp == NULL || PyTuple_SetItem(retval, n, tmp)) { + pyobj_release_tuple(retval, n); + return NULL; + } + } + + return retval; +} + static PyObject* emb_get_channel(UNUSED_ARG(PyObject *self), PyObject *args) { @@ -504,10 +508,10 @@ emb_get_channel(UNUSED_ARG(PyObject *self), PyObject *args) */ char *name; struct chanNode *channel; - unsigned int n; - PyObject *pChannelMembers; - PyObject *pChannelBans; - PyObject *pChannelExempts; + PyObject *pChannelMembers = NULL; + PyObject *pChannelBans = NULL; + PyObject *pChannelExempts = NULL; + PyObject *retval = NULL; if(!PyArg_ParseTuple(args, "s", &name)) @@ -520,32 +524,20 @@ emb_get_channel(UNUSED_ARG(PyObject *self), PyObject *args) /* build tuple of nicks in channel */ pChannelMembers = pyobj_from_modelist(&channel->members); + if (pChannelMembers == NULL) + goto cleanup; /* build tuple of bans */ - pChannelBans = PyTuple_New(channel->banlist.used); - for(n=0; n < channel->banlist.used;n++) { - struct banNode *bn = channel->banlist.list[n]; - PyTuple_SetItem(pChannelBans, n, - Py_BuildValue("{s:s,s:s,s:i}", - "ban", bn->ban, - "who", bn->who, - "set", bn->set) - ); - } + pChannelBans = pyobj_from_banlist(&channel->banlist); + if (pChannelBans == NULL) + goto cleanup; /* build tuple of exempts */ - pChannelExempts = PyTuple_New(channel->exemptlist.used); - for(n=0; n < channel->exemptlist.used;n++) { - struct exemptNode *en = channel->exemptlist.list[n]; - PyTuple_SetItem(pChannelExempts, n, - Py_BuildValue("{s:s,s:s,s:i}", - "ban", en->exempt, - "who", en->who, - "set", en->set) - ); - } + pChannelExempts = pyobj_from_exemptlist(&channel->exemptlist); + if (pChannelExempts == NULL) + goto cleanup; - return Py_BuildValue("{s:s,s:s,s:s,s:i" + retval = Py_BuildValue("{s:s,s:s,s:s,s:i" ",s:i,s:i,s:O,s:O,s:O}", "name", channel->name, @@ -559,6 +551,18 @@ emb_get_channel(UNUSED_ARG(PyObject *self), PyObject *args) "bans", pChannelBans, "exempts", pChannelExempts ); + if (retval == NULL) + goto cleanup; + + return retval; + +cleanup: + Py_XDECREF(retval); + pyobj_release_tuple(pChannelExempts, channel->exemptlist.used); + pyobj_release_tuple(pChannelBans, channel->banlist.used); + pyobj_release_tuple(pChannelMembers, channel->members.used); + + return NULL; } static PyObject*