From 69a1ec83bb7da62d2bf1debcb1496913dde5c062 Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Mon, 1 Sep 2014 22:03:58 +0200 Subject: interface to native libgamma-error code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- .gitignore | 1 + src/libgamma_error.py | 63 ++++++++----- src/libgamma_native_error.pyx | 200 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 241 insertions(+), 23 deletions(-) create mode 100644 src/libgamma_native_error.pyx diff --git a/.gitignore b/.gitignore index 5b34508..1c52b5a 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,5 @@ __pycache__/ *.su *.gch *.py[co] +src/*_native_*.c diff --git a/src/libgamma_error.py b/src/libgamma_error.py index c64153d..0e742da 100644 --- a/src/libgamma_error.py +++ b/src/libgamma_error.py @@ -22,26 +22,28 @@ along with this library. If not, see . class LibgammaGroupGid: ''' Data descriptor for accessing the - `libgamma_group_gid` variable + `libgamma_group_gid` variable. ''' def __init__(self): ''' - Constructor + Constructor. ''' pass - def __get__(self, obj, obj_type = None): + def __get__(self, obj, obj_type = None) -> int: ''' - Getter + Getter. ''' - pass # TODO read libgamma_group_gid + from libgamma_native_error import libgamma_native_get_group_gid + return libgamma_native_get_group_gid() - def __set__(self, obj, value): + def __set__(self, obj, value : int): ''' - Setter + Setter. ''' - pass # TODO write libgamma_group_gid + from libgamma_native_error import libgamma_native_set_group_gid + return libgamma_native_set_group_gid(value) group_gid = LibgammaGroupGid() ''' @@ -53,26 +55,28 @@ Group that the user needs to be a member of if class LibgammaGroupName: ''' Data descriptor for accessing the - `libgamma_group_name` variable + `libgamma_group_name` variable. ''' def __init__(self): ''' - Constructor + Constructor. ''' pass - def __get__(self, obj, obj_type = None): + def __get__(self, obj, obj_type = None) -> str: ''' - Getter + Getter. ''' - pass # TODO read libgamma_group_name + from libgamma_native_error import libgamma_native_get_group_name + return libgamma_native_get_group_name() - def __set__(self, obj, value): + def __set__(self, obj, value : str): ''' - Setter + Setter. ''' - pass # TODO write libgamma_group_name + from libgamma_native_error import libgamma_native_set_group_name + return libgamma_native_set_group_name() group_name = LibgammaGroupName() ''' @@ -83,7 +87,7 @@ cannot be determined. ''' -def perror(name : str, error_code : int): ## TODO call libgamma_perror +def perror(name : str, error_code : int): ''' Prints an error to stderr in a `perror` fashion, however this function will not translate the `libgamma` @@ -101,10 +105,21 @@ def perror(name : str, error_code : int): ## TODO call libgamma_perror @param name The text to add at the beginning. @param value The error code, may be an `errno` value. ''' - pass + from libgamma_native_error import libgamma_native_perror + libgamma_native_perror(name, error_code) -def name_of_error(value : int) -> str: ## TODO call libgamma_name_of_error +def get_errno() -> int: + ''' + Get the current value, for the current thread, of `errno`. + + @return The value `errno`. + ''' + from libgamma_native_error import libgamma_native_get_errno + return libgamma_native_get_errno() + + +def name_of_error(value : int) -> str: ''' Returns the name of the definition associated with a `libgamma` error code. @@ -113,18 +128,20 @@ def name_of_error(value : int) -> str: ## TODO call libgamma_name_of_error `None` if the error code does not exist. The return string should not be `free`:d. ''' - pass + from libgamma_native_error import libgamma_native_name_of_error + return libgamma_native_name_of_error(value) -def value_of_error(name : str) -> int: ## TODO call libgamma_value_of_error +def 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 does is `None` + @return The error code, zero if the name is `None` or does not refer to a `libgamma` error. ''' - pass + from libgamma_native_error import libgamma_native_value_of_error + return libgamma_native_value_of_error(name) diff --git a/src/libgamma_native_error.pyx b/src/libgamma_native_error.pyx new file mode 100644 index 0000000..f1b423c --- /dev/null +++ b/src/libgamma_native_error.pyx @@ -0,0 +1,200 @@ +# -*- python -*- +''' +pylibgamma — Python 3 wrapper for libgamma +Copyright © 2014 Mattias Andrée (maandree@member.fsf.org) + +This library is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this library. If not, see . +''' + +cimport cython + +from posix.unistd cimport gid_t + + +cdef extern int errno +''' +`errno` of course. +''' + + +cdef extern gid_t libgamma_group_gid +''' +Group that the user needs to be a member of if +`LIBGAMMA_DEVICE_REQUIRE_GROUP` is returned. +''' + +cdef extern const char* libgamma_group_name +''' +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) +''' +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) +''' +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) +''' +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_errno() -> int: + ''' + Get the current value, for the current thread, of `errno`. + + @return The value `errno`. + ''' + return int(errno) + + +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) + +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 = 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 bytes bs + if libgamma_group_name == NULL: + return None + bs = libgamma_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 bytes bs + if name is None: + libgamma_group_name = NULL + return + bs = name.encode('utf-8') + bytes([0]) + libgamma_group_name = bs + + +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. The return string + should not be `free`:d. + ''' + cdef const char* name + cdef bytes bs + name = libgamma_name_of_error(value) + if name == 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)) + -- cgit v1.2.3-70-g09d2