| 1 | """ | 
|---|
| 2 | General PyAFS utilities, such as error handling | 
|---|
| 3 | """ | 
|---|
| 4 |  | 
|---|
| 5 | import sys | 
|---|
| 6 |  | 
|---|
| 7 | # otherwise certain headers are unhappy | 
|---|
| 8 | cdef extern from "netinet/in.h": pass | 
|---|
| 9 | cdef extern 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 |     # This might work with the rest of OpenAFS, but I'm not convinced | 
|---|
| 23 |     # the rest of it is consistent | 
|---|
| 24 |     if code == -1: | 
|---|
| 25 |         raise OSError(errno, strerror(errno)) | 
|---|
| 26 |     pyafs_error(code) | 
|---|
| 27 |     return code | 
|---|
| 28 |  | 
|---|
| 29 | cdef extern int pioctl_write(char *dir, afs_int32 op, char *buffer, afs_int32 follow) except -1: | 
|---|
| 30 |     cdef ViceIoctl blob | 
|---|
| 31 |     cdef afs_int32 code | 
|---|
| 32 |     blob.cin = buffer | 
|---|
| 33 |     blob.in_size = 1 + strlen(buffer) | 
|---|
| 34 |     blob.out_size = 0 | 
|---|
| 35 |     code = pioctl(dir, op, &blob, follow) | 
|---|
| 36 |     # This might work with the rest of OpenAFS, but I'm not convinced | 
|---|
| 37 |     # the rest of it is consistent | 
|---|
| 38 |     if code == -1: | 
|---|
| 39 |         raise OSError(errno, strerror(errno)) | 
|---|
| 40 |     pyafs_error(code) | 
|---|
| 41 |     return code | 
|---|
| 42 |  | 
|---|
| 43 | # Error handling | 
|---|
| 44 |  | 
|---|
| 45 | class AFSException(Exception): | 
|---|
| 46 |     def __init__(self, errno): | 
|---|
| 47 |         self.errno = errno | 
|---|
| 48 |         self.strerror = afs_error_message(errno) | 
|---|
| 49 |  | 
|---|
| 50 |     def __repr__(self): | 
|---|
| 51 |         return "AFSException(%s)" % (self.errno) | 
|---|
| 52 |  | 
|---|
| 53 |     def __str__(self): | 
|---|
| 54 |         return "[%s] %s" % (self.errno, self.strerror) | 
|---|
| 55 |  | 
|---|
| 56 | def pyafs_error(code): | 
|---|
| 57 |     if not _init: | 
|---|
| 58 |         initialize_ACFG_error_table() | 
|---|
| 59 |         initialize_KTC_error_table() | 
|---|
| 60 |         initialize_PT_error_table() | 
|---|
| 61 |         initialize_RXK_error_table() | 
|---|
| 62 |         initialize_U_error_table() | 
|---|
| 63 |  | 
|---|
| 64 |         _init = 1 | 
|---|
| 65 |  | 
|---|
| 66 |     if code != 0: | 
|---|
| 67 |         raise AFSException(code) | 
|---|