Generated by Cython 0.29.36

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 libc.stdint cimport uint16_t
 006: from posix.ioctl cimport ioctl
 007: from posix.fcntl cimport open, O_RDWR
 008: from posix.unistd cimport close
 009: from posix.strings cimport bzero
 010: from libc.stdlib cimport calloc, free
 011: from libc.stdint cimport UINT16_MAX
 012: from libc.string cimport strdup
 013: 
 014: 
+015: 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 {
  void (*clean_up)(struct __pyx_obj_3bsd_9enclosure_Enclosure *, int, struct __pyx_t_3bsd_3ses_elm_info_t *, encioc_element_t *);
  int (*setobj)(struct __pyx_obj_3bsd_9enclosure_Enclosure *, long, unsigned char *);
};
static struct __pyx_vtabstruct_3bsd_9enclosure_Enclosure *__pyx_vtabptr_3bsd_9enclosure_Enclosure;
 016: 
 017:     cdef const char* enc  # /dev/ses device passed to us
 018:     cdef int enc_fd  # file descriptor for enclosure device
 019: 
+020:     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, 20, __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, 20, __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;
}
+021:         self.enc = enc
  __pyx_t_1 = __Pyx_PyObject_AsString(__pyx_v_enc); if (unlikely((!__pyx_t_1) && PyErr_Occurred())) __PYX_ERR(0, 21, __pyx_L1_error)
  __pyx_v_self->enc = __pyx_t_1;
+022:         self.enc_fd = -1
  __pyx_v_self->enc_fd = -1;
+023:         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:;
      }
  }
+024:             self.enc_fd = open(self.enc, O_RDWR)
        __pyx_v_self->enc_fd = open(__pyx_v_self->enc, O_RDWR);
+025:             if self.enc_fd == -1:
        __pyx_t_2 = ((__pyx_v_self->enc_fd == -1L) != 0);
        if (__pyx_t_2) {
/* … */
        }
      }
+026:                 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, 26, __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, 26, __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, 26, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple_);
  __Pyx_GIVEREF(__pyx_tuple_);
 027: 
+028:     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, 28, __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, 28, __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;
}
+029:         self.enc = enc
  __pyx_t_1 = __Pyx_PyObject_AsString(__pyx_v_enc); if (unlikely((!__pyx_t_1) && PyErr_Occurred())) __PYX_ERR(0, 29, __pyx_L1_error)
  __pyx_v_self->enc = __pyx_t_1;
 030: 
+031:     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();
}
+032:         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:;
      }
  }
+033:             if self.enc_fd >= 0:
        __pyx_t_1 = ((__pyx_v_self->enc_fd >= 0) != 0);
        if (__pyx_t_1) {
/* … */
        }
      }
+034:                 close(self.enc_fd)
          (void)(close(__pyx_v_self->enc_fd));
 035: 
+036:     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;
  struct __pyx_t_3bsd_3ses_elm_info_t *__pyx_v_elm_info;
  int __pyx_v_i;
  PyObject *__pyx_v_enc_info = 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_2);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_XDECREF(__pyx_t_10);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_XDECREF(__pyx_t_13);
  __Pyx_XDECREF(__pyx_t_15);
  __Pyx_XDECREF(__pyx_t_16);
  __Pyx_AddTraceback("bsd.enclosure.Enclosure.__status__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_enc_info);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 037:         cdef ses.encioc_string_t enc_name
 038:         cdef ses.encioc_string_t enc_id
+039:         cdef ses.encioc_element_t * objp = NULL
  __pyx_v_objp = NULL;
 040:         cdef ses.encioc_elm_status_t ob
 041:         cdef ses.encioc_elm_desc_t objd
 042:         cdef ses.encioc_elm_devnames_t objdn
 043:         cdef unsigned char _enc_name[32]
 044:         cdef unsigned char _enc_id[32]
+045:         cdef int res = -1
  __pyx_v_res = -1;
+046:         cdef int num_elms = 0
  __pyx_v_num_elms = 0;
+047:         cdef int elm_name_size = 128
  __pyx_v_elm_name_size = 0x80;
 048:         cdef ses.u_char estat
+049:         cdef ses.elm_info_t * elm_info = NULL
  __pyx_v_elm_info = NULL;
 050: 
+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:         enc_id.bufsiz = sizeof(_enc_id)
  __pyx_v_enc_id.bufsiz = (sizeof(__pyx_v__enc_id));
+054:         enc_id.buf = &_enc_id[0]
  __pyx_v_enc_id.buf = (&(__pyx_v__enc_id[0]));
+055:         try:
  /*try:*/ {
+056:             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_L8;
          }
          __pyx_L7_error: {
            #ifdef WITH_THREAD
            __Pyx_FastGIL_Forget();
            Py_BLOCK_THREADS
            #endif
            goto __pyx_L4_error;
          }
          __pyx_L8:;
        }
    }
 057:                 # enclosure name
+058:                 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)));
+059:                 if res != 0:
          __pyx_t_1 = ((__pyx_v_res != 0) != 0);
          if (__pyx_t_1) {
/* … */
          }
+060:                     raise RuntimeError('ioctl failed to get enclosure name')
            {
                #ifdef WITH_THREAD
                PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
                #endif
                /*try:*/ {
                  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 60, __pyx_L11_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, 60, __pyx_L11_error)
                }
                /*finally:*/ {
                  __pyx_L11_error: {
                    #ifdef WITH_THREAD
                    __Pyx_PyGILState_Release(__pyx_gilstate_save);
                    #endif
                    goto __pyx_L7_error;
                  }
                }
            }
/* … */
  __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_u_ioctl_failed_to_get_enclosure_na); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(0, 60, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__2);
  __Pyx_GIVEREF(__pyx_tuple__2);
 061: 
 062:                 # enclosure id
+063:                 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)));
+064:                 if res != 0:
          __pyx_t_1 = ((__pyx_v_res != 0) != 0);
          if (__pyx_t_1) {
/* … */
          }
+065:                     raise RuntimeError('ioctl failed to get enclosure id')
            {
                #ifdef WITH_THREAD
                PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
                #endif
                /*try:*/ {
                  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 65, __pyx_L15_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, 65, __pyx_L15_error)
                }
                /*finally:*/ {
                  __pyx_L15_error: {
                    #ifdef WITH_THREAD
                    __Pyx_PyGILState_Release(__pyx_gilstate_save);
                    #endif
                    goto __pyx_L7_error;
                  }
                }
            }
/* … */
  __pyx_tuple__3 = PyTuple_Pack(1, __pyx_kp_u_ioctl_failed_to_get_enclosure_id); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 65, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__3);
  __Pyx_GIVEREF(__pyx_tuple__3);
 066: 
 067:                 # number of enclosure elements
+068:                 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)));
+069:                 if res < 0:
          __pyx_t_1 = ((__pyx_v_res < 0) != 0);
          if (__pyx_t_1) {
/* … */
          }
+070:                     raise RuntimeError('ioctl failed to get number of elements')
            {
                #ifdef WITH_THREAD
                PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
                #endif
                /*try:*/ {
                  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 70, __pyx_L19_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, 70, __pyx_L19_error)
                }
                /*finally:*/ {
                  __pyx_L19_error: {
                    #ifdef WITH_THREAD
                    __Pyx_PyGILState_Release(__pyx_gilstate_save);
                    #endif
                    goto __pyx_L7_error;
                  }
                }
            }
/* … */
  __pyx_tuple__4 = PyTuple_Pack(1, __pyx_kp_u_ioctl_failed_to_get_number_of_el); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(0, 70, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__4);
  __Pyx_GIVEREF(__pyx_tuple__4);
 071: 
 072:                 # enclosure status
+073:                 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)));
+074:                 if res != 0:
          __pyx_t_1 = ((__pyx_v_res != 0) != 0);
          if (__pyx_t_1) {
/* … */
          }
+075:                     raise RuntimeError('ioctl failed to get enclosure 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__5, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 75, __pyx_L23_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, 75, __pyx_L23_error)
                }
                /*finally:*/ {
                  __pyx_L23_error: {
                    #ifdef WITH_THREAD
                    __Pyx_PyGILState_Release(__pyx_gilstate_save);
                    #endif
                    goto __pyx_L7_error;
                  }
                }
            }
/* … */
  __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_u_ioctl_failed_to_get_enclosure_st); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(0, 75, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__5);
  __Pyx_GIVEREF(__pyx_tuple__5);
 076: 
+077:                 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))));
+078:                 if not objp:
          __pyx_t_1 = ((!(__pyx_v_objp != 0)) != 0);
          if (__pyx_t_1) {
/* … */
          }
+079:                     raise MemoryError('calloc objp failed')
            {
                #ifdef WITH_THREAD
                PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
                #endif
                /*try:*/ {
                  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_MemoryError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 79, __pyx_L27_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, 79, __pyx_L27_error)
                }
                /*finally:*/ {
                  __pyx_L27_error: {
                    #ifdef WITH_THREAD
                    __Pyx_PyGILState_Release(__pyx_gilstate_save);
                    #endif
                    goto __pyx_L7_error;
                  }
                }
            }
/* … */
  __pyx_tuple__6 = PyTuple_Pack(1, __pyx_kp_u_calloc_objp_failed); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(0, 79, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__6);
  __Pyx_GIVEREF(__pyx_tuple__6);
 080: 
+081:                 elm_info = <ses.elm_info_t*>calloc(num_elms, sizeof(ses.elm_info_t))
          __pyx_v_elm_info = ((struct __pyx_t_3bsd_3ses_elm_info_t *)calloc(__pyx_v_num_elms, (sizeof(struct __pyx_t_3bsd_3ses_elm_info_t))));
+082:                 if not elm_info:
          __pyx_t_1 = ((!(__pyx_v_elm_info != 0)) != 0);
          if (__pyx_t_1) {
/* … */
          }
+083:                     raise MemoryError('calloc elm_info failed')
            {
                #ifdef WITH_THREAD
                PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
                #endif
                /*try:*/ {
                  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_MemoryError, __pyx_tuple__7, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 83, __pyx_L31_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, 83, __pyx_L31_error)
                }
                /*finally:*/ {
                  __pyx_L31_error: {
                    #ifdef WITH_THREAD
                    __Pyx_PyGILState_Release(__pyx_gilstate_save);
                    #endif
                    goto __pyx_L7_error;
                  }
                }
            }
/* … */
  __pyx_tuple__7 = PyTuple_Pack(1, __pyx_kp_u_calloc_elm_info_failed); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(0, 83, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__7);
  __Pyx_GIVEREF(__pyx_tuple__7);
 084: 
+085:                 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));
+086:                 if res < 0:
          __pyx_t_1 = ((__pyx_v_res < 0) != 0);
          if (__pyx_t_1) {
/* … */
          }
+087:                     raise RuntimeError('ioctl failed to get enclosure element map')
            {
                #ifdef WITH_THREAD
                PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
                #endif
                /*try:*/ {
                  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 87, __pyx_L35_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, 87, __pyx_L35_error)
                }
                /*finally:*/ {
                  __pyx_L35_error: {
                    #ifdef WITH_THREAD
                    __Pyx_PyGILState_Release(__pyx_gilstate_save);
                    #endif
                    goto __pyx_L7_error;
                  }
                }
            }
/* … */
  __pyx_tuple__8 = PyTuple_Pack(1, __pyx_kp_u_ioctl_failed_to_get_enclosure_el); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(0, 87, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__8);
  __Pyx_GIVEREF(__pyx_tuple__8);
 088: 
 089:                 # get each elements status and store in an array
+090:                 for i in range(num_elms):
          __pyx_t_3 = __pyx_v_num_elms;
          __pyx_t_4 = __pyx_t_3;
          for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) {
            __pyx_v_i = __pyx_t_5;
+091:                     ob.elm_idx = objp[i].elm_idx
            __pyx_t_6 = (__pyx_v_objp[__pyx_v_i]).elm_idx;
            __pyx_v_ob.elm_idx = __pyx_t_6;
+092:                     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)));
+093:                     if res < 0:
            __pyx_t_1 = ((__pyx_v_res < 0) != 0);
            if (__pyx_t_1) {
/* … */
            }
+094:                         raise RuntimeError('ioctl failed to get 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__9, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 94, __pyx_L43_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, 94, __pyx_L43_error)
                  }
                  /*finally:*/ {
                    __pyx_L43_error: {
                      #ifdef WITH_THREAD
                      __Pyx_PyGILState_Release(__pyx_gilstate_save);
                      #endif
                      goto __pyx_L7_error;
                    }
                  }
              }
/* … */
  __pyx_tuple__9 = PyTuple_Pack(1, __pyx_kp_u_ioctl_failed_to_get_element_stat); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(0, 94, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__9);
  __Pyx_GIVEREF(__pyx_tuple__9);
 095: 
 096:                     # copy out element id
+097:                     elm_info[i].idx = ob.elm_idx
            __pyx_t_6 = __pyx_v_ob.elm_idx;
            (__pyx_v_elm_info[__pyx_v_i]).idx = __pyx_t_6;
 098: 
 099:                     # copy out element type
+100:                     elm_info[i].elm_type = objp[i].elm_type
            __pyx_t_7 = (__pyx_v_objp[__pyx_v_i]).elm_type;
            (__pyx_v_elm_info[__pyx_v_i]).elm_type = __pyx_t_7;
 101: 
 102:                     # copy out element status (always size 4)
+103:                     elm_info[i].cstat[0] = ob.cstat[0]
            ((__pyx_v_elm_info[__pyx_v_i]).cstat[0]) = (__pyx_v_ob.cstat[0]);
+104:                     elm_info[i].cstat[1] = ob.cstat[1]
            ((__pyx_v_elm_info[__pyx_v_i]).cstat[1]) = (__pyx_v_ob.cstat[1]);
+105:                     elm_info[i].cstat[2] = ob.cstat[2]
            ((__pyx_v_elm_info[__pyx_v_i]).cstat[2]) = (__pyx_v_ob.cstat[2]);
+106:                     elm_info[i].cstat[3] = ob.cstat[3]
            ((__pyx_v_elm_info[__pyx_v_i]).cstat[3]) = (__pyx_v_ob.cstat[3]);
 107: 
+108:                     bzero(&objd, sizeof(objd))
            bzero((&__pyx_v_objd), (sizeof(__pyx_v_objd)));
+109:                     objd.elm_idx = objp[i].elm_idx
            __pyx_t_6 = (__pyx_v_objp[__pyx_v_i]).elm_idx;
            __pyx_v_objd.elm_idx = __pyx_t_6;
+110:                     objd.elm_desc_len = UINT16_MAX
            __pyx_v_objd.elm_desc_len = UINT16_MAX;
+111:                     objd.elm_desc_str = <char*>calloc(UINT16_MAX, sizeof(char))
            __pyx_v_objd.elm_desc_str = ((char *)calloc(UINT16_MAX, (sizeof(char))));
+112:                     elm_info[i].elm_desc_str = objd.elm_desc_str
            __pyx_t_8 = __pyx_v_objd.elm_desc_str;
            (__pyx_v_elm_info[__pyx_v_i]).elm_desc_str = __pyx_t_8;
+113:                     if not objd.elm_desc_str:
            __pyx_t_1 = ((!(__pyx_v_objd.elm_desc_str != 0)) != 0);
            if (__pyx_t_1) {
/* … */
            }
+114:                         raise MemoryError('calloc objd.elm_desc_str failed')
              {
                  #ifdef WITH_THREAD
                  PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
                  #endif
                  /*try:*/ {
                    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_MemoryError, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 114, __pyx_L49_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, 114, __pyx_L49_error)
                  }
                  /*finally:*/ {
                    __pyx_L49_error: {
                      #ifdef WITH_THREAD
                      __Pyx_PyGILState_Release(__pyx_gilstate_save);
                      #endif
                      goto __pyx_L7_error;
                    }
                  }
              }
/* … */
  __pyx_tuple__10 = PyTuple_Pack(1, __pyx_kp_u_calloc_objd_elm_desc_str_failed); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(0, 114, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__10);
  __Pyx_GIVEREF(__pyx_tuple__10);
 115:                     else:
+116:                         res = ioctl(self.enc_fd, ses.ENCIOC_GETELMDESC, <ses.caddr_t>&objd)
            /*else*/ {
              __pyx_v_res = ioctl(__pyx_v_self->enc_fd, ENCIOC_GETELMDESC, ((caddr_t)(&__pyx_v_objd)));
+117:                         if res < 0:
              __pyx_t_1 = ((__pyx_v_res < 0) != 0);
              if (__pyx_t_1) {
/* … */
              }
            }
+118:                             raise RuntimeError('ioctl failed to get element description')
                {
                    #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, 118, __pyx_L55_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, 118, __pyx_L55_error)
                    }
                    /*finally:*/ {
                      __pyx_L55_error: {
                        #ifdef WITH_THREAD
                        __Pyx_PyGILState_Release(__pyx_gilstate_save);
                        #endif
                        goto __pyx_L7_error;
                      }
                    }
                }
/* … */
  __pyx_tuple__11 = PyTuple_Pack(1, __pyx_kp_u_ioctl_failed_to_get_element_desc); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(0, 118, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__11);
  __Pyx_GIVEREF(__pyx_tuple__11);
 119: 
+120:                     bzero(&objdn, sizeof(objdn))
            bzero((&__pyx_v_objdn), (sizeof(__pyx_v_objdn)));
+121:                     objdn.elm_idx = objp[i].elm_idx
            __pyx_t_6 = (__pyx_v_objp[__pyx_v_i]).elm_idx;
            __pyx_v_objdn.elm_idx = __pyx_t_6;
+122:                     objdn.elm_names_size = elm_name_size
            __pyx_v_objdn.elm_names_size = __pyx_v_elm_name_size;
+123:                     objdn.elm_devnames = <char*>calloc(elm_name_size, sizeof(char))
            __pyx_v_objdn.elm_devnames = ((char *)calloc(__pyx_v_elm_name_size, (sizeof(char))));
+124:                     elm_info[i].elm_devnames = objdn.elm_devnames
            __pyx_t_8 = __pyx_v_objdn.elm_devnames;
            (__pyx_v_elm_info[__pyx_v_i]).elm_devnames = __pyx_t_8;
+125:                     if not objdn.elm_devnames:
            __pyx_t_1 = ((!(__pyx_v_objdn.elm_devnames != 0)) != 0);
            if (__pyx_t_1) {
/* … */
            }
+126:                         raise MemoryError('calloc elm_devnames failed')
              {
                  #ifdef WITH_THREAD
                  PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
                  #endif
                  /*try:*/ {
                    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_MemoryError, __pyx_tuple__12, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 126, __pyx_L61_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, 126, __pyx_L61_error)
                  }
                  /*finally:*/ {
                    __pyx_L61_error: {
                      #ifdef WITH_THREAD
                      __Pyx_PyGILState_Release(__pyx_gilstate_save);
                      #endif
                      goto __pyx_L7_error;
                    }
                  }
              }
/* … */
  __pyx_tuple__12 = PyTuple_Pack(1, __pyx_kp_u_calloc_elm_devnames_failed); if (unlikely(!__pyx_tuple__12)) __PYX_ERR(0, 126, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__12);
  __Pyx_GIVEREF(__pyx_tuple__12);
 127:                     else:
 128:                         # apparently this isn't critical and can return -1
 129:                         # so we ignore the returned value
+130:                         ioctl(self.enc_fd, ses.ENCIOC_GETELMDEVNAMES, <ses.caddr_t>&objdn)
            /*else*/ {
              (void)(ioctl(__pyx_v_self->enc_fd, ENCIOC_GETELMDEVNAMES, ((caddr_t)(&__pyx_v_objdn))));
            }
          }
        }
 131: 
 132:             enc_info = {
+133:                 'name': '',
    __pyx_t_2 = __Pyx_PyDict_NewPresized(4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 133, __pyx_L4_error)
    __Pyx_GOTREF(__pyx_t_2);
    if (PyDict_SetItem(__pyx_t_2, __pyx_n_u_name, __pyx_kp_u__13) < 0) __PYX_ERR(0, 133, __pyx_L4_error)
    if (PyDict_SetItem(__pyx_t_2, __pyx_n_u_id, __pyx_kp_u__13) < 0) __PYX_ERR(0, 133, __pyx_L4_error)
    __pyx_t_9 = PySet_New(0); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 135, __pyx_L4_error)
    __Pyx_GOTREF(__pyx_t_9);
    if (PyDict_SetItem(__pyx_t_2, __pyx_n_u_status, __pyx_t_9) < 0) __PYX_ERR(0, 133, __pyx_L4_error)
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 134:                 'id': '',
 135:                 'status': set(),
+136:                 'elements': {},
    __pyx_t_9 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 136, __pyx_L4_error)
    __Pyx_GOTREF(__pyx_t_9);
    if (PyDict_SetItem(__pyx_t_2, __pyx_n_u_elements, __pyx_t_9) < 0) __PYX_ERR(0, 133, __pyx_L4_error)
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __pyx_v_enc_info = ((PyObject*)__pyx_t_2);
    __pyx_t_2 = 0;
 137:             }
 138: 
 139:             # pull out enclosure name and id
+140:             enc_info['name'] = enc_name.buf.strip()
    __pyx_t_9 = __Pyx_PyUnicode_FromCString(__pyx_v_enc_name.buf); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 140, __pyx_L4_error)
    __Pyx_GOTREF(__pyx_t_9);
    __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_strip); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 140, __pyx_L4_error)
    __Pyx_GOTREF(__pyx_t_10);
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __pyx_t_9 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_10))) {
      __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_10);
      if (likely(__pyx_t_9)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_10);
        __Pyx_INCREF(__pyx_t_9);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_10, function);
      }
    }
    __pyx_t_2 = (__pyx_t_9) ? __Pyx_PyObject_CallOneArg(__pyx_t_10, __pyx_t_9) : __Pyx_PyObject_CallNoArg(__pyx_t_10);
    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 140, __pyx_L4_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
    if (unlikely(PyDict_SetItem(__pyx_v_enc_info, __pyx_n_u_name, __pyx_t_2) < 0)) __PYX_ERR(0, 140, __pyx_L4_error)
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+141:             enc_info['id'] = enc_id.buf.strip()
    __pyx_t_10 = __Pyx_PyUnicode_FromCString(__pyx_v_enc_id.buf); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 141, __pyx_L4_error)
    __Pyx_GOTREF(__pyx_t_10);
    __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_n_s_strip); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 141, __pyx_L4_error)
    __Pyx_GOTREF(__pyx_t_9);
    __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
    __pyx_t_10 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_9))) {
      __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_9);
      if (likely(__pyx_t_10)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_9);
        __Pyx_INCREF(__pyx_t_10);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_9, function);
      }
    }
    __pyx_t_2 = (__pyx_t_10) ? __Pyx_PyObject_CallOneArg(__pyx_t_9, __pyx_t_10) : __Pyx_PyObject_CallNoArg(__pyx_t_9);
    __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 141, __pyx_L4_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(PyDict_SetItem(__pyx_v_enc_info, __pyx_n_u_id, __pyx_t_2) < 0)) __PYX_ERR(0, 141, __pyx_L4_error)
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 142: 
 143:             # pull out enclosure status
+144:             if estat == 0:
    __pyx_t_1 = ((__pyx_v_estat == 0) != 0);
    if (__pyx_t_1) {
/* … */
      goto __pyx_L63;
    }
+145:                 enc_info['status'].add('OK')
      __pyx_t_9 = __Pyx_PyDict_GetItem(__pyx_v_enc_info, __pyx_n_u_status); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 145, __pyx_L4_error)
      __Pyx_GOTREF(__pyx_t_9);
      __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_add); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 145, __pyx_L4_error)
      __Pyx_GOTREF(__pyx_t_10);
      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
      __pyx_t_9 = NULL;
      if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_10))) {
        __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_10);
        if (likely(__pyx_t_9)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_10);
          __Pyx_INCREF(__pyx_t_9);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_10, function);
        }
      }
      __pyx_t_2 = (__pyx_t_9) ? __Pyx_PyObject_Call2Args(__pyx_t_10, __pyx_t_9, __pyx_n_u_OK) : __Pyx_PyObject_CallOneArg(__pyx_t_10, __pyx_n_u_OK);
      __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
      if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 145, __pyx_L4_error)
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 146:             else:
+147:                 if (estat & ses.SES_ENCSTAT_INFO):
    /*else*/ {
      __pyx_t_1 = ((__pyx_v_estat & SES_ENCSTAT_INFO) != 0);
      if (__pyx_t_1) {
/* … */
      }
+148:                     enc_info['status'].add('INFO')
        __pyx_t_10 = __Pyx_PyDict_GetItem(__pyx_v_enc_info, __pyx_n_u_status); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 148, __pyx_L4_error)
        __Pyx_GOTREF(__pyx_t_10);
        __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_n_s_add); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 148, __pyx_L4_error)
        __Pyx_GOTREF(__pyx_t_9);
        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
        __pyx_t_10 = NULL;
        if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_9))) {
          __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_9);
          if (likely(__pyx_t_10)) {
            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_9);
            __Pyx_INCREF(__pyx_t_10);
            __Pyx_INCREF(function);
            __Pyx_DECREF_SET(__pyx_t_9, function);
          }
        }
        __pyx_t_2 = (__pyx_t_10) ? __Pyx_PyObject_Call2Args(__pyx_t_9, __pyx_t_10, __pyx_n_u_INFO) : __Pyx_PyObject_CallOneArg(__pyx_t_9, __pyx_n_u_INFO);
        __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
        if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 148, __pyx_L4_error)
        __Pyx_GOTREF(__pyx_t_2);
        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+149:                 if (estat & ses.SES_ENCSTAT_NONCRITICAL):
      __pyx_t_1 = ((__pyx_v_estat & SES_ENCSTAT_NONCRITICAL) != 0);
      if (__pyx_t_1) {
/* … */
      }
+150:                     enc_info['status'].add('NONCRITICAL')
        __pyx_t_9 = __Pyx_PyDict_GetItem(__pyx_v_enc_info, __pyx_n_u_status); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 150, __pyx_L4_error)
        __Pyx_GOTREF(__pyx_t_9);
        __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_add); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 150, __pyx_L4_error)
        __Pyx_GOTREF(__pyx_t_10);
        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
        __pyx_t_9 = NULL;
        if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_10))) {
          __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_10);
          if (likely(__pyx_t_9)) {
            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_10);
            __Pyx_INCREF(__pyx_t_9);
            __Pyx_INCREF(function);
            __Pyx_DECREF_SET(__pyx_t_10, function);
          }
        }
        __pyx_t_2 = (__pyx_t_9) ? __Pyx_PyObject_Call2Args(__pyx_t_10, __pyx_t_9, __pyx_n_u_NONCRITICAL) : __Pyx_PyObject_CallOneArg(__pyx_t_10, __pyx_n_u_NONCRITICAL);
        __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
        if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 150, __pyx_L4_error)
        __Pyx_GOTREF(__pyx_t_2);
        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+151:                 if (estat & ses.SES_ENCSTAT_CRITICAL):
      __pyx_t_1 = ((__pyx_v_estat & SES_ENCSTAT_CRITICAL) != 0);
      if (__pyx_t_1) {
/* … */
      }
+152:                     enc_info['status'].add('CRITICAL')
        __pyx_t_10 = __Pyx_PyDict_GetItem(__pyx_v_enc_info, __pyx_n_u_status); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 152, __pyx_L4_error)
        __Pyx_GOTREF(__pyx_t_10);
        __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_n_s_add); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 152, __pyx_L4_error)
        __Pyx_GOTREF(__pyx_t_9);
        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
        __pyx_t_10 = NULL;
        if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_9))) {
          __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_9);
          if (likely(__pyx_t_10)) {
            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_9);
            __Pyx_INCREF(__pyx_t_10);
            __Pyx_INCREF(function);
            __Pyx_DECREF_SET(__pyx_t_9, function);
          }
        }
        __pyx_t_2 = (__pyx_t_10) ? __Pyx_PyObject_Call2Args(__pyx_t_9, __pyx_t_10, __pyx_n_u_CRITICAL) : __Pyx_PyObject_CallOneArg(__pyx_t_9, __pyx_n_u_CRITICAL);
        __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
        if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 152, __pyx_L4_error)
        __Pyx_GOTREF(__pyx_t_2);
        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+153:                 if (estat & ses.SES_ENCSTAT_UNRECOV):
      __pyx_t_1 = ((__pyx_v_estat & SES_ENCSTAT_UNRECOV) != 0);
      if (__pyx_t_1) {
/* … */
      }
    }
    __pyx_L63:;
+154:                     enc_info['status'].add('UNRECOV')
        __pyx_t_9 = __Pyx_PyDict_GetItem(__pyx_v_enc_info, __pyx_n_u_status); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 154, __pyx_L4_error)
        __Pyx_GOTREF(__pyx_t_9);
        __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_add); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 154, __pyx_L4_error)
        __Pyx_GOTREF(__pyx_t_10);
        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
        __pyx_t_9 = NULL;
        if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_10))) {
          __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_10);
          if (likely(__pyx_t_9)) {
            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_10);
            __Pyx_INCREF(__pyx_t_9);
            __Pyx_INCREF(function);
            __Pyx_DECREF_SET(__pyx_t_10, function);
          }
        }
        __pyx_t_2 = (__pyx_t_9) ? __Pyx_PyObject_Call2Args(__pyx_t_10, __pyx_t_9, __pyx_n_u_UNRECOV) : __Pyx_PyObject_CallOneArg(__pyx_t_10, __pyx_n_u_UNRECOV);
        __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
        if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 154, __pyx_L4_error)
        __Pyx_GOTREF(__pyx_t_2);
        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 155: 
 156:             # pull out enclosure element info
+157:             for i in range(num_elms):
    __pyx_t_3 = __pyx_v_num_elms;
    __pyx_t_4 = __pyx_t_3;
    for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) {
      __pyx_v_i = __pyx_t_5;
+158:                 enc_info['elements'].update({
      __pyx_t_10 = __Pyx_PyDict_GetItem(__pyx_v_enc_info, __pyx_n_u_elements); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 158, __pyx_L4_error)
      __Pyx_GOTREF(__pyx_t_10);
      __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_n_s_update); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 158, __pyx_L4_error)
      __Pyx_GOTREF(__pyx_t_9);
      __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+159:                     elm_info[i].idx: {
      __pyx_t_10 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 159, __pyx_L4_error)
      __Pyx_GOTREF(__pyx_t_10);
      __pyx_t_11 = __Pyx_PyInt_From_unsigned_int((__pyx_v_elm_info[__pyx_v_i]).idx); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 159, __pyx_L4_error)
      __Pyx_GOTREF(__pyx_t_11);
+160:                         'type': elm_info[i].elm_type,
      __pyx_t_12 = __Pyx_PyDict_NewPresized(4); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 160, __pyx_L4_error)
      __Pyx_GOTREF(__pyx_t_12);
      __pyx_t_13 = __Pyx_PyInt_From_elm_type_t((__pyx_v_elm_info[__pyx_v_i]).elm_type); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 160, __pyx_L4_error)
      __Pyx_GOTREF(__pyx_t_13);
      if (PyDict_SetItem(__pyx_t_12, __pyx_n_u_type, __pyx_t_13) < 0) __PYX_ERR(0, 160, __pyx_L4_error)
      __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
      { /* enter inner scope */
+161:                         'status': [elm_info[i].cstat[j] for j in range(4)],
        __pyx_t_13 = PyList_New(0); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 161, __pyx_L4_error)
        __Pyx_GOTREF(__pyx_t_13);
        for (__pyx_t_14 = 0; __pyx_t_14 < 4; __pyx_t_14+=1) {
          __pyx_7genexpr__pyx_v_j = __pyx_t_14;
          __pyx_t_15 = __Pyx_PyInt_From_unsigned_char(((__pyx_v_elm_info[__pyx_v_i]).cstat[__pyx_7genexpr__pyx_v_j])); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 161, __pyx_L4_error)
          __Pyx_GOTREF(__pyx_t_15);
          if (unlikely(__Pyx_ListComp_Append(__pyx_t_13, (PyObject*)__pyx_t_15))) __PYX_ERR(0, 161, __pyx_L4_error)
          __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
        }
      } /* exit inner scope */
      if (PyDict_SetItem(__pyx_t_12, __pyx_n_u_status, __pyx_t_13) < 0) __PYX_ERR(0, 160, __pyx_L4_error)
      __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+162:                         'descriptor': elm_info[i].elm_desc_str.strip(),
      __pyx_t_15 = __Pyx_PyUnicode_FromString((__pyx_v_elm_info[__pyx_v_i]).elm_desc_str); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 162, __pyx_L4_error)
      __Pyx_GOTREF(__pyx_t_15);
      __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_t_15, __pyx_n_s_strip); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 162, __pyx_L4_error)
      __Pyx_GOTREF(__pyx_t_16);
      __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
      __pyx_t_15 = NULL;
      if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_16))) {
        __pyx_t_15 = PyMethod_GET_SELF(__pyx_t_16);
        if (likely(__pyx_t_15)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_16);
          __Pyx_INCREF(__pyx_t_15);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_16, function);
        }
      }
      __pyx_t_13 = (__pyx_t_15) ? __Pyx_PyObject_CallOneArg(__pyx_t_16, __pyx_t_15) : __Pyx_PyObject_CallNoArg(__pyx_t_16);
      __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0;
      if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 162, __pyx_L4_error)
      __Pyx_GOTREF(__pyx_t_13);
      __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
      if (PyDict_SetItem(__pyx_t_12, __pyx_n_u_descriptor, __pyx_t_13) < 0) __PYX_ERR(0, 160, __pyx_L4_error)
      __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+163:                         'dev': elm_info[i].elm_devnames.strip(),
      __pyx_t_16 = __Pyx_PyUnicode_FromString((__pyx_v_elm_info[__pyx_v_i]).elm_devnames); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 163, __pyx_L4_error)
      __Pyx_GOTREF(__pyx_t_16);
      __pyx_t_15 = __Pyx_PyObject_GetAttrStr(__pyx_t_16, __pyx_n_s_strip); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 163, __pyx_L4_error)
      __Pyx_GOTREF(__pyx_t_15);
      __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
      __pyx_t_16 = NULL;
      if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_15))) {
        __pyx_t_16 = PyMethod_GET_SELF(__pyx_t_15);
        if (likely(__pyx_t_16)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_15);
          __Pyx_INCREF(__pyx_t_16);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_15, function);
        }
      }
      __pyx_t_13 = (__pyx_t_16) ? __Pyx_PyObject_CallOneArg(__pyx_t_15, __pyx_t_16) : __Pyx_PyObject_CallNoArg(__pyx_t_15);
      __Pyx_XDECREF(__pyx_t_16); __pyx_t_16 = 0;
      if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 163, __pyx_L4_error)
      __Pyx_GOTREF(__pyx_t_13);
      __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
      if (PyDict_SetItem(__pyx_t_12, __pyx_n_u_dev, __pyx_t_13) < 0) __PYX_ERR(0, 160, __pyx_L4_error)
      __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
      if (PyDict_SetItem(__pyx_t_10, __pyx_t_11, __pyx_t_12) < 0) __PYX_ERR(0, 159, __pyx_L4_error)
      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
      __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
      __pyx_t_12 = NULL;
      if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_9))) {
        __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_9);
        if (likely(__pyx_t_12)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_9);
          __Pyx_INCREF(__pyx_t_12);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_9, function);
        }
      }
      __pyx_t_2 = (__pyx_t_12) ? __Pyx_PyObject_Call2Args(__pyx_t_9, __pyx_t_12, __pyx_t_10) : __Pyx_PyObject_CallOneArg(__pyx_t_9, __pyx_t_10);
      __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
      __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
      if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 158, __pyx_L4_error)
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    }
 164:                     }
 165:                 })
+166:             return enc_info
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(__pyx_v_enc_info);
    __pyx_r = __pyx_v_enc_info;
    goto __pyx_L3_return;
  }
 167:         finally:
+168:             with nogil:
  /*finally:*/ {
    __pyx_L4_error:;
    /*exception exit:*/{
      __Pyx_PyThreadState_declare
      __Pyx_PyThreadState_assign
      __pyx_t_18 = 0; __pyx_t_19 = 0; __pyx_t_20 = 0; __pyx_t_21 = 0; __pyx_t_22 = 0; __pyx_t_23 = 0;
      __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
      __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
      __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
      __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
      __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0;
      __Pyx_XDECREF(__pyx_t_16); __pyx_t_16 = 0;
      __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
      __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
      if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_21, &__pyx_t_22, &__pyx_t_23);
      if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_18, &__pyx_t_19, &__pyx_t_20) < 0)) __Pyx_ErrFetch(&__pyx_t_18, &__pyx_t_19, &__pyx_t_20);
      __Pyx_XGOTREF(__pyx_t_18);
      __Pyx_XGOTREF(__pyx_t_19);
      __Pyx_XGOTREF(__pyx_t_20);
      __Pyx_XGOTREF(__pyx_t_21);
      __Pyx_XGOTREF(__pyx_t_22);
      __Pyx_XGOTREF(__pyx_t_23);
      __pyx_t_3 = __pyx_lineno; __pyx_t_4 = __pyx_clineno; __pyx_t_17 = __pyx_filename;
      {
        {
            #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_L76;
              }
              __pyx_L76:;
            }
        }
      }
      if (PY_MAJOR_VERSION >= 3) {
        __Pyx_XGIVEREF(__pyx_t_21);
        __Pyx_XGIVEREF(__pyx_t_22);
        __Pyx_XGIVEREF(__pyx_t_23);
        __Pyx_ExceptionReset(__pyx_t_21, __pyx_t_22, __pyx_t_23);
      }
      __Pyx_XGIVEREF(__pyx_t_18);
      __Pyx_XGIVEREF(__pyx_t_19);
      __Pyx_XGIVEREF(__pyx_t_20);
      __Pyx_ErrRestore(__pyx_t_18, __pyx_t_19, __pyx_t_20);
      __pyx_t_18 = 0; __pyx_t_19 = 0; __pyx_t_20 = 0; __pyx_t_21 = 0; __pyx_t_22 = 0; __pyx_t_23 = 0;
      __pyx_lineno = __pyx_t_3; __pyx_clineno = __pyx_t_4; __pyx_filename = __pyx_t_17;
      goto __pyx_L1_error;
    }
    __pyx_L3_return: {
      __pyx_t_23 = __pyx_r;
      __pyx_r = 0;
      {
          #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_L79;
            }
            __pyx_L79:;
          }
      }
      __pyx_r = __pyx_t_23;
      __pyx_t_23 = 0;
      goto __pyx_L0;
    }
  }
+169:                 self.clean_up(num_elms, elm_info, objp)
              ((struct __pyx_vtabstruct_3bsd_9enclosure_Enclosure *)__pyx_v_self->__pyx_vtab)->clean_up(__pyx_v_self, __pyx_v_num_elms, __pyx_v_elm_info, __pyx_v_objp);
            }
/* … */
            ((struct __pyx_vtabstruct_3bsd_9enclosure_Enclosure *)__pyx_v_self->__pyx_vtab)->clean_up(__pyx_v_self, __pyx_v_num_elms, __pyx_v_elm_info, __pyx_v_objp);
          }
 170: 
+171:     cdef void clean_up(self, int num_elms, ses.elm_info_t *elm_info, ses.encioc_element_t *objp) nogil:
static void __pyx_f_3bsd_9enclosure_9Enclosure_clean_up(CYTHON_UNUSED struct __pyx_obj_3bsd_9enclosure_Enclosure *__pyx_v_self, int __pyx_v_num_elms, struct __pyx_t_3bsd_3ses_elm_info_t *__pyx_v_elm_info, encioc_element_t *__pyx_v_objp) {
  int __pyx_v_i;
/* … */
  /* function exit code */
}
 172:         cdef int i;
+173:         if objp != NULL:
  __pyx_t_1 = ((__pyx_v_objp != NULL) != 0);
  if (__pyx_t_1) {
/* … */
  }
+174:             free(objp)
    free(__pyx_v_objp);
 175: 
+176:         if elm_info != NULL:
  __pyx_t_1 = ((__pyx_v_elm_info != NULL) != 0);
  if (__pyx_t_1) {
/* … */
  }
+177:             for i in range(num_elms):
    __pyx_t_2 = __pyx_v_num_elms;
    __pyx_t_3 = __pyx_t_2;
    for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
      __pyx_v_i = __pyx_t_4;
+178:                 free(elm_info[i].elm_desc_str)
      free((__pyx_v_elm_info[__pyx_v_i]).elm_desc_str);
+179:                 free(elm_info[i].elm_devnames)
      free((__pyx_v_elm_info[__pyx_v_i]).elm_devnames);
    }
+180:             free(elm_info)
    free(__pyx_v_elm_info);
 181: 
+182:     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;
}
 183:         cdef ses.encioc_elm_status_t obj
+184:         cdef int res = -1
  __pyx_v_res = -1;
 185: 
+186:         obj.elm_idx = element
  __pyx_v_obj.elm_idx = __pyx_v_element;
+187:         obj.cstat = action
  memcpy(&(__pyx_v_obj.cstat[0]), __pyx_v_action, sizeof(__pyx_v_obj.cstat[0]) * (4 - 0));
+188:         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:;
      }
  }
+189:             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)));
+190:             if res < 0:
        __pyx_t_1 = ((__pyx_v_res < 0) != 0);
        if (__pyx_t_1) {
/* … */
        }
      }
+191:                 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__14, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 191, __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, 191, __pyx_L8_error)
              }
              /*finally:*/ {
                __pyx_L8_error: {
                  #ifdef WITH_THREAD
                  __Pyx_PyGILState_Release(__pyx_gilstate_save);
                  #endif
                  goto __pyx_L4_error;
                }
              }
          }
/* … */
  __pyx_tuple__14 = PyTuple_Pack(1, __pyx_kp_u_ioctl_failed_to_set_element_stat); if (unlikely(!__pyx_tuple__14)) __PYX_ERR(0, 191, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__14);
  __Pyx_GIVEREF(__pyx_tuple__14);
 192: 
+193:         return res
  __pyx_r = __pyx_v_res;
  goto __pyx_L0;
 194: 
+195:     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;
}
+196:         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));
+197:         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, 197, __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, 197, __pyx_L1_error)
  __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 197, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;
 198: 
+199:     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;
}
+200:         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));
+201:         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, 201, __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, 201, __pyx_L1_error)
  __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 201, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;
 202: 
+203:     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;
}
+204:         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));
+205:         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, 205, __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, 205, __pyx_L1_error)
  __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 205, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;
 206: 
+207:     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;
}
+208:       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, 208, __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, 208, __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;