summaryrefslogtreecommitdiff
path: root/libkmod/python/kmod/module.pyx
diff options
context:
space:
mode:
Diffstat (limited to 'libkmod/python/kmod/module.pyx')
-rw-r--r--libkmod/python/kmod/module.pyx158
1 files changed, 158 insertions, 0 deletions
diff --git a/libkmod/python/kmod/module.pyx b/libkmod/python/kmod/module.pyx
new file mode 100644
index 0000000..42aa92e
--- /dev/null
+++ b/libkmod/python/kmod/module.pyx
@@ -0,0 +1,158 @@
+# Copyright (C) 2012 W. Trevor King <wking@tremily.us>
+#
+# This file is part of python-kmod.
+#
+# python-kmod is free software: you can redistribute it and/or modify it under
+# the terms of the GNU Lesser General Public License version 2.1 as published
+# by the Free Software Foundation.
+#
+# python-kmod is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with python-kmod. If not, see <http://www.gnu.org/licenses/>.
+
+import collections as _collections
+
+cimport libc.errno as _errno
+
+cimport _libkmod_h
+from error import KmodError as _KmodError
+cimport list as _list
+import list as _list
+cimport _util
+import _util
+
+
+cdef class Module (object):
+ "Wrap a struct kmod_module* item"
+ def __cinit__(self):
+ self.module = NULL
+
+ def __dealloc__(self):
+ self._cleanup()
+
+ def _cleanup(self):
+ if self.module is not NULL:
+ _libkmod_h.kmod_module_unref(self.module)
+ self.module = NULL
+
+ cpdef from_mod_list_item(self, _list.ModListItem item):
+ self._cleanup()
+ self.module = _libkmod_h.kmod_module_get_module(item.list)
+
+ def _name_get(self):
+ return _util.char_ptr_to_str(
+ _libkmod_h.kmod_module_get_name(self.module))
+ name = property(fget=_name_get)
+
+ def _path_get(self):
+ return _util.char_ptr_to_str(
+ _libkmod_h.kmod_module_get_path(self.module))
+ path = property(fget=_path_get)
+
+ def _options_get(self):
+ return _util.char_ptr_to_str(
+ _libkmod_h.kmod_module_get_options(self.module))
+ options = property(fget=_options_get)
+
+ def _install_commands_get(self):
+ return _util.char_ptr_to_str(
+ _libkmod_h.kmod_module_get_install_commands(self.module))
+ install_commands = property(fget=_install_commands_get)
+
+ def _remove_commands_get(self):
+ return _util.char_ptr_to_str(
+ _libkmod_h.kmod_module_get_remove_commands(self.module))
+ remove_commands = property(fget=_remove_commands_get)
+
+ def _refcnt_get(self):
+ return _libkmod_h.kmod_module_get_refcnt(self.module)
+ refcnt = property(fget=_refcnt_get)
+
+ def _size_get(self):
+ return _libkmod_h.kmod_module_get_size(self.module)
+ size = property(fget=_size_get)
+
+ def _info_get(self):
+ cdef _list.ModList ml = _list.ModList()
+ cdef _list.ModListItem mli
+ err = _libkmod_h.kmod_module_get_info(self.module, &ml.list)
+ if err < 0:
+ raise _KmodError('Could not get info')
+ info = _collections.OrderedDict()
+ try:
+ for item in ml:
+ mli = <_list.ModListItem> item
+ key = _util.char_ptr_to_str(
+ _libkmod_h.kmod_module_info_get_key(mli.list))
+ value = _util.char_ptr_to_str(
+ _libkmod_h.kmod_module_info_get_value(mli.list))
+ info[key] = value
+ finally:
+ _libkmod_h.kmod_module_info_free_list(ml.list)
+ ml.list = NULL
+ return info
+ info = property(fget=_info_get)
+
+ def _versions_get(self):
+ cdef _list.ModList ml = _list.ModList()
+ cdef _list.ModListItem mli
+ err = _libkmod_h.kmod_module_get_versions(self.module, &ml.list)
+ if err < 0:
+ raise _KmodError('Could not get versions')
+ try:
+ for item in ml:
+ mli = <_list.ModListItem> item
+ symbol = _util.char_ptr_to_str(
+ _libkmod_h.kmod_module_version_get_symbol(mli.list))
+ crc = _libkmod_h.kmod_module_version_get_crc(mli.list)
+ yield {'symbol': symbol, 'crc': crc}
+ finally:
+ _libkmod_h.kmod_module_versions_free_list(ml.list)
+ ml.list = NULL
+ versions = property(fget=_versions_get)
+
+ def insert(self, flags=0, extra_options=None, install_callback=None,
+ data=None, print_action_callback=None):
+ """
+ insert module to current tree.
+ e.g.
+ km = kmod.Kmod()
+ tp = km.module_from_name("thinkpad_acpi")
+ tp.insert(extra_options='fan_control=1')
+ """
+ cdef char *opt = NULL
+ #cdef _libkmod_h.install_callback_t install = NULL
+ cdef int (*install)(
+ _libkmod_h.kmod_module *, _libkmod_h.const_char_ptr, void *)
+ install = NULL
+ cdef void *d = NULL
+ #cdef _libkmod_h.print_action_callback_t print_action = NULL
+ cdef void (*print_action)(
+ _libkmod_h.kmod_module *, _libkmod_h.bool,
+ _libkmod_h.const_char_ptr)
+ print_action = NULL
+ if extra_options:
+ opt = extra_options
+ # TODO: convert callbacks and data from Python object to C types
+ err = _libkmod_h.kmod_module_probe_insert_module(
+ self.module, flags, opt, install, d, print_action)
+ if err == -_errno.EEXIST:
+ raise _KmodError('Module already loaded')
+ elif err < 0:
+ raise _KmodError('Could not load module')
+
+ def remove(self, flags=0):
+ """
+ remove module from current tree
+ e.g.
+ km = kmod.Kmod()
+ tp = km.module_from_name("thinkpad_acpi")
+ tp.remove()
+ """
+ err = _libkmod_h.kmod_module_remove_module(self.module, flags)
+ if err < 0:
+ raise _KmodError('Could not remove module')