Merge branch 'acl'
[invirt/packages/python-afs.git] / afs / afs.pyx
index a54a1c9..29a2442 100644 (file)
@@ -4,21 +4,42 @@ General PyAFS utilities, such as error handling
 
 import sys
 
+# otherwise certain headers are unhappy
+cdef import from "netinet/in.h": pass
+cdef import from "afs/vice.h": pass
+
 cdef int _init = 0
 
+# pioctl convenience wrappers
+
+cdef extern int pioctl_read(char *dir, afs_int32 op, void *buffer, unsigned short size, afs_int32 follow) except -1:
+    cdef ViceIoctl blob
+    cdef afs_int32 code
+    blob.in_size  = 0
+    blob.out_size = size
+    blob.out = buffer
+    code = pioctl(dir, op, &blob, follow)
+    # This might work with the rest of OpenAFS, but I'm not convinced
+    # the rest of it is consistent
+    if code == -1:
+        raise OSError(errno, strerror(errno))
+    pyafs_error(code)
+    return code
+
+# Error handling
+
 class AFSException(Exception):
-    def __init__(self, errno, message):
+    def __init__(self, errno):
         self.errno = errno
         self.strerror = afs_error_message(errno)
-        self.message = message
 
     def __repr__(self):
-        return "AFSException(%s, %s)" % (self.errno, self.message)
+        return "AFSException(%s)" % (self.errno)
 
     def __str__(self):
-        return "[%s] (%s) while %s" % (self.errno, self.strerror, self.message)
+        return "[%s] %s" % (self.errno, self.strerror)
 
-def pyafs_error(code, msg):
+def pyafs_error(code):
     if not _init:
         initialize_ACFG_error_table()
         initialize_KTC_error_table()
@@ -29,4 +50,4 @@ def pyafs_error(code, msg):
         _init = 1
 
     if code != 0:
-        raise AFSException(code, msg)
+        raise AFSException(code)