diff options
Diffstat (limited to 'libgamma_native_error.posix.pyx')
-rw-r--r-- | libgamma_native_error.posix.pyx | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/libgamma_native_error.posix.pyx b/libgamma_native_error.posix.pyx new file mode 100644 index 0000000..0370eb4 --- /dev/null +++ b/libgamma_native_error.posix.pyx @@ -0,0 +1,188 @@ +# -*- 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') |