2 * Libkmod -- Python interface to kmod API.
4 * Copyright (C) 2012 Red Hat, Inc. All rights reserved.
6 * This copyrighted material is made available to anyone wishing to use,
7 * modify, copy, or redistribute it subject to the terms and conditions
8 * of the GNU Lesser General Public License v.2.1.
10 * You should have received a copy of the GNU Lesser General Public License
11 * along with this program; if not, write to the Free Software Foundation,
12 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
14 * Author: Andy Grover <agrover redhat com>
26 static PyTypeObject KmodObjType;
28 static PyObject *KmodError;
30 /* ----------------------------------------------------------------------
31 * kmod toplevel module methods
34 kmod_library_get_version(PyObject *self, PyObject *unused_args)
36 return Py_BuildValue("s", "0.1");
39 /* ----------------------------------------------------------------------
40 * Kmod object initialization/deallocation
43 kmod_obj_init(PyObject *self, PyObject *args, PyObject *kwds)
45 kmodobject *kmod = (kmodobject *)self;
48 if (!PyArg_ParseTuple(args, "|s", &mod_dir))
51 /* init can be called multiple times */
53 kmod_unload_resources(kmod->ctx);
54 kmod_unref(kmod->ctx);
57 kmod->ctx = kmod_new(mod_dir, NULL);
59 PyErr_SetString(KmodError, "Could not initialize");
63 kmod_load_resources(kmod->ctx);
69 kmod_obj_dealloc(PyObject *self)
71 kmodobject *kmod = (kmodobject *)self;
73 kmod_unload_resources(kmod->ctx);
75 /* if already closed, don't reclose it */
76 if (kmod->ctx != NULL){
77 kmod_unref(kmod->ctx);
79 //self->ob_type->tp_free((PyObject*)self);
84 * list currently loaded modules and sizes
87 kmod_obj_loaded_modules(PyObject *self, PyObject *unused_args)
89 kmodobject *kmod = (kmodobject *)self;
90 struct kmod_list *list, *itr;
93 err = kmod_module_new_from_loaded(kmod->ctx, &list);
95 PyErr_SetString(KmodError, "Could not get loaded modules");
99 PyObject *pylist = PyList_New(0);
101 kmod_module_unref_list(list);
102 return PyErr_NoMemory();
105 /* refcountapallooza. */
106 kmod_list_foreach(itr, list) {
107 struct kmod_module *mod = kmod_module_get_module(itr);
108 const char *name = kmod_module_get_name(mod);
109 long size = kmod_module_get_size(mod);
111 PyObject *entry = Py_BuildValue("(sl)", name, size);
114 kmod_module_unref(mod);
115 kmod_module_unref_list(list);
119 if (PyList_Append(pylist, entry) == -1) {
122 kmod_module_unref(mod);
123 kmod_module_unref_list(list);
128 kmod_module_unref(mod);
130 kmod_module_unref_list(list);
136 kmod_obj_modprobe(PyObject *self, PyObject *args)
138 kmodobject *kmod = (kmodobject *)self;
139 struct kmod_list *list = NULL, *itr;
140 struct kmod_module *mod;
142 unsigned int flags = KMOD_PROBE_APPLY_BLACKLIST;
145 if (!PyArg_ParseTuple(args, "s", &alias_name))
148 err = kmod_module_new_from_lookup(kmod->ctx, alias_name, &list);
150 PyErr_SetString(KmodError, "Could not modprobe");
154 kmod_list_foreach(itr, list) {
155 mod = kmod_module_get_module(itr);
157 err = kmod_module_probe_insert_module(mod, flags,
158 NULL, NULL, NULL, NULL);
161 if (err == -EEXIST) {
162 PyErr_SetString(KmodError, "Module already loaded");
165 PyErr_SetString(KmodError, "Could not load module");
170 kmod_module_unref(mod);
172 kmod_module_unref_list(list);
178 kmod_module_unref(mod);
179 kmod_module_unref_list(list);
184 kmod_obj_rmmod(PyObject *self, PyObject *args)
186 kmodobject *kmod = (kmodobject *)self;
187 struct kmod_module *mod;
191 if (!PyArg_ParseTuple(args, "s", &module_name))
194 err = kmod_module_new_from_name(kmod->ctx, module_name, &mod);
196 PyErr_SetString(KmodError, "Could get module");
200 err = kmod_module_remove_module(mod, 0);
202 PyErr_SetString(KmodError, "Could not remove module");
203 kmod_module_unref(mod);
206 kmod_module_unref(mod);
212 /* ----------------------------------------------------------------------
213 * Method tables and other bureaucracy
216 static PyMethodDef kmod_lib_methods[] = {
217 {"getVersion", kmod_library_get_version, METH_NOARGS },
218 {NULL, NULL} /* sentinel */
221 static PyMethodDef kmod_obj_methods[] = {
222 {"loaded_modules", kmod_obj_loaded_modules, METH_NOARGS,
223 "List loaded kernel modules, and their sizes"},
224 {"modprobe", kmod_obj_modprobe, METH_VARARGS,
225 "Load a kernel module"},
226 {"rmmod", kmod_obj_rmmod, METH_VARARGS,
227 "Unload a kernel module"},
228 {NULL, NULL} /* sentinel */
232 static PyTypeObject KmodObjType = {
233 PyObject_HEAD_INIT(NULL)
234 .tp_name = "kmod.Kmod",
235 .tp_basicsize = sizeof(kmodobject),
236 .tp_new = PyType_GenericNew,
237 .tp_init = kmod_obj_init,
238 .tp_dealloc = kmod_obj_dealloc,
239 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
240 .tp_doc = "kmod.Kmod object",
241 .tp_methods = kmod_obj_methods,
244 #ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
245 #define PyMODINIT_FUNC void
252 if (PyType_Ready(&KmodObjType) < 0)
255 m = Py_InitModule3("kmod", kmod_lib_methods, "kmod module");
259 Py_INCREF(&KmodObjType);
260 PyModule_AddObject(m, "Kmod", (PyObject *)&KmodObjType);
262 KmodError = PyErr_NewException("kmod.KmodError",
265 /* Each call to PyModule_AddObject decrefs it; compensate: */
266 Py_INCREF(KmodError);
267 PyModule_AddObject(m, "KmodError", KmodError);