ACL implementation. Current features:
[invirt/packages/python-afs.git] / afs / afs.pyx
1 """
2 General PyAFS utilities, such as error handling
3 """
4
5 import sys
6
7 # otherwise certain headers are unhappy
8 cdef import from "netinet/in.h": pass
9 cdef import from "afs/vice.h": pass
10
11 cdef int _init = 0
12
13 # pioctl convenience wrappers
14
15 cdef extern int pioctl_read(char *dir, afs_int32 op, void *buffer, unsigned short size, afs_int32 follow) except -1:
16     cdef ViceIoctl blob
17     cdef afs_int32 code
18     blob.in_size  = 0
19     blob.out_size = size
20     blob.out = buffer
21     code = pioctl(dir, op, &blob, follow)
22     pyafs_error(code)
23     return code
24
25 # Error handling
26
27 class AFSException(Exception):
28     def __init__(self, errno):
29         self.errno = errno
30         self.strerror = afs_error_message(errno)
31
32     def __repr__(self):
33         return "AFSException(%s)" % (self.errno)
34
35     def __str__(self):
36         return "[%s] %s" % (self.errno, self.strerror)
37
38 def pyafs_error(code):
39     if not _init:
40         initialize_ACFG_error_table()
41         initialize_KTC_error_table()
42         initialize_PT_error_table()
43         initialize_RXK_error_table()
44         initialize_U_error_table()
45
46         _init = 1
47
48     if code != 0:
49         raise AFSException(code)