# -*- 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(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(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, 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(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(error) bs = text return bs.decode('utf-8', 'strict')