ptserver: Avoid inet_ntoa
[openafs.git] / src / ptserver / ptprocs.c
index e67da23..cf31d76 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Copyright 2000, International Business Machines Corporation and others.
  * All Rights Reserved.
- * 
+ *
  * This software has been released under the terms of the IBM Public
  * License.  For details, see the LICENSE file in the top-level source
  * directory or online at http://www.openafs.org/dl/license10.html
  *                             to groups. This is an error in normal AFS.
  *                          2. If adding a group to a group call AddToSGEntry
  *                             to add the id of the group it's a member of.
- *                      
+ *
  *                      (4) function Delete
  *
  *                          1. Print a messsage if an error is returned from
- *                             FindByID() and PTDEBUG is defined. 
- *                          2. If removing a group from a group call   
- *                             RemoveFromSGEntry to remove the id of the  
- *                             group it's a member of.            
+ *                             FindByID() and PTDEBUG is defined.
+ *                          2. If removing a group from a group call
+ *                             RemoveFromSGEntry to remove the id of the
+ *                             group it's a member of.
  *                          3. Remove supergroup continuation records.
  *
- *                      (5) function RemoveFromGroup 
- *               
+ *                      (5) function RemoveFromGroup
+ *
  *                          1. Eliminate the code that tests for adding groups
- *                             to groups. This is an error in normal AFS. 
- *                          2. If removing a group from a group call 
- *                             RemoveFromSGEntry to remove the id of the 
+ *                             to groups. This is an error in normal AFS.
+ *                          2. If removing a group from a group call
+ *                             RemoveFromSGEntry to remove the id of the
  *                             group it's a member of.
  *
- *                      (6) Add new functions PR_ListSuperGroups and 
+ *                      (6) Add new functions PR_ListSuperGroups and
  *                          listSuperGroups.
- *                      
+ *
  *                      (7) function isAMemberOf
- *                      
+ *
  *                          1. Allow groups to be members of groups.
  *
  *                      Transarc does not currently use opcodes past 520, but
 
 #include <afsconfig.h>
 #include <afs/param.h>
+#include <afs/stds.h>
 
+#include <roken.h>
+#include <afs/opr.h>
 
-#include <afs/stds.h>
 #include <ctype.h>
-#include <stdio.h>
+
 #include <lock.h>
 #include <afs/afsutil.h>
 #include <ubik.h>
 #include <rx/rx.h>
 #include <rx/rxkad.h>
 #include <afs/auth.h>
-#ifdef AFS_NT40_ENV
-#include <winsock2.h>
-#else
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#endif
-#include <string.h>
+#include <afs/cellconfig.h>
+
 #include "ptserver.h"
 #include "pterror.h"
 #include "ptprototypes.h"
 #include "afs/audit.h"
 
-#ifdef AFS_ATHENA_STDENV
-#include <krb.h>
-#endif
-
-
-#define        IP_WILDCARDS    1       /* XXX Should be defined outside of here XXX */
-
 extern int restricted;
 extern struct ubik_dbase *dbase;
 extern int pr_noAuth;
-extern afs_int32 initd;
-extern char *pr_realmName;
 extern int prp_group_default;
 extern int prp_user_default;
+extern struct afsconf_dir *prdir;
 
-static afs_int32 iNewEntry(struct rx_call *call, char aname[], afs_int32 aid, 
+static afs_int32 iNewEntry(struct rx_call *call, char aname[], afs_int32 aid,
                           afs_int32 oid, afs_int32 *cid);
-static afs_int32 newEntry(struct rx_call *call, char aname[], afs_int32 flag, 
-                         afs_int32 oid, afs_int32 *aid, afs_int32 *cid);       
+static afs_int32 newEntry(struct rx_call *call, char aname[], afs_int32 flag,
+                         afs_int32 oid, afs_int32 *aid, afs_int32 *cid);
 static afs_int32 whereIsIt(struct rx_call *call, afs_int32 aid, afs_int32 *apos,
                           afs_int32 *cid);
-static afs_int32 dumpEntry(struct rx_call *call, afs_int32 apos, 
+static afs_int32 dumpEntry(struct rx_call *call, afs_int32 apos,
                           struct prdebugentry *aentry, afs_int32 *cid);
-static afs_int32 addToGroup(struct rx_call *call, afs_int32 aid, afs_int32 gid, 
+static afs_int32 addToGroup(struct rx_call *call, afs_int32 aid, afs_int32 gid,
                            afs_int32 *cid);
 static afs_int32 nameToID(struct rx_call *call, namelist *aname, idlist *aid);
 static afs_int32 idToName(struct rx_call *call, idlist *aid, namelist *aname);
 static afs_int32 Delete(struct rx_call *call, afs_int32 aid, afs_int32 *cid);
-static afs_int32 UpdateEntry(struct rx_call *call, afs_int32 aid, char *name, 
+static afs_int32 UpdateEntry(struct rx_call *call, afs_int32 aid, char *name,
                             struct PrUpdateEntry *uentry, afs_int32 *cid);
-static afs_int32 removeFromGroup(struct rx_call *call, afs_int32 aid, 
+static afs_int32 removeFromGroup(struct rx_call *call, afs_int32 aid,
                                 afs_int32 gid, afs_int32 *cid);
-static afs_int32 getCPS(struct rx_call *call, afs_int32 aid, prlist *alist, 
+static afs_int32 getCPS(struct rx_call *call, afs_int32 aid, prlist *alist,
                        afs_int32 *over, afs_int32 *cid);
-static afs_int32 getCPS2(struct rx_call *call, afs_int32 aid, afs_int32 ahost,
+static afs_int32 getCPS2(struct rx_call *call, afs_int32 aid, afs_uint32 ahost,
                         prlist *alist, afs_int32 *over, afs_int32 *cid);
-static afs_int32 getHostCPS(struct rx_call *call, afs_int32 ahost, 
+static afs_int32 getHostCPS(struct rx_call *call, afs_uint32 ahost,
                            prlist *alist, afs_int32 *over);
 static afs_int32 listMax(struct rx_call *call, afs_int32 *uid, afs_int32 *gid);
-static afs_int32 setMax(struct rx_call *call, afs_int32 aid, afs_int32 gflag, 
+static afs_int32 setMax(struct rx_call *call, afs_int32 aid, afs_int32 gflag,
                        afs_int32 *cid);
-static afs_int32 listEntry(struct rx_call *call, afs_int32 aid, 
+static afs_int32 listEntry(struct rx_call *call, afs_int32 aid,
                           struct prcheckentry *aentry, afs_int32 *cid);
-static afs_int32 listEntries(struct rx_call *call, afs_int32 flag, 
-                            afs_int32 startindex, prentries *bulkentries, 
+static afs_int32 listEntries(struct rx_call *call, afs_int32 flag,
+                            afs_int32 startindex, prentries *bulkentries,
                             afs_int32 *nextstartindex, afs_int32 *cid);
 static afs_int32 put_prentries(struct prentry *tentry, prentries *bulkentries);
-static afs_int32 changeEntry(struct rx_call *call, afs_int32 aid, char *name, 
+static afs_int32 changeEntry(struct rx_call *call, afs_int32 aid, char *name,
                             afs_int32 oid, afs_int32 newid, afs_int32 *cid);
-static afs_int32 setFieldsEntry(struct rx_call *call, afs_int32 id, 
-                               afs_int32 mask, afs_int32 flags, 
-                               afs_int32 ngroups, afs_int32 nusers, 
-                               afs_int32 spare1, afs_int32 spare2, 
+static afs_int32 setFieldsEntry(struct rx_call *call, afs_int32 id,
+                               afs_int32 mask, afs_int32 flags,
+                               afs_int32 ngroups, afs_int32 nusers,
+                               afs_int32 spare1, afs_int32 spare2,
                                afs_int32 *cid);
 static afs_int32 listElements(struct rx_call *call, afs_int32 aid,
                              prlist *alist, afs_int32 *over, afs_int32 *cid);
 #if defined(SUPERGROUPS)
-static afs_int32 listSuperGroups(struct rx_call *call, afs_int32 aid, 
-                                prlist *alist, afs_int32 *over, 
+static afs_int32 listSuperGroups(struct rx_call *call, afs_int32 aid,
+                                prlist *alist, afs_int32 *over,
                                 afs_int32 *cid);
 #endif
 static afs_int32 listOwned(struct rx_call *call, afs_int32 aid, prlist *alist,
                           afs_int32 *lastP, afs_int32 *cid);
 static afs_int32 isAMemberOf(struct rx_call *call, afs_int32 uid, afs_int32 gid,
                             afs_int32 *flag, afs_int32 *cid);
-#if IP_WILDCARDS
-static afs_int32 addWildCards(struct ubik_trans *tt, prlist *alist, 
-                             afs_int32 host);
-#endif
-static afs_int32 WhoIsThisWithName(struct rx_call *acall, 
-                                  struct ubik_trans *at, afs_int32 *aid, 
+static afs_int32 addWildCards(struct ubik_trans *tt, prlist *alist,
+                             afs_uint32 host);
+static afs_int32 WhoIsThisWithName(struct rx_call *acall,
+                                  struct ubik_trans *at, afs_int32 *aid,
                                   char *aname);
 
-/* When abort, reset initd so that the header is read in on next call.
+/* when we abort, the ubik cachedVersion will be reset, so we'll read in the
+ * header on the next call.
  * Abort the transaction and return the code.
  */
-#define ABORT_WITH(tt,code) return(initd=0,ubik_AbortTrans(tt),code)
+#define ABORT_WITH(tt,code) return(ubik_AbortTrans(tt),code)
 
 static int
-CreateOK(struct ubik_trans *ut, afs_int32 cid, afs_int32 oid, afs_int32 flag, 
+CreateOK(struct ubik_trans *ut, afs_int32 cid, afs_int32 oid, afs_int32 flag,
         int admin)
 {
-    if (restricted && !admin) 
+    if (restricted && !admin)
        return 0;
 
     if (flag & PRFOREIGN) {
-       /* Foreign users are recognized by the '@' sign and 
+       /* Foreign users are recognized by the '@' sign and
         * not by the PRFOREIGN flag.
         */
        return 0;
@@ -181,61 +169,62 @@ CreateOK(struct ubik_trans *ut, afs_int32 cid, afs_int32 oid, afs_int32 flag,
 afs_int32
 WhoIsThis(struct rx_call *acall, struct ubik_trans *at, afs_int32 *aid)
 {
-    int foreign = 0;
-    /* aid is set to the identity of the caller, if known, else ANONYMOUSID */
-    /* returns -1 and sets aid to ANONYMOUSID on any failure */
-    register struct rx_connection *tconn;
-    register afs_int32 code;
-    char tcell[MAXKTCREALMLEN];
-    char name[MAXKTCNAMELEN];
-    char inst[MAXKTCNAMELEN];
-    int ilen;
-    char vname[256];
+    int code = WhoIsThisWithName(acall, at, aid, NULL);
+    if (code == 2 && *aid == ANONYMOUSID)
+       return PRNOENT;
+    return code;
+}
 
-    *aid = ANONYMOUSID;
-    tconn = rx_ConnectionOf(acall);
-    code = rx_SecurityClassOf(tconn);
-    if (code == 0)
-       return 0;
-    else if (code == 1) {      /* vab class */
-       goto done;              /* no longer supported */
-    } else if (code == 2) {    /* kad class */
-       if ((code = rxkad_GetServerInfo(acall->conn, NULL, 0 /*was &exp */ ,
-                                       name, inst, tcell, NULL)))
-           goto done;
-#if 0
-       /* This test is unnecessary, since rxkad_GetServerInfo already check.
-        * In addition, this is wrong since exp must be unsigned. */
-       if (exp < FT_ApproxTime())
-           goto done;
-#endif
-       if (tcell[0])
-           foreign = afs_is_foreign_ticket_name(name,inst,tcell,pr_realmName);
+static int
+WritePreamble(struct ubik_trans **tt)
+{
+    int code;
 
-       strncpy(vname, name, sizeof(vname));
-       if ((ilen = strlen(inst))) {
-           if (strlen(vname) + 1 + ilen >= sizeof(vname))
-               goto done;
-           strcat(vname, ".");
-           strcat(vname, inst);
-       }
-       if (foreign) {
-           if (strlen(vname) + strlen(tcell) + 1 >= sizeof(vname))
-               goto done;
-           strcat(vname, "@");
-           strcat(vname, tcell);
-       }
-       if (strcmp(AUTH_SUPERUSER, vname) == 0)
-           *aid = SYSADMINID;  /* special case for the fileserver */
-       else {
-           lcstring(vname, vname, sizeof(vname));
-           code = NameToID(at, vname, aid);
-       }
-    }
-  done:
-    if (code && !pr_noAuth)
-       return -1;
-    return 0;
+    code = Initdb();
+    if (code)
+       return code;
+
+    code = ubik_BeginTrans(dbase, UBIK_WRITETRANS, tt);
+    if (code)
+       return code;
+
+    code = ubik_SetLock(*tt, 1, 1, LOCKWRITE);
+    if (code)
+       goto out;
+
+    code = read_DbHeader(*tt);
+
+out:
+    if (code)
+       ubik_AbortTrans(*tt);
+
+    return code;
+}
+
+static int
+ReadPreamble(struct ubik_trans **tt)
+{
+    int code;
+
+    code = Initdb();
+    if (code)
+       return code;
+
+    code = ubik_BeginTransReadAny(dbase, UBIK_READTRANS, tt);
+    if (code)
+       return code;
+
+    code = ubik_SetLock(*tt, 1, 1, LOCKREAD);
+    if (code)
+       goto out;
+
+    code = read_DbHeader(*tt);
+
+out:
+    if (code)
+       ubik_AbortTrans(*tt);
+
+    return code;
 }
 
 afs_int32
@@ -252,29 +241,21 @@ SPR_INewEntry(struct rx_call *call, char aname[], afs_int32 aid, afs_int32 oid)
 }
 
 static afs_int32
-iNewEntry(struct rx_call *call, char aname[], afs_int32 aid, afs_int32 oid, 
+iNewEntry(struct rx_call *call, char aname[], afs_int32 aid, afs_int32 oid,
          afs_int32 *cid)
 {
     /* used primarily for conversion - not intended to be used as usual means
      * of entering people into the database. */
     struct ubik_trans *tt;
-    register afs_int32 code;
+    afs_int32 code;
     afs_int32 gflag = 0;
     int admin;
 
     stolower(aname);
-    code = Initdb();
-    if (code != PRSUCCESS)
-       return code;
-    code = ubik_BeginTrans(dbase, UBIK_WRITETRANS, &tt);
+
+    code = WritePreamble(&tt);
     if (code)
        return code;
-    code = ubik_SetLock(tt, 1, 1, LOCKWRITE);
-    if (code)
-       ABORT_WITH(tt, code);
-    code = read_DbHeader(tt);
-    if (code)
-       ABORT_WITH(tt, code);
 
     code = WhoIsThis(call, tt, cid);
     if (code)
@@ -310,7 +291,7 @@ iNewEntry(struct rx_call *call, char aname[], afs_int32 aid, afs_int32 oid,
 
 
 afs_int32
-SPR_NewEntry(struct rx_call *call, char aname[], afs_int32 flag, afs_int32 oid, 
+SPR_NewEntry(struct rx_call *call, char aname[], afs_int32 flag, afs_int32 oid,
             afs_int32 *aid)
 {
     afs_int32 code;
@@ -324,29 +305,21 @@ SPR_NewEntry(struct rx_call *call, char aname[], afs_int32 flag, afs_int32 oid,
 }
 
 static afs_int32
-newEntry(struct rx_call *call, char aname[], afs_int32 flag, afs_int32 oid, 
+newEntry(struct rx_call *call, char aname[], afs_int32 flag, afs_int32 oid,
         afs_int32 *aid, afs_int32 *cid)
 {
-    register afs_int32 code;
+    afs_int32 code;
     struct ubik_trans *tt;
     int admin;
     char cname[PR_MAXNAMELEN];
     stolower(aname);
-    code = Initdb();
-    if (code)
-       return code;
-    code = ubik_BeginTrans(dbase, UBIK_WRITETRANS, &tt);
+
+    code = WritePreamble(&tt);
     if (code)
        return code;
-    code = ubik_SetLock(tt, 1, 1, LOCKWRITE);
-    if (code)
-       ABORT_WITH(tt, code);
-    code = read_DbHeader(tt);
-    if (code)
-       ABORT_WITH(tt, code);
 
     /* this is for cross-cell self registration. It is not added in the
-     * SPR_INewEntry because we want self-registration to only do 
+     * SPR_INewEntry because we want self-registration to only do
      * automatic id assignment.
      */
     code = WhoIsThisWithName(call, tt, cid, cname);
@@ -389,22 +362,13 @@ SPR_WhereIsIt(struct rx_call *call, afs_int32 aid, afs_int32 *apos)
 static afs_int32
 whereIsIt(struct rx_call *call, afs_int32 aid, afs_int32 *apos, afs_int32 *cid)
 {
-    register afs_int32 code;
+    afs_int32 code;
     struct ubik_trans *tt;
     afs_int32 temp;
 
-    code = Initdb();
-    if (code != PRSUCCESS)
-       return code;
-    code = ubik_BeginTransReadAny(dbase, UBIK_READTRANS, &tt);
+    code = ReadPreamble(&tt);
     if (code)
        return code;
-    code = ubik_SetLock(tt, 1, 1, LOCKREAD);
-    if (code)
-       ABORT_WITH(tt, code);
-    code = read_DbHeader(tt);
-    if (code)
-       ABORT_WITH(tt, code);
 
     code = WhoIsThis(call, tt, cid);
     if (code)
@@ -422,7 +386,7 @@ whereIsIt(struct rx_call *call, afs_int32 aid, afs_int32 *apos, afs_int32 *cid)
 
 
 afs_int32
-SPR_DumpEntry(struct rx_call *call, afs_int32 apos, 
+SPR_DumpEntry(struct rx_call *call, afs_int32 apos,
              struct prdebugentry *aentry)
 {
     afs_int32 code;
@@ -435,24 +399,15 @@ SPR_DumpEntry(struct rx_call *call, afs_int32 apos,
 }
 
 static afs_int32
-dumpEntry(struct rx_call *call, afs_int32 apos, struct prdebugentry *aentry, 
+dumpEntry(struct rx_call *call, afs_int32 apos, struct prdebugentry *aentry,
          afs_int32 *cid)
 {
-    register afs_int32 code;
+    afs_int32 code;
     struct ubik_trans *tt;
 
-    code = Initdb();
-    if (code != PRSUCCESS)
-       return code;
-    code = ubik_BeginTransReadAny(dbase, UBIK_READTRANS, &tt);
+    code = ReadPreamble(&tt);
     if (code)
        return code;
-    code = ubik_SetLock(tt, 1, 1, LOCKREAD);
-    if (code)
-       ABORT_WITH(tt, code);
-    code = read_DbHeader(tt);
-    if (code)
-       ABORT_WITH(tt, code);
 
     code = WhoIsThis(call, tt, cid);
     if (code)
@@ -495,29 +450,21 @@ SPR_AddToGroup(struct rx_call *call, afs_int32 aid, afs_int32 gid)
 static afs_int32
 addToGroup(struct rx_call *call, afs_int32 aid, afs_int32 gid, afs_int32 *cid)
 {
-    register afs_int32 code;
+    afs_int32 code;
     struct ubik_trans *tt;
     afs_int32 tempu;
     afs_int32 tempg;
     struct prentry tentry;
     struct prentry uentry;
 
-    code = Initdb();
-    if (code != PRSUCCESS)
-       return code;
     if (gid == ANYUSERID || gid == AUTHUSERID)
        return PRPERM;
     if (aid == ANONYMOUSID)
        return PRPERM;
-    code = ubik_BeginTrans(dbase, UBIK_WRITETRANS, &tt);
+
+    code = WritePreamble(&tt);
     if (code)
        return code;
-    code = ubik_SetLock(tt, 1, 1, LOCKWRITE);
-    if (code)
-       ABORT_WITH(tt, code);
-    code = read_DbHeader(tt);
-    if (code)
-       ABORT_WITH(tt, code);
 
     code = WhoIsThis(call, tt, cid);
     if (code)
@@ -581,7 +528,7 @@ SPR_NameToID(struct rx_call *call, namelist *aname, idlist *aid)
 static afs_int32
 nameToID(struct rx_call *call, namelist *aname, idlist *aid)
 {
-    register afs_int32 code;
+    afs_int32 code;
     struct ubik_trans *tt;
     afs_int32 i;
     int size;
@@ -597,26 +544,18 @@ nameToID(struct rx_call *call, namelist *aname, idlist *aid)
     if (size < 0)
        return PRTOOMANY;
 
-    aid->idlist_val = (afs_int32 *) malloc(size * sizeof(afs_int32));
+    aid->idlist_val = malloc(size * sizeof(afs_int32));
     if (!aid->idlist_val)
        return PRNOMEM;
 
-    code = Initdb();
-    if (code != PRSUCCESS)
-       return code;
-    code = ubik_BeginTransReadAny(dbase, UBIK_READTRANS, &tt);
+    code = ReadPreamble(&tt);
     if (code)
        return code;
-    code = ubik_SetLock(tt, 1, 1, LOCKREAD);
-    if (code)
-       ABORT_WITH(tt, code);
-    code = read_DbHeader(tt);
-    if (code)
-       ABORT_WITH(tt, code);
 
     for (i = 0; i < aname->namelist_len; i++) {
        char vname[256];
        char *nameinst, *cell;
+       afs_int32 islocal = 1;
 
        strncpy(vname, aname->namelist_val[i], sizeof(vname));
        vname[sizeof(vname)-1] ='\0';
@@ -628,15 +567,21 @@ nameToID(struct rx_call *call, namelist *aname, idlist *aid)
            cell++;
        }
 
-       if (cell && afs_is_foreign_ticket_name(nameinst,NULL,cell,pr_realmName))
-           code = NameToID(tt, aname->namelist_val[i], &aid->idlist_val[i]);
-       else 
+       if (cell && *cell) {
+           code = afsconf_IsLocalRealmMatch(prdir, &islocal, nameinst, NULL, cell);
+           ViceLog(0,
+                   ("PTS_NameToID: afsconf_IsLocalRealmMatch(); code=%d, nameinst=%s, cell=%s\n",
+                    code, nameinst, cell));
+       }
+       if (islocal)
            code = NameToID(tt, nameinst, &aid->idlist_val[i]);
+       else
+           code = NameToID(tt, aname->namelist_val[i], &aid->idlist_val[i]);
 
        if (code != PRSUCCESS)
            aid->idlist_val[i] = ANONYMOUSID;
         osi_audit(PTS_NmToIdEvent, code, AUD_STR,
-                  aname->namelist_val[i], AUD_ID, aid->idlist_val[i], 
+                  aname->namelist_val[i], AUD_ID, aid->idlist_val[i],
                   AUD_END);
        ViceLog(125, ("PTS_NameToID: code %d aname %s aid %d\n", code,
                      aname->namelist_val[i], aid->idlist_val[i]));
@@ -674,7 +619,7 @@ SPR_IDToName(struct rx_call *call, idlist *aid, namelist *aname)
 static afs_int32
 idToName(struct rx_call *call, idlist *aid, namelist *aname)
 {
-    register afs_int32 code;
+    afs_int32 code;
     struct ubik_trans *tt;
     afs_int32 i;
     int size;
@@ -686,7 +631,7 @@ idToName(struct rx_call *call, idlist *aid, namelist *aname)
        return 0;
     if (size < 0)
        return PRTOOMANY;
-    aname->namelist_val = (prname *) malloc(size * PR_MAXNAMELEN);
+    aname->namelist_val = malloc(size * PR_MAXNAMELEN);
     aname->namelist_len = 0;
     if (aname->namelist_val == 0)
        return PRNOMEM;
@@ -695,18 +640,9 @@ idToName(struct rx_call *call, idlist *aid, namelist *aname)
     if (size == 0)
        return PRTOOMANY;       /* rxgen will probably handle this */
 
-    code = Initdb();
-    if (code != PRSUCCESS)
-       return code;
-    code = ubik_BeginTransReadAny(dbase, UBIK_READTRANS, &tt);
+    code = ReadPreamble(&tt);
     if (code)
        return code;
-    code = ubik_SetLock(tt, 1, 1, LOCKREAD);
-    if (code)
-       ABORT_WITH(tt, code);
-    code = read_DbHeader(tt);
-    if (code)
-       ABORT_WITH(tt, code);
 
     for (i = 0; i < aid->idlist_len; i++) {
        code = IDToName(tt, aid->idlist_val[i], aname->namelist_val[i]);
@@ -746,29 +682,19 @@ SPR_Delete(struct rx_call *call, afs_int32 aid)
 static afs_int32
 Delete(struct rx_call *call, afs_int32 aid, afs_int32 *cid)
 {
-    register afs_int32 code;
+    afs_int32 code;
     struct ubik_trans *tt;
     struct prentry tentry;
     afs_int32 loc, nptr;
     int count;
 
-    code = Initdb();
-    if (code)
-       return code;
-    if (code != PRSUCCESS)
-       return code;
     if (aid == SYSADMINID || aid == ANYUSERID || aid == AUTHUSERID
        || aid == ANONYMOUSID)
        return PRPERM;
-    code = ubik_BeginTrans(dbase, UBIK_WRITETRANS, &tt);
+
+    code = WritePreamble(&tt);
     if (code)
        return code;
-    code = ubik_SetLock(tt, 1, 1, LOCKWRITE);
-    if (code)
-       ABORT_WITH(tt, code);
-    code = read_DbHeader(tt);
-    if (code)
-       ABORT_WITH(tt, code);
 
     code = WhoIsThis(call, tt, cid);
     if (code)
@@ -979,7 +905,7 @@ Delete(struct rx_call *call, afs_int32 aid, afs_int32 *cid)
 }
 
 afs_int32
-SPR_UpdateEntry(struct rx_call *call, afs_int32 aid, char *name, 
+SPR_UpdateEntry(struct rx_call *call, afs_int32 aid, char *name,
                struct PrUpdateEntry *uentry)
 {
     afs_int32 code;
@@ -992,35 +918,25 @@ SPR_UpdateEntry(struct rx_call *call, afs_int32 aid, char *name,
 }
 
 afs_int32
-UpdateEntry(struct rx_call *call, afs_int32 aid, char *name, 
+UpdateEntry(struct rx_call *call, afs_int32 aid, char *name,
            struct PrUpdateEntry *uentry, afs_int32 *cid)
 {
-    register afs_int32 code;
+    afs_int32 code;
     struct ubik_trans *tt;
     struct prentry tentry;
     afs_int32 loc;
     int id = 0;
 
-    code = Initdb();
-    if (code)
-       return code;
-    if (code != PRSUCCESS)
-       return code;
     if (aid) {
        id = aid;
        if (aid == SYSADMINID || aid == ANYUSERID || aid == AUTHUSERID
            || aid == ANONYMOUSID)
            return PRPERM;
     }
-    code = ubik_BeginTrans(dbase, UBIK_WRITETRANS, &tt);
+
+    code = WritePreamble(&tt);
     if (code)
        return code;
-    code = ubik_SetLock(tt, 1, 1, LOCKWRITE);
-    if (code)
-       ABORT_WITH(tt, code);
-    code = read_DbHeader(tt);
-    if (code)
-       ABORT_WITH(tt, code);
 
     code = WhoIsThis(call, tt, cid);
     if (code)
@@ -1083,28 +999,19 @@ SPR_RemoveFromGroup(struct rx_call *call, afs_int32 aid, afs_int32 gid)
 }
 
 static afs_int32
-removeFromGroup(struct rx_call *call, afs_int32 aid, afs_int32 gid, 
+removeFromGroup(struct rx_call *call, afs_int32 aid, afs_int32 gid,
                afs_int32 *cid)
 {
-    register afs_int32 code;
+    afs_int32 code;
     struct ubik_trans *tt;
     afs_int32 tempu;
     afs_int32 tempg;
     struct prentry uentry;
     struct prentry gentry;
 
-    code = Initdb();
-    if (code != PRSUCCESS)
-       return code;
-    code = ubik_BeginTrans(dbase, UBIK_WRITETRANS, &tt);
+    code = WritePreamble(&tt);
     if (code)
        return code;
-    code = ubik_SetLock(tt, 1, 1, LOCKWRITE);
-    if (code)
-       ABORT_WITH(tt, code);
-    code = read_DbHeader(tt);
-    if (code)
-       ABORT_WITH(tt, code);
 
     code = WhoIsThis(call, tt, cid);
     if (code)
@@ -1165,10 +1072,10 @@ SPR_GetCPS(struct rx_call *call, afs_int32 aid, prlist *alist, afs_int32 *over)
 }
 
 static afs_int32
-getCPS(struct rx_call *call, afs_int32 aid, prlist *alist, afs_int32 *over, 
+getCPS(struct rx_call *call, afs_int32 aid, prlist *alist, afs_int32 *over,
        afs_int32 *cid)
 {
-    register afs_int32 code;
+    afs_int32 code;
     struct ubik_trans *tt;
     afs_int32 temp;
     struct prentry tentry;
@@ -1176,18 +1083,10 @@ getCPS(struct rx_call *call, afs_int32 aid, prlist *alist, afs_int32 *over,
     *over = 0;
     alist->prlist_len = 0;
     alist->prlist_val = NULL;
-    code = Initdb();
-    if (code != PRSUCCESS)
-       return code;
-    code = ubik_BeginTransReadAny(dbase, UBIK_READTRANS, &tt);
+
+    code = ReadPreamble(&tt);
     if (code)
        return code;
-    code = ubik_SetLock(tt, 1, 1, LOCKREAD);
-    if (code)
-       ABORT_WITH(tt, code);
-    code = read_DbHeader(tt);
-    if (code)
-       ABORT_WITH(tt, code);
 
     temp = FindByID(tt, aid);
     if (!temp)
@@ -1210,7 +1109,6 @@ getCPS(struct rx_call *call, afs_int32 aid, prlist *alist, afs_int32 *over,
 }
 
 
-#ifdef IP_WILDCARDS
 int
 inCPS(prlist CPS, afs_int32 id)
 {
@@ -1222,28 +1120,27 @@ inCPS(prlist CPS, afs_int32 id)
     }
     return (0);
 }
-#endif /* IP_WILDCARDS */
 
 
 afs_int32
-SPR_GetCPS2(struct rx_call *call, afs_int32 aid, afs_int32 ahost, 
+SPR_GetCPS2(struct rx_call *call, afs_int32 aid, afs_int32 ahost,
            prlist *alist, afs_int32 *over)
 {
     afs_int32 code;
     afs_int32 cid = ANONYMOUSID;
 
     code = getCPS2(call, aid, ahost, alist, over, &cid);
-    osi_auditU(call, PTS_GetCPS2Event, code, AUD_ID, aid, AUD_HOST, ahost,
+    osi_auditU(call, PTS_GetCPS2Event, code, AUD_ID, aid, AUD_HOST, htonl(ahost),
               AUD_END);
     ViceLog(125, ("PTS_GetCPS2: code %d cid %d aid %d ahost %d\n", code, cid, aid, ahost));
     return code;
 }
 
 static afs_int32
-getCPS2(struct rx_call *call, afs_int32 aid, afs_int32 ahost, prlist *alist, 
+getCPS2(struct rx_call *call, afs_int32 aid, afs_uint32 ahost, prlist *alist,
        afs_int32 *over, afs_int32 *cid)
 {
-    register afs_int32 code;
+    afs_int32 code;
     struct ubik_trans *tt;
     afs_int32 temp;
     struct prentry tentry;
@@ -1251,23 +1148,16 @@ getCPS2(struct rx_call *call, afs_int32 aid, afs_int32 ahost, prlist *alist,
     afs_int32 hostid;
     int host_list = 0;
     struct in_addr iaddr;
+    char hoststr[16];
 
     *over = 0;
     iaddr.s_addr = ntohl(ahost);
     alist->prlist_len = 0;
     alist->prlist_val = NULL;
-    code = Initdb();
-    if (code != PRSUCCESS)
-       return code;
-    code = ubik_BeginTransReadAny(dbase, UBIK_READTRANS, &tt);
+
+    code = ReadPreamble(&tt);
     if (code)
        return code;
-    code = ubik_SetLock(tt, 1, 1, LOCKREAD);
-    if (code)
-       ABORT_WITH(tt, code);
-    code = read_DbHeader(tt);
-    if (code)
-       ABORT_WITH(tt, code);
 
     if (aid != PRBADID) {
        temp = FindByID(tt, aid);
@@ -1283,7 +1173,7 @@ getCPS2(struct rx_call *call, afs_int32 aid, afs_int32 ahost, prlist *alist,
            || !AccessOK(tt, *cid, &tentry, PRP_MEMBER_MEM, PRP_MEMBER_ANY))
            ABORT_WITH(tt, PRPERM);
     }
-    code = NameToID(tt, inet_ntoa(iaddr), &hostid);
+    code = NameToID(tt, afs_inet_ntoa_r(iaddr.s_addr, hoststr), &hostid);
     if (code == PRSUCCESS && hostid != 0) {
        temp = FindByID(tt, hostid);
        if (temp) {
@@ -1299,10 +1189,8 @@ getCPS2(struct rx_call *call, afs_int32 aid, afs_int32 ahost, prlist *alist,
        code = GetList2(tt, &tentry, &host_tentry, alist, 1);
     else
        code = GetList(tt, &tentry, alist, 1);
-#if IP_WILDCARDS
     if (!code)
        code = addWildCards(tt, alist, ntohl(ahost));
-#endif /* IP_WILDCARDS */
     if (code != PRSUCCESS)
        ABORT_WITH(tt, code);
 
@@ -1312,45 +1200,38 @@ getCPS2(struct rx_call *call, afs_int32 aid, afs_int32 ahost, prlist *alist,
 
 
 afs_int32
-SPR_GetHostCPS(struct rx_call *call, afs_int32 ahost, prlist *alist, 
+SPR_GetHostCPS(struct rx_call *call, afs_int32 ahost, prlist *alist,
               afs_int32 *over)
 {
     afs_int32 code;
 
     code = getHostCPS(call, ahost, alist, over);
-    osi_auditU(call, PTS_GetHCPSEvent, code, AUD_HOST, ahost, AUD_END);
+    osi_auditU(call, PTS_GetHCPSEvent, code, AUD_HOST, htonl(ahost), AUD_END);
     ViceLog(125, ("PTS_GetHostCPS: code %d ahost %d\n", code, ahost));
     return code;
 }
 
 afs_int32
-getHostCPS(struct rx_call *call, afs_int32 ahost, prlist *alist, 
+getHostCPS(struct rx_call *call, afs_uint32 ahost, prlist *alist,
           afs_int32 *over)
 {
-    register afs_int32 code, temp;
+    afs_int32 code, temp;
     struct ubik_trans *tt;
     struct prentry host_tentry;
     afs_int32 hostid;
     struct in_addr iaddr;
+    char hoststr[16];
 
     *over = 0;
     iaddr.s_addr = ntohl(ahost);
     alist->prlist_len = 0;
     alist->prlist_val = NULL;
-    code = Initdb();
-    if (code != PRSUCCESS)
-       return code;
-    code = ubik_BeginTransReadAny(dbase, UBIK_READTRANS, &tt);
+
+    code = ReadPreamble(&tt);
     if (code)
        return code;
-    code = ubik_SetLock(tt, 1, 1, LOCKREAD);
-    if (code)
-       ABORT_WITH(tt, code);
-    code = read_DbHeader(tt);
-    if (code)
-       ABORT_WITH(tt, code);
 
-    code = NameToID(tt, inet_ntoa(iaddr), &hostid);
+    code = NameToID(tt, afs_inet_ntoa_r(iaddr.s_addr, hoststr), &hostid);
     if (code == PRSUCCESS && hostid != 0) {
        temp = FindByID(tt, hostid);
        if (temp) {
@@ -1364,9 +1245,7 @@ getHostCPS(struct rx_call *call, afs_int32 ahost, prlist *alist,
        } else
            fprintf(stderr, "FindByID Failed -- Not found\n");
     }
-#if IP_WILDCARDS
     code = addWildCards(tt, alist, ntohl(ahost));
-#endif /* IP_WILDCARDS */
   bad:
     if (code != PRSUCCESS)
        ABORT_WITH(tt, code);
@@ -1390,21 +1269,12 @@ SPR_ListMax(struct rx_call *call, afs_int32 *uid, afs_int32 *gid)
 afs_int32
 listMax(struct rx_call *call, afs_int32 *uid, afs_int32 *gid)
 {
-    register afs_int32 code;
+    afs_int32 code;
     struct ubik_trans *tt;
 
-    code = Initdb();
-    if (code != PRSUCCESS)
-       return code;
-    code = ubik_BeginTransReadAny(dbase, UBIK_READTRANS, &tt);
+    code = ReadPreamble(&tt);
     if (code)
        return code;
-    code = ubik_SetLock(tt, 1, 1, LOCKREAD);
-    if (code)
-       ABORT_WITH(tt, code);
-    code = read_DbHeader(tt);
-    if (code)
-       ABORT_WITH(tt, code);
 
     code = GetMax(tt, uid, gid);
     if (code != PRSUCCESS)
@@ -1432,21 +1302,12 @@ SPR_SetMax(struct rx_call *call, afs_int32 aid, afs_int32 gflag)
 static afs_int32
 setMax(struct rx_call *call, afs_int32 aid, afs_int32 gflag, afs_int32 *cid)
 {
-    register afs_int32 code;
+    afs_int32 code;
     struct ubik_trans *tt;
 
-    code = Initdb();
-    if (code != PRSUCCESS)
-       return code;
-    code = ubik_BeginTrans(dbase, UBIK_WRITETRANS, &tt);
+    code = WritePreamble(&tt);
     if (code)
        return code;
-    code = ubik_SetLock(tt, 1, 1, LOCKWRITE);
-    if (code)
-       ABORT_WITH(tt, code);
-    code = read_DbHeader(tt);
-    if (code)
-       ABORT_WITH(tt, code);
 
     code = WhoIsThis(call, tt, cid);
     if (code)
@@ -1479,26 +1340,17 @@ SPR_ListEntry(struct rx_call *call, afs_int32 aid, struct prcheckentry *aentry)
 }
 
 static afs_int32
-listEntry(struct rx_call *call, afs_int32 aid, struct prcheckentry *aentry, 
+listEntry(struct rx_call *call, afs_int32 aid, struct prcheckentry *aentry,
          afs_int32 *cid)
 {
-    register afs_int32 code;
+    afs_int32 code;
     struct ubik_trans *tt;
     afs_int32 temp;
     struct prentry tentry;
 
-    code = Initdb();
-    if (code != PRSUCCESS)
-       return code;
-    code = ubik_BeginTransReadAny(dbase, UBIK_READTRANS, &tt);
+    code = ReadPreamble(&tt);
     if (code)
        return code;
-    code = ubik_SetLock(tt, 1, 1, LOCKREAD);
-    if (code)
-       ABORT_WITH(tt, code);
-    code = read_DbHeader(tt);
-    if (code)
-       ABORT_WITH(tt, code);
 
     code = WhoIsThis(call, tt, cid);
     if (code)
@@ -1534,7 +1386,7 @@ listEntry(struct rx_call *call, afs_int32 aid, struct prcheckentry *aentry,
 }
 
 afs_int32
-SPR_ListEntries(struct rx_call *call, afs_int32 flag, afs_int32 startindex, 
+SPR_ListEntries(struct rx_call *call, afs_int32 flag, afs_int32 startindex,
                prentries *bulkentries, afs_int32 *nextstartindex)
 {
     afs_int32 code;
@@ -1547,7 +1399,7 @@ SPR_ListEntries(struct rx_call *call, afs_int32 flag, afs_int32 startindex,
 }
 
 static afs_int32
-listEntries(struct rx_call *call, afs_int32 flag, afs_int32 startindex, 
+listEntries(struct rx_call *call, afs_int32 flag, afs_int32 startindex,
            prentries *bulkentries, afs_int32 *nextstartindex, afs_int32 *cid)
 {
     afs_int32 code;
@@ -1560,18 +1412,9 @@ listEntries(struct rx_call *call, afs_int32 flag, afs_int32 startindex,
     bulkentries->prentries_val = 0;
     bulkentries->prentries_len = 0;
 
-    code = Initdb();
-    if (code != PRSUCCESS)
-       return code;
-    code = ubik_BeginTransReadAny(dbase, UBIK_READTRANS, &tt);
+    code = ReadPreamble(&tt);
     if (code)
        return code;
-    code = ubik_SetLock(tt, 1, 1, LOCKREAD);
-    if (code)
-       ABORT_WITH(tt, code);
-    code = read_DbHeader(tt);
-    if (code)
-       ABORT_WITH(tt, code);
 
     /* Make sure we are an authenticated caller and that we are on the
      * SYSADMIN list.
@@ -1635,9 +1478,8 @@ put_prentries(struct prentry *tentry, prentries *bulkentries)
 
     if (bulkentries->prentries_val == 0) {
        bulkentries->prentries_len = 0;
-       bulkentries->prentries_val =
-           (struct prlistentries *)malloc(PR_MAXENTRIES *
-                                          sizeof(struct prentry));
+       bulkentries->prentries_val = malloc(PR_MAXENTRIES *
+                                           sizeof(struct prentry));
        if (!bulkentries->prentries_val) {
            return (PRNOMEM);
        }
@@ -1670,7 +1512,7 @@ put_prentries(struct prentry *tentry, prentries *bulkentries)
 }
 
 afs_int32
-SPR_ChangeEntry(struct rx_call *call, afs_int32 aid, char *name, afs_int32 oid, 
+SPR_ChangeEntry(struct rx_call *call, afs_int32 aid, char *name, afs_int32 oid,
                afs_int32 newid)
 {
     afs_int32 code;
@@ -1684,10 +1526,10 @@ SPR_ChangeEntry(struct rx_call *call, afs_int32 aid, char *name, afs_int32 oid,
 }
 
 static afs_int32
-changeEntry(struct rx_call *call, afs_int32 aid, char *name, afs_int32 oid, 
+changeEntry(struct rx_call *call, afs_int32 aid, char *name, afs_int32 oid,
            afs_int32 newid, afs_int32 *cid)
 {
-    register afs_int32 code;
+    afs_int32 code;
     struct ubik_trans *tt;
     afs_int32 pos;
 
@@ -1695,23 +1537,13 @@ changeEntry(struct rx_call *call, afs_int32 aid, char *name, afs_int32 oid,
        return PRPERM;
     stolower(name);
 
-    code = Initdb();
-    if (code)
-       return code;
     if (aid == ANYUSERID || aid == AUTHUSERID || aid == ANONYMOUSID
        || aid == SYSADMINID)
        return PRPERM;
-    if (code != PRSUCCESS)
-       return code;
-    code = ubik_BeginTrans(dbase, UBIK_WRITETRANS, &tt);
+
+    code = WritePreamble(&tt);
     if (code)
        return code;
-    code = ubik_SetLock(tt, 1, 1, LOCKWRITE);
-    if (code)
-       ABORT_WITH(tt, code);
-    code = read_DbHeader(tt);
-    if (code)
-       ABORT_WITH(tt, code);
 
     code = WhoIsThis(call, tt, cid);
     if (code)
@@ -1729,10 +1561,10 @@ changeEntry(struct rx_call *call, afs_int32 aid, char *name, afs_int32 oid,
 }
 
 afs_int32
-SPR_SetFieldsEntry(struct rx_call *call, 
-                  afs_int32 id, 
-                  afs_int32 mask, /* specify which fields to update */ 
-                  afs_int32 flags, afs_int32 ngroups, afs_int32 nusers, 
+SPR_SetFieldsEntry(struct rx_call *call,
+                  afs_int32 id,
+                  afs_int32 mask, /* specify which fields to update */
+                  afs_int32 flags, afs_int32 ngroups, afs_int32 nusers,
                   afs_int32 spare1, afs_int32 spare2)
 {
     afs_int32 code;
@@ -1747,13 +1579,13 @@ SPR_SetFieldsEntry(struct rx_call *call,
 }
 
 static afs_int32
-setFieldsEntry(struct rx_call *call, 
-              afs_int32 id, 
-              afs_int32 mask, /* specify which fields to update */ 
-              afs_int32 flags, afs_int32 ngroups, afs_int32 nusers, 
+setFieldsEntry(struct rx_call *call,
+              afs_int32 id,
+              afs_int32 mask, /* specify which fields to update */
+              afs_int32 flags, afs_int32 ngroups, afs_int32 nusers,
               afs_int32 spare1, afs_int32 spare2, afs_int32 *cid)
 {
-    register afs_int32 code;
+    afs_int32 code;
     struct ubik_trans *tt;
     afs_int32 pos;
     struct prentry tentry;
@@ -1761,22 +1593,13 @@ setFieldsEntry(struct rx_call *call,
 
     if (mask == 0)
        return 0;               /* no-op */
-    code = Initdb();
-    if (code)
-       return code;
+
     if (id == ANYUSERID || id == AUTHUSERID || id == ANONYMOUSID)
        return PRPERM;
-    if (code != PRSUCCESS)
-       return code;
-    code = ubik_BeginTrans(dbase, UBIK_WRITETRANS, &tt);
+
+    code = WritePreamble(&tt);
     if (code)
        return code;
-    code = ubik_SetLock(tt, 1, 1, LOCKWRITE);
-    if (code)
-       ABORT_WITH(tt, code);
-    code = read_DbHeader(tt);
-    if (code)
-       ABORT_WITH(tt, code);
 
     code = WhoIsThis(call, tt, cid);
     if (code)
@@ -1831,7 +1654,7 @@ setFieldsEntry(struct rx_call *call,
 }
 
 afs_int32
-SPR_ListElements(struct rx_call *call, afs_int32 aid, prlist *alist, 
+SPR_ListElements(struct rx_call *call, afs_int32 aid, prlist *alist,
                 afs_int32 *over)
 {
     afs_int32 code;
@@ -1844,10 +1667,10 @@ SPR_ListElements(struct rx_call *call, afs_int32 aid, prlist *alist,
 }
 
 static afs_int32
-listElements(struct rx_call *call, afs_int32 aid, prlist *alist, 
+listElements(struct rx_call *call, afs_int32 aid, prlist *alist,
             afs_int32 *over, afs_int32 *cid)
 {
-    register afs_int32 code;
+    afs_int32 code;
     struct ubik_trans *tt;
     afs_int32 temp;
     struct prentry tentry;
@@ -1856,18 +1679,9 @@ listElements(struct rx_call *call, afs_int32 aid, prlist *alist,
     alist->prlist_len = 0;
     alist->prlist_val = NULL;
 
-    code = Initdb();
-    if (code != PRSUCCESS)
-       return code;
-    code = ubik_BeginTransReadAny(dbase, UBIK_READTRANS, &tt);
+    code = ReadPreamble(&tt);
     if (code)
        return code;
-    code = ubik_SetLock(tt, 1, 1, LOCKREAD);
-    if (code)
-       ABORT_WITH(tt, code);
-    code = read_DbHeader(tt);
-    if (code)
-       ABORT_WITH(tt, code);
 
     code = WhoIsThis(call, tt, cid);
     if (code)
@@ -1892,7 +1706,7 @@ listElements(struct rx_call *call, afs_int32 aid, prlist *alist,
 
 
 afs_int32
-SPR_ListSuperGroups(struct rx_call *call, afs_int32 aid, prlist *alist, 
+SPR_ListSuperGroups(struct rx_call *call, afs_int32 aid, prlist *alist,
                    afs_int32 *over)
 {
 #if defined(SUPERGROUPS)
@@ -1910,10 +1724,10 @@ SPR_ListSuperGroups(struct rx_call *call, afs_int32 aid, prlist *alist,
 
 #if defined(SUPERGROUPS)
 static afs_int32
-listSuperGroups(struct rx_call *call, afs_int32 aid, prlist *alist, 
+listSuperGroups(struct rx_call *call, afs_int32 aid, prlist *alist,
                afs_int32 *over, afs_int32 *cid)
 {
-    register afs_int32 code;
+    afs_int32 code;
     struct ubik_trans *tt;
     afs_int32 temp;
     struct prentry tentry;
@@ -1921,12 +1735,10 @@ listSuperGroups(struct rx_call *call, afs_int32 aid, prlist *alist,
     alist->prlist_len = 0;
     alist->prlist_val = (afs_int32 *) 0;
 
-    code = Initdb();
-    if (code != PRSUCCESS)
-       goto done;
-    code = ubik_BeginTransReadAny(dbase, UBIK_READTRANS, &tt);
+    code = ReadPreamble(&tt);
     if (code)
-       goto done;
+       return code;
+
     code = ubik_SetLock(tt, 1, 1, LOCKREAD);
     if (code)
        ABORT_WITH(tt, code);
@@ -1952,13 +1764,12 @@ listSuperGroups(struct rx_call *call, afs_int32 aid, prlist *alist,
 
     code = ubik_EndTrans(tt);
 
-  done:
     return code;
 }
 
 #endif /* SUPERGROUPS */
 
-/* 
+/*
  * SPR_ListOwned
  * List the entries owned by this id.  If the id is zero,
  * return the orphans list. This will return up to PR_MAXGROUPS
@@ -1966,7 +1777,7 @@ listSuperGroups(struct rx_call *call, afs_int32 aid, prlist *alist,
  * maximum value is enforced in GetOwnedChain().
  */
 afs_int32
-SPR_ListOwned(struct rx_call *call, afs_int32 aid, prlist *alist, 
+SPR_ListOwned(struct rx_call *call, afs_int32 aid, prlist *alist,
              afs_int32 *lastP)
 {
     afs_int32 code;
@@ -1979,10 +1790,10 @@ SPR_ListOwned(struct rx_call *call, afs_int32 aid, prlist *alist,
 }
 
 afs_int32
-listOwned(struct rx_call *call, afs_int32 aid, prlist *alist, afs_int32 *lastP, 
+listOwned(struct rx_call *call, afs_int32 aid, prlist *alist, afs_int32 *lastP,
          afs_int32 *cid)
 {
-    register afs_int32 code;
+    afs_int32 code;
     struct ubik_trans *tt;
     struct prentry tentry;
     afs_int32 head = 0;
@@ -1996,18 +1807,9 @@ listOwned(struct rx_call *call, afs_int32 aid, prlist *alist, afs_int32 *lastP,
     start = *lastP;
     *lastP = 0;
 
-    code = Initdb();
-    if (code != PRSUCCESS)
-       return code;
-    code = ubik_BeginTransReadAny(dbase, UBIK_READTRANS, &tt);
+    code = ReadPreamble(&tt);
     if (code)
        return code;
-    code = ubik_SetLock(tt, 1, 1, LOCKREAD);
-    if (code)
-       ABORT_WITH(tt, code);
-    code = read_DbHeader(tt);
-    if (code)
-       ABORT_WITH(tt, code);
 
     code = WhoIsThis(call, tt, cid);
     if (code)
@@ -2051,7 +1853,7 @@ listOwned(struct rx_call *call, afs_int32 aid, prlist *alist, afs_int32 *lastP,
 }
 
 afs_int32
-SPR_IsAMemberOf(struct rx_call *call, afs_int32 uid, afs_int32 gid, 
+SPR_IsAMemberOf(struct rx_call *call, afs_int32 uid, afs_int32 gid,
                afs_int32 *flag)
 {
     afs_int32 code;
@@ -2068,21 +1870,12 @@ static afs_int32
 isAMemberOf(struct rx_call *call, afs_int32 uid, afs_int32 gid, afs_int32 *flag,
            afs_int32 *cid)
 {
-    register afs_int32 code;
+    afs_int32 code;
     struct ubik_trans *tt;
 
-    code = Initdb();
-    if (code != PRSUCCESS)
-       return code;
-    code = ubik_BeginTransReadAny(dbase, UBIK_READTRANS, &tt);
+    code = ReadPreamble(&tt);
     if (code)
        return code;
-    code = ubik_SetLock(tt, 1, 1, LOCKREAD);
-    if (code)
-       ABORT_WITH(tt, code);
-    code = read_DbHeader(tt);
-    if (code)
-       ABORT_WITH(tt, code);
 
     {
        afs_int32 uloc = FindByID(tt, uid);
@@ -2117,9 +1910,8 @@ isAMemberOf(struct rx_call *call, afs_int32 uid, afs_int32 gid, afs_int32 *flag,
     return code;
 }
 
-#if IP_WILDCARDS
 static afs_int32
-addWildCards(struct ubik_trans *tt, prlist *alist, afs_int32 host)
+addWildCards(struct ubik_trans *tt, prlist *alist, afs_uint32 host)
 {
     afs_int32 temp;
     struct prentry tentry;
@@ -2129,11 +1921,12 @@ addWildCards(struct ubik_trans *tt, prlist *alist, afs_int32 host)
     afs_int32 hostid;
     int size = 0, i, code;
     int added = 0;
+    char hoststr[16];
 
     while ((host = (host & wild))) {
        wild = htonl(ntohl(wild) << 8);
        iaddr.s_addr = host;
-       code = NameToID(tt, inet_ntoa(iaddr), &hostid);
+       code = NameToID(tt, afs_inet_ntoa_r(iaddr.s_addr, hoststr), &hostid);
        if (code == PRSUCCESS && hostid != 0) {
            temp = FindByID(tt, hostid);
            if (temp) {
@@ -2165,16 +1958,16 @@ addWildCards(struct ubik_trans *tt, prlist *alist, afs_int32 host)
        qsort(alist->prlist_val, alist->prlist_len, sizeof(afs_int32), IDCmp);
     return 0;
 }
-#endif /* IP_WILDCARDS */
 
 static afs_int32
-WhoIsThisWithName(struct rx_call *acall, struct ubik_trans *at, afs_int32 *aid, 
+WhoIsThisWithName(struct rx_call *acall, struct ubik_trans *at, afs_int32 *aid,
                  char *aname)
 {
+    afs_int32 islocal = 1;
     /* aid is set to the identity of the caller, if known, else ANONYMOUSID */
     /* returns -1 and sets aid to ANONYMOUSID on any failure */
-    register struct rx_connection *tconn;
-    register afs_int32 code;
+    struct rx_connection *tconn;
+    afs_int32 code;
     char tcell[MAXKTCREALMLEN];
     char name[MAXKTCNAMELEN];
     char inst[MAXKTCNAMELEN];
@@ -2189,14 +1982,15 @@ WhoIsThisWithName(struct rx_call *acall, struct ubik_trans *at, afs_int32 *aid,
     else if (code == 1) {      /* vab class */
        goto done;              /* no longer supported */
     } else if (code == 2) {    /* kad class */
-
-       int clen;
-
-       if ((code = rxkad_GetServerInfo(acall->conn, NULL, 0 /*was &exp */ ,
+       if ((code = rxkad_GetServerInfo(rx_ConnectionOf(acall), NULL, NULL,
                                        name, inst, tcell, NULL)))
            goto done;
 
-
+       if (tcell[0]) {
+           code = afsconf_IsLocalRealmMatch(prdir, &islocal, name, inst, tcell);
+           if (code)
+               goto done;
+       }
        strncpy(vname, name, sizeof(vname));
        if ((ilen = strlen(inst))) {
            if (strlen(vname) + 1 + ilen >= sizeof(vname))
@@ -2204,19 +1998,16 @@ WhoIsThisWithName(struct rx_call *acall, struct ubik_trans *at, afs_int32 *aid,
            strcat(vname, ".");
            strcat(vname, inst);
        }
-       if ((clen = strlen(tcell))) {
-           int foreign = afs_is_foreign_ticket_name(name,inst,tcell,pr_realmName);
-
-           if (foreign) {
-               if (strlen(vname) + 1 + clen >= sizeof(vname))
-                   goto done;
-               strcat(vname, "@");
-               strcat(vname, tcell);
-               lcstring(vname, vname, sizeof(vname));
-               code = NameToID(at, vname, aid);
+       if (!islocal) {
+            if (strlen(vname) + strlen(tcell) + 1  >= sizeof(vname))
+               goto done;
+            strcat(vname, "@");
+            strcat(vname, tcell);
+            lcstring(vname, vname, sizeof(vname));
+            code = NameToID(at, vname, aid);
+            if (aname)
                strcpy(aname, vname);
-               return 2;
-           }
+            return 2;
        }
 
        if (strcmp(AUTH_SUPERUSER, vname) == 0)