Generated by Cython 0.29.37

Yellow lines hint at Python interaction.
Click on a line that starts with a "+" to see the C code that Cython generated for it.

Raw output: enclosure.c

 001: # cython: language_level=3, c_string_type=unicode, c_string_encoding=default
 002: 
 003: from . cimport ses
 004: 
 005: from posix.ioctl cimport ioctl
 006: from posix.fcntl cimport open, O_RDWR
 007: from posix.unistd cimport close
 008: from posix.strings cimport bzero
 009: from libc.stdlib cimport calloc, free
 010: from libc.stdint cimport UINT16_MAX
 011: 
 012: 
+013: cdef class Enclosure(object):
struct __pyx_obj_3bsd_9enclosure_Enclosure {
  PyObject_HEAD
  struct __pyx_vtabstruct_3bsd_9enclosure_Enclosure *__pyx_vtab;
  char const *enc;
  int enc_fd;
};



struct __pyx_vtabstruct_3bsd_9enclosure_Enclosure {
  int (*setobj)(struct __pyx_obj_3bsd_9enclosure_Enclosure *, long, unsigned char *);
};
static struct __pyx_vtabstruct_3bsd_9enclosure_Enclosure *__pyx_vtabptr_3bsd_9enclosure_Enclosure;
 014: 
 015:     cdef const char* enc  # /dev/ses device passed to us
 016:     cdef int enc_fd  # file descriptor for enclosure device
 017: 
+018:     def __cinit__(self, enc):
/* Python wrapper */
static int __pyx_pw_3bsd_9enclosure_9Enclosure_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static int __pyx_pw_3bsd_9enclosure_9Enclosure_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_enc = 0;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_enc,0};
    PyObject* values[1] = {0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_enc)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) __PYX_ERR(0, 18, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
    }
    __pyx_v_enc = values[0];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 18, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("bsd.enclosure.Enclosure.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return -1;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_3bsd_9enclosure_9Enclosure___cinit__(((struct __pyx_obj_3bsd_9enclosure_Enclosure *)__pyx_v_self), __pyx_v_enc);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_3bsd_9enclosure_9Enclosure___cinit__(struct __pyx_obj_3bsd_9enclosure_Enclosure *__pyx_v_self, PyObject *__pyx_v_enc) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__cinit__", 0);
/* … */
  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("bsd.enclosure.Enclosure.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+019:         self.enc = enc
  __pyx_t_1 = __Pyx_PyObject_AsString(__pyx_v_enc); if (unlikely((!__pyx_t_1) && PyErr_Occurred())) __PYX_ERR(0, 19, __pyx_L1_error)
  __pyx_v_self->enc = __pyx_t_1;
+020:         self.enc_fd = -1
  __pyx_v_self->enc_fd = -1;
+021:         with nogil:
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L5;
        }
        __pyx_L4_error: {
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L1_error;
        }
        __pyx_L5:;
      }
  }
+022:             self.enc_fd = open(self.enc, O_RDWR)
        __pyx_v_self->enc_fd = open(__pyx_v_self->enc, O_RDWR);
+023:             if self.enc_fd == -1:
        __pyx_t_2 = ((__pyx_v_self->enc_fd == -1L) != 0);
        if (__pyx_t_2) {
/* … */
        }
      }
+024:                 raise RuntimeError('Failed to open device')
          {
              #ifdef WITH_THREAD
              PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
              #endif
              /*try:*/ {
                __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 24, __pyx_L8_error)
                __Pyx_GOTREF(__pyx_t_3);
                __Pyx_Raise(__pyx_t_3, 0, 0, 0);
                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
                __PYX_ERR(0, 24, __pyx_L8_error)
              }
              /*finally:*/ {
                __pyx_L8_error: {
                  #ifdef WITH_THREAD
                  __Pyx_PyGILState_Release(__pyx_gilstate_save);
                  #endif
                  goto __pyx_L4_error;
                }
              }
          }
/* … */
  __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_u_Failed_to_open_device); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 24, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple_);
  __Pyx_GIVEREF(__pyx_tuple_);
 025: 
+026:     def __init__(self, enc):
/* Python wrapper */
static int __pyx_pw_3bsd_9enclosure_9Enclosure_3__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static int __pyx_pw_3bsd_9enclosure_9Enclosure_3__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_enc = 0;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_enc,0};
    PyObject* values[1] = {0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_enc)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 26, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
    }
    __pyx_v_enc = values[0];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 26, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("bsd.enclosure.Enclosure.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return -1;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_3bsd_9enclosure_9Enclosure_2__init__(((struct __pyx_obj_3bsd_9enclosure_Enclosure *)__pyx_v_self), __pyx_v_enc);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_3bsd_9enclosure_9Enclosure_2__init__(struct __pyx_obj_3bsd_9enclosure_Enclosure *__pyx_v_self, PyObject *__pyx_v_enc) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__init__", 0);
/* … */
  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_AddTraceback("bsd.enclosure.Enclosure.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+027:         self.enc = enc
  __pyx_t_1 = __Pyx_PyObject_AsString(__pyx_v_enc); if (unlikely((!__pyx_t_1) && PyErr_Occurred())) __PYX_ERR(0, 27, __pyx_L1_error)
  __pyx_v_self->enc = __pyx_t_1;
 028: 
+029:     def __dealloc__(self):
/* Python wrapper */
static void __pyx_pw_3bsd_9enclosure_9Enclosure_5__dealloc__(PyObject *__pyx_v_self); /*proto*/
static void __pyx_pw_3bsd_9enclosure_9Enclosure_5__dealloc__(PyObject *__pyx_v_self) {
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
  __pyx_pf_3bsd_9enclosure_9Enclosure_4__dealloc__(((struct __pyx_obj_3bsd_9enclosure_Enclosure *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
}

static void __pyx_pf_3bsd_9enclosure_9Enclosure_4__dealloc__(struct __pyx_obj_3bsd_9enclosure_Enclosure *__pyx_v_self) {
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__dealloc__", 0);
/* … */
  /* function exit code */
  __Pyx_RefNannyFinishContext();
}
+030:         with nogil:
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L5;
        }
        __pyx_L5:;
      }
  }
+031:             if self.enc_fd >= 0:
        __pyx_t_1 = ((__pyx_v_self->enc_fd >= 0) != 0);
        if (__pyx_t_1) {
/* … */
        }
      }
+032:                 close(self.enc_fd)
          (void)(close(__pyx_v_self->enc_fd));
 033: 
+034:     def __status__(self):
/* Python wrapper */
static PyObject *__pyx_pw_3bsd_9enclosure_9Enclosure_7__status__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_3bsd_9enclosure_9Enclosure_7__status__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__status__ (wrapper)", 0);
  __pyx_r = __pyx_pf_3bsd_9enclosure_9Enclosure_6__status__(((struct __pyx_obj_3bsd_9enclosure_Enclosure *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_3bsd_9enclosure_9Enclosure_6__status__(struct __pyx_obj_3bsd_9enclosure_Enclosure *__pyx_v_self) {
  encioc_string_t __pyx_v_enc_name;
  encioc_string_t __pyx_v_enc_id;
  encioc_element_t *__pyx_v_objp;
  encioc_elm_status_t __pyx_v_ob;
  encioc_elm_desc_t __pyx_v_objd;
  encioc_elm_devnames_t __pyx_v_objdn;
  unsigned char __pyx_v__enc_name[32];
  unsigned char __pyx_v__enc_id[32];
  int __pyx_v_res;
  int __pyx_v_num_elms;
  int __pyx_v_elm_name_size;
  u_char __pyx_v_estat;
  PyObject *__pyx_v_enc_info = NULL;
  int __pyx_v_i;
  PyObject *__pyx_v_element = NULL;
  long __pyx_7genexpr__pyx_v_j;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__status__", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_10);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_AddTraceback("bsd.enclosure.Enclosure.__status__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_enc_info);
  __Pyx_XDECREF(__pyx_v_element);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 035:         cdef ses.encioc_string_t enc_name
 036:         cdef ses.encioc_string_t enc_id
+037:         cdef ses.encioc_element_t * objp = NULL
  __pyx_v_objp = NULL;
 038:         cdef ses.encioc_elm_status_t ob
 039:         cdef ses.encioc_elm_desc_t objd
 040:         cdef ses.encioc_elm_devnames_t objdn
 041:         cdef unsigned char _enc_name[32]
 042:         cdef unsigned char _enc_id[32]
+043:         cdef int res = -1
  __pyx_v_res = -1;
+044:         cdef int num_elms = 0
  __pyx_v_num_elms = 0;
+045:         cdef int elm_name_size = 128
  __pyx_v_elm_name_size = 0x80;
 046:         cdef ses.u_char estat
 047: 
+048:         enc_info = {'name': '', 'id': '', 'status': [], 'elements': {}}
  __pyx_t_1 = __Pyx_PyDict_NewPresized(4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 48, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_u_name, __pyx_kp_u__2) < 0) __PYX_ERR(0, 48, __pyx_L1_error)
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_u_id, __pyx_kp_u__2) < 0) __PYX_ERR(0, 48, __pyx_L1_error)
  __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 48, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_u_status, __pyx_t_2) < 0) __PYX_ERR(0, 48, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 48, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_u_elements, __pyx_t_2) < 0) __PYX_ERR(0, 48, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_enc_info = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
 049: 
 050:         # enclosure name
+051:         enc_name.bufsiz = sizeof(_enc_name)
  __pyx_v_enc_name.bufsiz = (sizeof(__pyx_v__enc_name));
+052:         enc_name.buf = &_enc_name[0]
  __pyx_v_enc_name.buf = (&(__pyx_v__enc_name[0]));
+053:         res = ioctl(self.enc_fd, ses.ENCIOC_GETENCNAME, <ses.caddr_t>&enc_name)
  __pyx_v_res = ioctl(__pyx_v_self->enc_fd, ENCIOC_GETENCNAME, ((caddr_t)(&__pyx_v_enc_name)));
+054:         if res != 0:
  __pyx_t_3 = ((__pyx_v_res != 0) != 0);
  if (unlikely(__pyx_t_3)) {
/* … */
  }
+055:             raise RuntimeError('ioctl failed to get enclosure name')
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 55, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 55, __pyx_L1_error)
/* … */
  __pyx_tuple__3 = PyTuple_Pack(1, __pyx_kp_u_ioctl_failed_to_get_enclosure_na); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 55, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__3);
  __Pyx_GIVEREF(__pyx_tuple__3);
 056:         else:
+057:             enc_info['name'] = enc_name.buf.strip()
  /*else*/ {
    __pyx_t_2 = __Pyx_PyUnicode_FromCString(__pyx_v_enc_name.buf); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 57, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_strip); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 57, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_2 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_4))) {
      __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_4);
      if (likely(__pyx_t_2)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
        __Pyx_INCREF(__pyx_t_2);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_4, function);
      }
    }
    __pyx_t_1 = (__pyx_t_2) ? __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_2) : __Pyx_PyObject_CallNoArg(__pyx_t_4);
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 57, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(PyDict_SetItem(__pyx_v_enc_info, __pyx_n_u_name, __pyx_t_1) < 0)) __PYX_ERR(0, 57, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  }
 058: 
 059:         # enclosure id
+060:         enc_id.bufsiz = sizeof(_enc_id)
  __pyx_v_enc_id.bufsiz = (sizeof(__pyx_v__enc_id));
+061:         enc_id.buf = &_enc_id[0]
  __pyx_v_enc_id.buf = (&(__pyx_v__enc_id[0]));
+062:         res = ioctl(self.enc_fd, ses.ENCIOC_GETENCID, <ses.caddr_t>&enc_id)
  __pyx_v_res = ioctl(__pyx_v_self->enc_fd, ENCIOC_GETENCID, ((caddr_t)(&__pyx_v_enc_id)));
+063:         if res != 0:
  __pyx_t_3 = ((__pyx_v_res != 0) != 0);
  if (unlikely(__pyx_t_3)) {
/* … */
  }
+064:             raise RuntimeError('ioctl failed to get enclosure id')
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 64, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 64, __pyx_L1_error)
/* … */
  __pyx_tuple__4 = PyTuple_Pack(1, __pyx_kp_u_ioctl_failed_to_get_enclosure_id); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(0, 64, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__4);
  __Pyx_GIVEREF(__pyx_tuple__4);
 065:         else:
+066:             enc_info['id'] = enc_id.buf.strip()
  /*else*/ {
    __pyx_t_4 = __Pyx_PyUnicode_FromCString(__pyx_v_enc_id.buf); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 66, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_strip); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 66, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_4 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
      if (likely(__pyx_t_4)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
        __Pyx_INCREF(__pyx_t_4);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_2, function);
      }
    }
    __pyx_t_1 = (__pyx_t_4) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4) : __Pyx_PyObject_CallNoArg(__pyx_t_2);
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 66, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(PyDict_SetItem(__pyx_v_enc_info, __pyx_n_u_id, __pyx_t_1) < 0)) __PYX_ERR(0, 66, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  }
 067: 
 068:         # enclosure status
+069:         res = ioctl(self.enc_fd, ses.ENCIOC_GETENCSTAT, <ses.caddr_t>&estat)
  __pyx_v_res = ioctl(__pyx_v_self->enc_fd, ENCIOC_GETENCSTAT, ((caddr_t)(&__pyx_v_estat)));
+070:         if res != 0:
  __pyx_t_3 = ((__pyx_v_res != 0) != 0);
  if (unlikely(__pyx_t_3)) {
/* … */
  }
+071:             raise RuntimeError('ioctl failed to get enclosure status')
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 71, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 71, __pyx_L1_error)
/* … */
  __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_u_ioctl_failed_to_get_enclosure_st); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(0, 71, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__5);
  __Pyx_GIVEREF(__pyx_tuple__5);
 072:         else:
+073:             if estat == 0:
  /*else*/ {
    __pyx_t_3 = ((__pyx_v_estat == 0) != 0);
    if (__pyx_t_3) {
/* … */
      goto __pyx_L6;
    }
+074:                 enc_info['status'].append('OK')
      __pyx_t_1 = __Pyx_PyDict_GetItem(__pyx_v_enc_info, __pyx_n_u_status); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 74, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_5 = __Pyx_PyObject_Append(__pyx_t_1, __pyx_n_u_OK); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(0, 74, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 075:             else:
+076:                 if (estat & ses.SES_ENCSTAT_INFO):
    /*else*/ {
      __pyx_t_3 = ((__pyx_v_estat & SES_ENCSTAT_INFO) != 0);
      if (__pyx_t_3) {
/* … */
      }
+077:                     enc_info['status'].append('INFO')
        __pyx_t_1 = __Pyx_PyDict_GetItem(__pyx_v_enc_info, __pyx_n_u_status); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 77, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_5 = __Pyx_PyObject_Append(__pyx_t_1, __pyx_n_u_INFO); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(0, 77, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+078:                 if (estat & ses.SES_ENCSTAT_NONCRITICAL):
      __pyx_t_3 = ((__pyx_v_estat & SES_ENCSTAT_NONCRITICAL) != 0);
      if (__pyx_t_3) {
/* … */
      }
+079:                     enc_info['status'].append('NONCRITICAL')
        __pyx_t_1 = __Pyx_PyDict_GetItem(__pyx_v_enc_info, __pyx_n_u_status); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 79, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_5 = __Pyx_PyObject_Append(__pyx_t_1, __pyx_n_u_NONCRITICAL); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(0, 79, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+080:                 if (estat & ses.SES_ENCSTAT_CRITICAL):
      __pyx_t_3 = ((__pyx_v_estat & SES_ENCSTAT_CRITICAL) != 0);
      if (__pyx_t_3) {
/* … */
      }
+081:                     enc_info['status'].append('CRITICAL')
        __pyx_t_1 = __Pyx_PyDict_GetItem(__pyx_v_enc_info, __pyx_n_u_status); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 81, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_5 = __Pyx_PyObject_Append(__pyx_t_1, __pyx_n_u_CRITICAL); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(0, 81, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+082:                 if (estat & ses.SES_ENCSTAT_UNRECOV):
      __pyx_t_3 = ((__pyx_v_estat & SES_ENCSTAT_UNRECOV) != 0);
      if (__pyx_t_3) {
/* … */
      }
    }
    __pyx_L6:;
  }
+083:                     enc_info['status'].append('UNRECOV')
        __pyx_t_1 = __Pyx_PyDict_GetItem(__pyx_v_enc_info, __pyx_n_u_status); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 83, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_5 = __Pyx_PyObject_Append(__pyx_t_1, __pyx_n_u_UNRECOV); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(0, 83, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 084: 
 085:         # query all elements returned by ses device
+086:         res = ioctl(self.enc_fd, ses.ENCIOC_GETNELM, <ses.caddr_t>&num_elms)
  __pyx_v_res = ioctl(__pyx_v_self->enc_fd, ENCIOC_GETNELM, ((caddr_t)(&__pyx_v_num_elms)));
+087:         if res < 0:
  __pyx_t_3 = ((__pyx_v_res < 0) != 0);
  if (unlikely(__pyx_t_3)) {
/* … */
  }
+088:             raise RuntimeError('ioctl failed to get number of elements')
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 88, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 88, __pyx_L1_error)
/* … */
  __pyx_tuple__6 = PyTuple_Pack(1, __pyx_kp_u_ioctl_failed_to_get_number_of_el); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(0, 88, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__6);
  __Pyx_GIVEREF(__pyx_tuple__6);
 089: 
+090:         objp = <ses.encioc_element_t*>calloc(num_elms, sizeof(ses.encioc_element_t))
  __pyx_v_objp = ((encioc_element_t *)calloc(__pyx_v_num_elms, (sizeof(encioc_element_t))));
+091:         if not objp:
  __pyx_t_3 = ((!(__pyx_v_objp != 0)) != 0);
  if (unlikely(__pyx_t_3)) {
/* … */
  }
+092:             raise MemoryError('calloc objp failed')
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_MemoryError, __pyx_tuple__7, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 92, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 92, __pyx_L1_error)
/* … */
  __pyx_tuple__7 = PyTuple_Pack(1, __pyx_kp_u_calloc_objp_failed); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(0, 92, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__7);
  __Pyx_GIVEREF(__pyx_tuple__7);
 093: 
+094:         res = ioctl(self.enc_fd, ses.ENCIOC_GETELMMAP, <ses.caddr_t>objp)
  __pyx_v_res = ioctl(__pyx_v_self->enc_fd, ENCIOC_GETELMMAP, ((caddr_t)__pyx_v_objp));
+095:         if res < 0:
  __pyx_t_3 = ((__pyx_v_res < 0) != 0);
  if (unlikely(__pyx_t_3)) {
/* … */
  }
+096:             raise RuntimeError('ioctl failed to get enclosure element map')
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 96, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 96, __pyx_L1_error)
/* … */
  __pyx_tuple__8 = PyTuple_Pack(1, __pyx_kp_u_ioctl_failed_to_get_enclosure_el); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(0, 96, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__8);
  __Pyx_GIVEREF(__pyx_tuple__8);
 097: 
 098:         # we've got number of elements and mapped them, now iterate through
 099:         # them and get their information
+100:         for i in range(num_elms):
  __pyx_t_6 = __pyx_v_num_elms;
  __pyx_t_7 = __pyx_t_6;
  for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_7; __pyx_t_8+=1) {
    __pyx_v_i = __pyx_t_8;
+101:             ob.elm_idx = objp[i].elm_idx
    __pyx_t_9 = (__pyx_v_objp[__pyx_v_i]).elm_idx;
    __pyx_v_ob.elm_idx = __pyx_t_9;
+102:             res = ioctl(self.enc_fd, ses.ENCIOC_GETELMSTAT, <ses.caddr_t>&ob)
    __pyx_v_res = ioctl(__pyx_v_self->enc_fd, ENCIOC_GETELMSTAT, ((caddr_t)(&__pyx_v_ob)));
+103:             if res < 0:
    __pyx_t_3 = ((__pyx_v_res < 0) != 0);
    if (unlikely(__pyx_t_3)) {
/* … */
    }
+104:                 raise RuntimeError('ioctl failed to get element status')
      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 104, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_Raise(__pyx_t_1, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __PYX_ERR(0, 104, __pyx_L1_error)
/* … */
  __pyx_tuple__9 = PyTuple_Pack(1, __pyx_kp_u_ioctl_failed_to_get_element_stat); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(0, 104, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__9);
  __Pyx_GIVEREF(__pyx_tuple__9);
 105: 
 106:             element = {
+107:                 ob.elm_idx: {
    __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 107, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_2 = __Pyx_PyInt_From_unsigned_int(__pyx_v_ob.elm_idx); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 107, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
+108:                     'type': objp[i].elm_type,
    __pyx_t_4 = __Pyx_PyDict_NewPresized(4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 108, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_10 = __Pyx_PyInt_From_elm_type_t((__pyx_v_objp[__pyx_v_i]).elm_type); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 108, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_10);
    if (PyDict_SetItem(__pyx_t_4, __pyx_n_u_type, __pyx_t_10) < 0) __PYX_ERR(0, 108, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
    { /* enter inner scope */
+109:                     'status': [ob.cstat[j] for j in range(4)],
      __pyx_t_10 = PyList_New(0); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 109, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_10);
      for (__pyx_t_11 = 0; __pyx_t_11 < 4; __pyx_t_11+=1) {
        __pyx_7genexpr__pyx_v_j = __pyx_t_11;
        __pyx_t_12 = __Pyx_PyInt_From_unsigned_char((__pyx_v_ob.cstat[__pyx_7genexpr__pyx_v_j])); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 109, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_12);
        if (unlikely(__Pyx_ListComp_Append(__pyx_t_10, (PyObject*)__pyx_t_12))) __PYX_ERR(0, 109, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
      }
    } /* exit inner scope */
    if (PyDict_SetItem(__pyx_t_4, __pyx_n_u_status, __pyx_t_10) < 0) __PYX_ERR(0, 108, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
    if (PyDict_SetItem(__pyx_t_4, __pyx_n_u_descriptor, __pyx_kp_u__2) < 0) __PYX_ERR(0, 108, __pyx_L1_error)
    if (PyDict_SetItem(__pyx_t_4, __pyx_n_u_dev, __pyx_kp_u__2) < 0) __PYX_ERR(0, 108, __pyx_L1_error)
    if (PyDict_SetItem(__pyx_t_1, __pyx_t_2, __pyx_t_4) < 0) __PYX_ERR(0, 107, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_XDECREF_SET(__pyx_v_element, ((PyObject*)__pyx_t_1));
    __pyx_t_1 = 0;
 110:                     'descriptor': '',
 111:                     'dev': '',
 112:                 }
 113:             }
 114: 
 115:             # element descriptor info
+116:             bzero(&objd, sizeof(objd))
    bzero((&__pyx_v_objd), (sizeof(__pyx_v_objd)));
+117:             objd.elm_idx = objp[i].elm_idx
    __pyx_t_9 = (__pyx_v_objp[__pyx_v_i]).elm_idx;
    __pyx_v_objd.elm_idx = __pyx_t_9;
+118:             objd.elm_desc_len = UINT16_MAX
    __pyx_v_objd.elm_desc_len = UINT16_MAX;
+119:             objd.elm_desc_str = <char*>calloc(UINT16_MAX, sizeof(char))
    __pyx_v_objd.elm_desc_str = ((char *)calloc(UINT16_MAX, (sizeof(char))));
+120:             res = ioctl(self.enc_fd, ses.ENCIOC_GETELMDESC, <ses.caddr_t>&objd)
    __pyx_v_res = ioctl(__pyx_v_self->enc_fd, ENCIOC_GETELMDESC, ((caddr_t)(&__pyx_v_objd)));
+121:             if res < 0:
    __pyx_t_3 = ((__pyx_v_res < 0) != 0);
    if (unlikely(__pyx_t_3)) {
/* … */
    }
+122:                 raise RuntimeError('ioctl failed to get element description')
      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 122, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_Raise(__pyx_t_1, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __PYX_ERR(0, 122, __pyx_L1_error)
/* … */
  __pyx_tuple__10 = PyTuple_Pack(1, __pyx_kp_u_ioctl_failed_to_get_element_desc); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(0, 122, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__10);
  __Pyx_GIVEREF(__pyx_tuple__10);
 123:             else:
+124:                 element[ob.elm_idx]['descriptor'] = objd.elm_desc_str.strip()
    /*else*/ {
      __pyx_t_4 = __Pyx_PyUnicode_FromString(__pyx_v_objd.elm_desc_str); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 124, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_strip); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 124, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_t_4 = NULL;
      if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
        __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
        if (likely(__pyx_t_4)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
          __Pyx_INCREF(__pyx_t_4);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_2, function);
        }
      }
      __pyx_t_1 = (__pyx_t_4) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4) : __Pyx_PyObject_CallNoArg(__pyx_t_2);
      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
      if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 124, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __pyx_t_2 = __Pyx_PyInt_From_unsigned_int(__pyx_v_ob.elm_idx); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 124, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __pyx_t_4 = __Pyx_PyDict_GetItem(__pyx_v_element, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 124, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      if (unlikely(PyObject_SetItem(__pyx_t_4, __pyx_n_u_descriptor, __pyx_t_1) < 0)) __PYX_ERR(0, 124, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+125:                 free(objd.elm_desc_str)
      free(__pyx_v_objd.elm_desc_str);
    }
 126: 
 127:             # devices connected to element
+128:             bzero(&objdn, sizeof(objdn))
    bzero((&__pyx_v_objdn), (sizeof(__pyx_v_objdn)));
+129:             objdn.elm_idx = objp[i].elm_idx
    __pyx_t_9 = (__pyx_v_objp[__pyx_v_i]).elm_idx;
    __pyx_v_objdn.elm_idx = __pyx_t_9;
+130:             objdn.elm_names_size = elm_name_size
    __pyx_v_objdn.elm_names_size = __pyx_v_elm_name_size;
+131:             objdn.elm_devnames = <char*>calloc(elm_name_size, sizeof(char))
    __pyx_v_objdn.elm_devnames = ((char *)calloc(__pyx_v_elm_name_size, (sizeof(char))));
+132:             ioctl(self.enc_fd, ses.ENCIOC_GETELMDEVNAMES, <ses.caddr_t>&objdn)
    (void)(ioctl(__pyx_v_self->enc_fd, ENCIOC_GETELMDEVNAMES, ((caddr_t)(&__pyx_v_objdn))));
+133:             element[ob.elm_idx]['dev'] = objdn.elm_devnames.strip()
    __pyx_t_4 = __Pyx_PyUnicode_FromString(__pyx_v_objdn.elm_devnames); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 133, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_strip); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 133, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_4 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
      if (likely(__pyx_t_4)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
        __Pyx_INCREF(__pyx_t_4);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_2, function);
      }
    }
    __pyx_t_1 = (__pyx_t_4) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4) : __Pyx_PyObject_CallNoArg(__pyx_t_2);
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 133, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_2 = __Pyx_PyInt_From_unsigned_int(__pyx_v_ob.elm_idx); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 133, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_4 = __Pyx_PyDict_GetItem(__pyx_v_element, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 133, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(PyObject_SetItem(__pyx_t_4, __pyx_n_u_dev, __pyx_t_1) < 0)) __PYX_ERR(0, 133, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+134:             free(objdn.elm_devnames)
    free(__pyx_v_objdn.elm_devnames);
 135: 
 136:             # update the final dict
+137:             enc_info['elements'].update(element)
    __pyx_t_4 = __Pyx_PyDict_GetItem(__pyx_v_enc_info, __pyx_n_u_elements); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 137, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_update); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 137, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_4 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
      if (likely(__pyx_t_4)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
        __Pyx_INCREF(__pyx_t_4);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_2, function);
      }
    }
    __pyx_t_1 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_4, __pyx_v_element) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_element);
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 137, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  }
 138: 
+139:         free(objp)
  free(__pyx_v_objp);
+140:         return enc_info
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_enc_info);
  __pyx_r = __pyx_v_enc_info;
  goto __pyx_L0;
 141: 
+142:     cdef int setobj(self, long element, unsigned char *action) except -1:
static int __pyx_f_3bsd_9enclosure_9Enclosure_setobj(struct __pyx_obj_3bsd_9enclosure_Enclosure *__pyx_v_self, long __pyx_v_element, unsigned char *__pyx_v_action) {
  encioc_elm_status_t __pyx_v_obj;
  int __pyx_v_res;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("setobj", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("bsd.enclosure.Enclosure.setobj", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 143:         cdef ses.encioc_elm_status_t obj
+144:         cdef int res = -1
  __pyx_v_res = -1;
 145: 
+146:         obj.elm_idx = element
  __pyx_v_obj.elm_idx = __pyx_v_element;
+147:         obj.cstat = action
  memcpy(&(__pyx_v_obj.cstat[0]), __pyx_v_action, sizeof(__pyx_v_obj.cstat[0]) * (4 - 0));
+148:         with nogil:
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L5;
        }
        __pyx_L4_error: {
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L1_error;
        }
        __pyx_L5:;
      }
  }
+149:             res = ioctl(self.enc_fd, ses.ENCIOC_SETELMSTAT, <ses.caddr_t>&obj)
        __pyx_v_res = ioctl(__pyx_v_self->enc_fd, ENCIOC_SETELMSTAT, ((caddr_t)(&__pyx_v_obj)));
+150:             if res < 0:
        __pyx_t_1 = ((__pyx_v_res < 0) != 0);
        if (__pyx_t_1) {
/* … */
        }
      }
+151:                 raise RuntimeError('ioctl failed to set element status')
          {
              #ifdef WITH_THREAD
              PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
              #endif
              /*try:*/ {
                __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__11, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 151, __pyx_L8_error)
                __Pyx_GOTREF(__pyx_t_2);
                __Pyx_Raise(__pyx_t_2, 0, 0, 0);
                __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
                __PYX_ERR(0, 151, __pyx_L8_error)
              }
              /*finally:*/ {
                __pyx_L8_error: {
                  #ifdef WITH_THREAD
                  __Pyx_PyGILState_Release(__pyx_gilstate_save);
                  #endif
                  goto __pyx_L4_error;
                }
              }
          }
/* … */
  __pyx_tuple__11 = PyTuple_Pack(1, __pyx_kp_u_ioctl_failed_to_set_element_stat); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(0, 151, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__11);
  __Pyx_GIVEREF(__pyx_tuple__11);
 152: 
+153:         return res
  __pyx_r = __pyx_v_res;
  goto __pyx_L0;
 154: 
+155:     def identify(self, element):
/* Python wrapper */
static PyObject *__pyx_pw_3bsd_9enclosure_9Enclosure_9identify(PyObject *__pyx_v_self, PyObject *__pyx_v_element); /*proto*/
static PyObject *__pyx_pw_3bsd_9enclosure_9Enclosure_9identify(PyObject *__pyx_v_self, PyObject *__pyx_v_element) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("identify (wrapper)", 0);
  __pyx_r = __pyx_pf_3bsd_9enclosure_9Enclosure_8identify(((struct __pyx_obj_3bsd_9enclosure_Enclosure *)__pyx_v_self), ((PyObject *)__pyx_v_element));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_3bsd_9enclosure_9Enclosure_8identify(struct __pyx_obj_3bsd_9enclosure_Enclosure *__pyx_v_self, PyObject *__pyx_v_element) {
  unsigned char __pyx_v_cstat[4];
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("identify", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("bsd.enclosure.Enclosure.identify", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+156:         cdef unsigned char[4] cstat = [128, 0, 2, 0]
  __pyx_t_1[0] = 0x80;
  __pyx_t_1[1] = 0;
  __pyx_t_1[2] = 2;
  __pyx_t_1[3] = 0;
  memcpy(&(__pyx_v_cstat[0]), __pyx_t_1, sizeof(__pyx_v_cstat[0]) * (4));
+157:         return self.setobj(<long>element, cstat)
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = __Pyx_PyInt_As_long(__pyx_v_element); if (unlikely((__pyx_t_2 == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 157, __pyx_L1_error)
  __pyx_t_3 = ((struct __pyx_vtabstruct_3bsd_9enclosure_Enclosure *)__pyx_v_self->__pyx_vtab)->setobj(__pyx_v_self, ((long)__pyx_t_2), __pyx_v_cstat); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(0, 157, __pyx_L1_error)
  __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 157, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;
 158: 
+159:     def clear(self, element):
/* Python wrapper */
static PyObject *__pyx_pw_3bsd_9enclosure_9Enclosure_11clear(PyObject *__pyx_v_self, PyObject *__pyx_v_element); /*proto*/
static PyObject *__pyx_pw_3bsd_9enclosure_9Enclosure_11clear(PyObject *__pyx_v_self, PyObject *__pyx_v_element) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("clear (wrapper)", 0);
  __pyx_r = __pyx_pf_3bsd_9enclosure_9Enclosure_10clear(((struct __pyx_obj_3bsd_9enclosure_Enclosure *)__pyx_v_self), ((PyObject *)__pyx_v_element));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_3bsd_9enclosure_9Enclosure_10clear(struct __pyx_obj_3bsd_9enclosure_Enclosure *__pyx_v_self, PyObject *__pyx_v_element) {
  unsigned char __pyx_v_cstat[4];
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("clear", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("bsd.enclosure.Enclosure.clear", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+160:         cdef unsigned char[4] cstat = [128, 0, 0, 0]
  __pyx_t_1[0] = 0x80;
  __pyx_t_1[1] = 0;
  __pyx_t_1[2] = 0;
  __pyx_t_1[3] = 0;
  memcpy(&(__pyx_v_cstat[0]), __pyx_t_1, sizeof(__pyx_v_cstat[0]) * (4));
+161:         return self.setobj(<long>element, cstat)
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = __Pyx_PyInt_As_long(__pyx_v_element); if (unlikely((__pyx_t_2 == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 161, __pyx_L1_error)
  __pyx_t_3 = ((struct __pyx_vtabstruct_3bsd_9enclosure_Enclosure *)__pyx_v_self->__pyx_vtab)->setobj(__pyx_v_self, ((long)__pyx_t_2), __pyx_v_cstat); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(0, 161, __pyx_L1_error)
  __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 161, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;
 162: 
+163:     def fault(self, element):
/* Python wrapper */
static PyObject *__pyx_pw_3bsd_9enclosure_9Enclosure_13fault(PyObject *__pyx_v_self, PyObject *__pyx_v_element); /*proto*/
static PyObject *__pyx_pw_3bsd_9enclosure_9Enclosure_13fault(PyObject *__pyx_v_self, PyObject *__pyx_v_element) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("fault (wrapper)", 0);
  __pyx_r = __pyx_pf_3bsd_9enclosure_9Enclosure_12fault(((struct __pyx_obj_3bsd_9enclosure_Enclosure *)__pyx_v_self), ((PyObject *)__pyx_v_element));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_3bsd_9enclosure_9Enclosure_12fault(struct __pyx_obj_3bsd_9enclosure_Enclosure *__pyx_v_self, PyObject *__pyx_v_element) {
  unsigned char __pyx_v_cstat[4];
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("fault", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("bsd.enclosure.Enclosure.fault", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+164:         cdef unsigned char[4] cstat = [128, 0, 0, 32]
  __pyx_t_1[0] = 0x80;
  __pyx_t_1[1] = 0;
  __pyx_t_1[2] = 0;
  __pyx_t_1[3] = 32;
  memcpy(&(__pyx_v_cstat[0]), __pyx_t_1, sizeof(__pyx_v_cstat[0]) * (4));
+165:         return self.setobj(<long>element, cstat)
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = __Pyx_PyInt_As_long(__pyx_v_element); if (unlikely((__pyx_t_2 == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 165, __pyx_L1_error)
  __pyx_t_3 = ((struct __pyx_vtabstruct_3bsd_9enclosure_Enclosure *)__pyx_v_self->__pyx_vtab)->setobj(__pyx_v_self, ((long)__pyx_t_2), __pyx_v_cstat); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(0, 165, __pyx_L1_error)
  __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 165, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;
 166: 
+167:     def status(self):
/* Python wrapper */
static PyObject *__pyx_pw_3bsd_9enclosure_9Enclosure_15status(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_3bsd_9enclosure_9Enclosure_15status(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("status (wrapper)", 0);
  __pyx_r = __pyx_pf_3bsd_9enclosure_9Enclosure_14status(((struct __pyx_obj_3bsd_9enclosure_Enclosure *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_3bsd_9enclosure_9Enclosure_14status(struct __pyx_obj_3bsd_9enclosure_Enclosure *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("status", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("bsd.enclosure.Enclosure.status", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+168:       return self.__status__()
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_status_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 168, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 168, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;