aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--.gitignore1
-rw-r--r--src/libgamma_error.py63
-rw-r--r--src/libgamma_native_error.pyx200
3 files changed, 241 insertions, 23 deletions
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 <http://www.gnu.org/licenses/>.
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 <http://www.gnu.org/licenses/>.
+'''
+
+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 = <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 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 = <char*>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, <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. The return string
+ should not be `free`:d.
+ '''
+ cdef const char* name
+ cdef bytes bs
+ name = libgamma_name_of_error(<int>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))
+