From de7387fa5a6a9023ce16c679ccb08b6496afc9b7 Mon Sep 17 00:00:00 2001 From: Evan Broder Date: Sun, 21 Dec 2008 13:01:43 -0600 Subject: [PATCH] Get information about the current cell. 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 --- afs/_pts.pyx | 21 +++++++++++++++++++-- afs/afs.pxd | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ setup.py | 2 +- 3 files changed, 68 insertions(+), 3 deletions(-) diff --git a/afs/_pts.pyx b/afs/_pts.pyx index 43a0f03..822caf5 100644 --- a/afs/_pts.pyx +++ b/afs/_pts.pyx @@ -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() diff --git a/afs/afs.pxd b/afs/afs.pxd index 4570f2a..5d50e09 100644 --- a/afs/afs.pxd +++ b/afs/afs.pxd @@ -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) diff --git a/setup.py b/setup.py index 61b5d42..b685eac 100755 --- 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", -- 1.7.9.5