Home | History | Annotate | Download | only in kmod
      1 # Copyright (C) 2012 W. Trevor King <wking (a] tremily.us>
      2 #
      3 # This file is part of python-kmod.
      4 #
      5 # python-kmod is free software: you can redistribute it and/or modify it under
      6 # the terms of the GNU Lesser General Public License version 2.1 as published
      7 # by the Free Software Foundation.
      8 #
      9 # python-kmod is distributed in the hope that it will be useful, but WITHOUT
     10 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
     11 # FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
     12 # details.
     13 #
     14 # You should have received a copy of the GNU Lesser General Public License
     15 # along with python-kmod.  If not, see <http://www.gnu.org/licenses/>.
     16 
     17 import collections as _collections
     18 
     19 cimport libc.errno as _errno
     20 
     21 cimport _libkmod_h
     22 from error import KmodError as _KmodError
     23 cimport list as _list
     24 import list as _list
     25 cimport _util
     26 import _util
     27 
     28 
     29 cdef class Module (object):
     30     "Wrap a struct kmod_module* item"
     31     def __cinit__(self):
     32         self.module = NULL
     33 
     34     def __dealloc__(self):
     35         self._cleanup()
     36 
     37     def _cleanup(self):
     38         if self.module is not NULL:
     39             _libkmod_h.kmod_module_unref(self.module)
     40             self.module = NULL
     41 
     42     cpdef from_mod_list_item(self, _list.ModListItem item):
     43         self._cleanup()
     44         self.module = _libkmod_h.kmod_module_get_module(item.list)
     45 
     46     def _name_get(self):
     47         return _util.char_ptr_to_str(
     48             _libkmod_h.kmod_module_get_name(self.module))
     49     name = property(fget=_name_get)
     50 
     51     def _path_get(self):
     52         return _util.char_ptr_to_str(
     53             _libkmod_h.kmod_module_get_path(self.module))
     54     path = property(fget=_path_get)
     55 
     56     def _options_get(self):
     57         return _util.char_ptr_to_str(
     58             _libkmod_h.kmod_module_get_options(self.module))
     59     options = property(fget=_options_get)
     60 
     61     def _install_commands_get(self):
     62         return _util.char_ptr_to_str(
     63             _libkmod_h.kmod_module_get_install_commands(self.module))
     64     install_commands = property(fget=_install_commands_get)
     65 
     66     def _remove_commands_get(self):
     67         return _util.char_ptr_to_str(
     68             _libkmod_h.kmod_module_get_remove_commands(self.module))
     69     remove_commands = property(fget=_remove_commands_get)
     70 
     71     def _refcnt_get(self):
     72         return _libkmod_h.kmod_module_get_refcnt(self.module)
     73     refcnt = property(fget=_refcnt_get)
     74 
     75     def _size_get(self):
     76         return _libkmod_h.kmod_module_get_size(self.module)
     77     size = property(fget=_size_get)
     78 
     79     def _info_get(self):
     80         cdef _list.ModList ml = _list.ModList()
     81         cdef _list.ModListItem mli
     82         err = _libkmod_h.kmod_module_get_info(self.module, &ml.list)
     83         if err < 0:
     84             raise _KmodError('Could not get info')
     85         info = _collections.OrderedDict()
     86         try:
     87             for item in ml:
     88                 mli = <_list.ModListItem> item
     89                 key = _util.char_ptr_to_str(
     90                     _libkmod_h.kmod_module_info_get_key(mli.list))
     91                 value = _util.char_ptr_to_str(
     92                     _libkmod_h.kmod_module_info_get_value(mli.list))
     93                 info[key] = value
     94         finally:
     95             _libkmod_h.kmod_module_info_free_list(ml.list)
     96             ml.list = NULL
     97         return info
     98     info = property(fget=_info_get)
     99 
    100     def _versions_get(self):
    101         cdef _list.ModList ml = _list.ModList()
    102         cdef _list.ModListItem mli
    103         err = _libkmod_h.kmod_module_get_versions(self.module, &ml.list)
    104         if err < 0:
    105             raise _KmodError('Could not get versions')
    106         try:
    107             for item in ml:
    108                 mli = <_list.ModListItem> item
    109                 symbol = _util.char_ptr_to_str(
    110                     _libkmod_h.kmod_module_version_get_symbol(mli.list))
    111                 crc = _libkmod_h.kmod_module_version_get_crc(mli.list)
    112                 yield {'symbol': symbol, 'crc': crc}
    113         finally:
    114             _libkmod_h.kmod_module_versions_free_list(ml.list)
    115             ml.list = NULL
    116     versions = property(fget=_versions_get)
    117 
    118     def insert(self, flags=0, extra_options=None, install_callback=None,
    119                data=None, print_action_callback=None):
    120         """
    121         insert module to current tree. 
    122         e.g.
    123         km = kmod.Kmod()
    124         tp = km.module_from_name("thinkpad_acpi")
    125         tp.insert(extra_options='fan_control=1')
    126         """
    127         cdef char *opt = NULL
    128         #cdef _libkmod_h.install_callback_t install = NULL
    129         cdef int (*install)(
    130             _libkmod_h.kmod_module *, _libkmod_h.const_char_ptr, void *)
    131         install = NULL
    132         cdef void *d = NULL
    133         #cdef _libkmod_h.print_action_callback_t print_action = NULL
    134         cdef void (*print_action)(
    135             _libkmod_h.kmod_module *, _libkmod_h.bool,
    136             _libkmod_h.const_char_ptr)
    137         print_action = NULL
    138         if extra_options:
    139             opt = extra_options
    140         # TODO: convert callbacks and data from Python object to C types
    141         err = _libkmod_h.kmod_module_probe_insert_module(
    142             self.module, flags, opt, install, d, print_action)
    143         if err == -_errno.EEXIST:
    144             raise _KmodError('Module already loaded')
    145         elif err < 0:
    146             raise _KmodError('Could not load module')
    147 
    148     def remove(self, flags=0):
    149         """
    150         remove module from current tree
    151         e.g.
    152         km = kmod.Kmod()
    153         tp = km.module_from_name("thinkpad_acpi")
    154         tp.remove()
    155         """
    156         err = _libkmod_h.kmod_module_remove_module(self.module, flags)
    157         if err < 0:
    158             raise _KmodError('Could not remove module')
    159