Get information about the current cell.
authorEvan Broder <broder@mit.edu>
Sun, 21 Dec 2008 19:01:43 +0000 (13:01 -0600)
committerEvan Broder <broder@mit.edu>
Sun, 21 Dec 2008 19:02:21 +0000 (13:02 -0600)
This will almost certainly want to get pulled out into some utility
functions eventually.

Also, we now have 3 different error mechanisms: arbitrary return
codes, errno/strerror, and com_err. Yay!

Signed-off-by: Evan Broder <broder@mit.edu>

afs/_pts.pyx
afs/afs.pxd
setup.py

index 43a0f03..822caf5 100644 (file)
@@ -3,14 +3,31 @@ cimport afs as a
 cdef class PTS:
     cdef a.ubik_client * client
     
-    def __cinit__(self):
+    def __cinit__(self, cell=None, sec=1):
         cdef a.afs_int32 code
+        cdef a.afsconf_dir *cdir
+        cdef a.afsconf_cell info
+        cdef char * c_cell
+        
+        if cell is None:
+            c_cell = NULL
+        else:
+            c_cell = cell
         
         self.client = NULL
         
         code = a.rx_Init(0)
         if code != 0:
-            raise Exception(str(code))
+            raise Exception(code, "Error initializing Rx")
+        
+        cdir = a.afsconf_Open(a.AFSDIR_CLIENT_ETC_DIRPATH)
+        if cdir is NULL:
+            raise OSError(a.errno,
+                          "Error opening configuration directory (%s): %s" % \
+                              (a.AFSDIR_CLIENT_ETC_DIRPATH, a.strerror(a.errno)))
+        code = a.afsconf_GetCellInfo(cdir, c_cell, "afsprot", &info)
+        if code != 0:
+            raise Exception(code, "GetCellInfo: %s" % a.error_message(code))
     
     def __dealloc__(self):
         a.rx_Finalize()
index 4570f2a..5d50e09 100644 (file)
@@ -1,6 +1,51 @@
+cdef extern from "errno.h":
+    int errno
+
+cdef extern from "string.h":
+    char * strerror(int errnum)
+
+cdef extern from "netinet/in.h":
+    struct in_addr:
+        int s_addr
+    struct sockaddr_in:
+        short sin_family
+        unsigned short sin_port
+        in_addr sin_addr
+        char sin_zero[8]
+
 cdef extern from "afs/stds.h":
     ctypedef long afs_int32
 
+cdef extern from "afs/dirpath.h":
+    char * AFSDIR_CLIENT_ETC_DIRPATH
+
+cdef extern from "afs/cellconfig.h":
+    enum:
+        MAXCELLCHARS
+        MAXHOSTSPERCELL
+        MAXHOSTCHARS
+    
+    # We just pass afsconf_dir structs around to other AFS functions,
+    # so this can be treated as opaque
+    struct afsconf_dir:
+        pass
+    
+    # For afsconf_cell, on the other hand, we care about everything
+    struct afsconf_cell:
+        char name[MAXCELLCHARS]
+        short numServers
+        short flags
+        sockaddr_in hostAddr[MAXHOSTSPERCELL]
+        char hostName[MAXHOSTSPERCELL][MAXHOSTCHARS]
+        char *linkedCell
+        int timeout
+     
+    afsconf_dir *afsconf_Open(char *adir)
+    int afsconf_GetCellInfo(afsconf_dir *adir,
+                            char *acellName,
+                            char *aservice,
+                            afsconf_cell *acellInfo)
+
 cdef extern from "ubik.h":
     enum:
         MAXSERVERS
@@ -12,3 +57,6 @@ cdef extern from "ubik.h":
 cdef extern from "rx/rx.h":
     int rx_Init(int port)
     void rx_Finalize()
+
+cdef extern from "afs/com_err.h":
+    char * error_message(int)
index 61b5d42..b685eac 100755 (executable)
--- a/setup.py
+++ b/setup.py
@@ -18,7 +18,7 @@ include_dirs = [os.path.join(os.path.dirname(__file__), 'afs'),
 library_dirs = ['%s/lib' % root,
                 '%s/lib/afs' % root]
 libraries = ['bos', 'volser', 'vldb', 'afsrpc', 'afsauthent', 'cmd',
-             'usd', 'audit']
+             'usd', 'audit', 'resolv', 'com_err']
 
 setup(
     name="PyAFS",