aboutsummaryrefslogblamecommitdiffstats
path: root/libgamma_native_error.posix.pyx
blob: 0370eb465f67307c0ef86314fa3210ef9bba6a49 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
                
                                                     


                               
                                               

 

                                                    

                                              
                                           

   

                                                            



                                                    
                    


   
                                                                        













                                                         

                                                      

   
                                                               
   
                                                                          
 
                              




                                                                          
                                                               
   
                                                                    
 
                                                                        
                                                              
                                                      


   

                                           
          

                                                  
                                               
       
                                        
 
 

                                             
          

                                                  
                                               
       
                                    



                                            
          



                                                        
                        
       
                               
                 

                                          
                   
                   

                                       
 

                                               
          



                                                        
                        
       
                               

                    
                                             

                                          

                                       
















                                                             

                                                          







                                                      
                                                                              
    
                                  
                                                                              
                                                           
       
                         

                                             
                    






                                                      
                                                                        
    
                                                                            
                                                              
                                                          





                                           
 


                                 
                                         
    

                                                
       
                         



                                       
# -*- python -*-
# See LICENSE file for copyright and license details.
cimport cython

from posix.unistd cimport gid_t
from libc.string cimport strerror as c_strerror


cdef extern gid_t libgamma_group_gid_get() nogil
cdef extern void libgamma_group_gid_set(gid_t) nogil
'''
Group that the user needs to be a member of if
`LIBGAMMA_DEVICE_REQUIRE_GROUP` is returned
'''

cdef extern const char *libgamma_group_name_get() nogil
cdef extern void libgamma_group_name_set(const char *) nogil
'''
Group that the user needs to be a member of if
`LIBGAMMA_DEVICE_REQUIRE_GROUP` is returned,
`NULL` if the name of the group `libgamma_group_gid`
cannot be determined
'''


cdef extern void libgamma_perror(const char *name, int error_code) nogil
'''
Prints an error to stderr in a `perror` fashion,
however this function will not translate the `libgamma`
errors into human-readable strings, it will simply
print the name of the error. If the value `error_code`
is the value of `LIBGAMMA_ERRNO_SET`, `perror` will be
used to print the current error stored in `errno`.
If `error_code` is non-negative (an `errno` value`), that
value will be stored in `errno` and `perror` will be
used to print it. Additionally, if the `error_code` is
the value of `LIBGAMMA_DEVICE_REQUIRE_GROUP` the
required group will be printed with its numerical value
and, if known, its name.

@param  name   The text to add at the beginning
@param  value  The error code, may be an `errno` value
'''

cdef extern const char *libgamma_name_of_error(int value) nogil
'''
Returns the name of the definition associated with a `libgamma` error code

@param   value  The error code
@return         The name of the definition associated with the error code,
                `NULL` if the error code does not exist. The return string
                should not be `free`:d.
'''

cdef extern int libgamma_value_of_error(const char *name) nogil
'''
Return the value of a `libgamma` error definition refered to by name

@param   name  The name of the definition associated with the error code
@return        The error code, zero if the name does is `NULL`
               or does not refer to a `libgamma` error
'''


def libgamma_native_get_group_gid() -> int:
    '''
    Getter
    
    Group that the user needs to be a member of if
    `LIBGAMMA_DEVICE_REQUIRE_GROUP` is returned
    '''
    return int(libgamma_group_gid_get())


def libgamma_native_set_group_gid(gid : int):
    '''
    Setter
    
    Group that the user needs to be a member of if
    `LIBGAMMA_DEVICE_REQUIRE_GROUP` is returned
    '''
    libgamma_group_gid_set(<int>gid)


def libgamma_native_get_group_name() -> str:
    '''
    Getter
    
    Group that the user needs to be a member of if
    `LIBGAMMA_DEVICE_REQUIRE_GROUP` is returned,
    `None` if the name of the group `libgamma_group_gid`
    cannot be determined
    '''
    cdef const char *group_name
    cdef bytes bs
    group_name = libgamma_group_name_get()
    if group_name is NULL:
        return None
    bs = group_name
    return bs.decode('utf-8', 'strict')


def libgamma_native_set_group_name(name : str):
    '''
    Setter
    
    Group that the user needs to be a member of if
    `LIBGAMMA_DEVICE_REQUIRE_GROUP` is returned,
    `None` if the name of the group `libgamma_group_gid`
    cannot be determined
    '''
    cdef const char *group_name
    cdef bytes bs
    if name is None:
        libgamma_group_name_set(<char *>NULL)
        return
    bs = name.encode('utf-8') + bytes([0])
    group_name = bs
    libgamma_group_name_set(group_name)


def libgamma_native_perror(name : str, error_code : int):
    '''
    Prints an error to stderr in a `perror` fashion,
    however this function will not translate the `libgamma`
    errors into human-readable strings, it will simply
    print the name of the error. If the value `error_code`
    is the value of `LIBGAMMA_ERRNO_SET`, `perror` will be
    used to print the current error stored in `errno`.
    If `error_code` is non-negative (an `errno` value`), that
    value will be stored in `errno` and `perror` will be
    used to print it. Additionally, if the `error_code` is
    the value of `LIBGAMMA_DEVICE_REQUIRE_GROUP` the
    required group will be printed with its numerical value
    and, if known, its name.
    
    @param  name   The text to add at the beginning
    @param  value  The error code, may be an `errno` value
    '''
    cdef bytes bs
    bs = name.encode('utf-8') + bytes([0])
    libgamma_perror(bs, <int>error_code)


def libgamma_native_name_of_error(value : int) -> str:
    '''
    Returns the name of the definition associated with a `libgamma` error code
    
    @param   value  The error code
    @return         The name of the definition associated with the error code,
                    `None` if the error code does not exist
    '''
    cdef const char *name
    cdef bytes bs
    name = libgamma_name_of_error(<int>value)
    if name is NULL:
        return None
    bs = name
    return bs.decode('utf-8', 'strict')


def libgamma_native_value_of_error(name : str) -> int:
    '''
    Return the value of a `libgamma` error definition refered to by name
    
    @param   name  The name of the definition associated with the error code
    @return        The error code, zero if the name is `None`,
                   or does not refer to a `libgamma` error
    '''
    cdef bytes bs
    if name is None:
        return 0
    bs = name.encode('utf-8') + bytes([0])
    return int(libgamma_value_of_error(bs))


def strerror(error : int) -> str:
    '''
    Get a textual description of an error
    
    @param   error  The number of the error
    @return         The description of the error
    '''
    cdef const char *text
    cdef bytes bs
    text = c_strerror(<int>error)
    bs = text
    return bs.decode('utf-8', 'strict')