ptserver: Avoid inet_ntoa
[openafs.git] / src / ptserver / ptprocs.c
index a7cff67..cf31d76 100644 (file)
@@ -63,6 +63,7 @@
 #include <rx/rx.h>
 #include <rx/rxkad.h>
 #include <afs/auth.h>
+#include <afs/cellconfig.h>
 
 #include "ptserver.h"
 #include "pterror.h"
@@ -72,9 +73,9 @@
 extern int restricted;
 extern struct ubik_dbase *dbase;
 extern int pr_noAuth;
-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,
                           afs_int32 oid, afs_int32 *cid);
@@ -174,6 +175,58 @@ WhoIsThis(struct rx_call *acall, struct ubik_trans *at, afs_int32 *aid)
     return code;
 }
 
+static int
+WritePreamble(struct ubik_trans **tt)
+{
+    int code;
+
+    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
 SPR_INewEntry(struct rx_call *call, char aname[], afs_int32 aid, afs_int32 oid)
 {
@@ -199,18 +252,10 @@ iNewEntry(struct rx_call *call, char aname[], afs_int32 aid, afs_int32 oid,
     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)
@@ -268,18 +313,10 @@ newEntry(struct rx_call *call, char aname[], afs_int32 flag, afs_int32 oid,
     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
@@ -329,18 +366,9 @@ whereIsIt(struct rx_call *call, afs_int32 aid, afs_int32 *apos, afs_int32 *cid)
     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)
@@ -377,18 +405,9 @@ dumpEntry(struct rx_call *call, afs_int32 apos, struct prdebugentry *aentry,
     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)
@@ -438,22 +457,14 @@ addToGroup(struct rx_call *call, afs_int32 aid, afs_int32 gid, afs_int32 *cid)
     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)
@@ -533,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';
@@ -564,10 +567,16 @@ 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;
@@ -622,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;
@@ -631,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]);
@@ -688,23 +688,13 @@ Delete(struct rx_call *call, afs_int32 aid, afs_int32 *cid)
     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)
@@ -937,26 +927,16 @@ UpdateEntry(struct rx_call *call, afs_int32 aid, char *name,
     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)
@@ -1029,18 +1009,9 @@ removeFromGroup(struct rx_call *call, afs_int32 aid, afs_int32 gid,
     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)
@@ -1112,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)
@@ -1185,23 +1148,16 @@ getCPS2(struct rx_call *call, afs_int32 aid, afs_uint32 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);
@@ -1217,7 +1173,7 @@ getCPS2(struct rx_call *call, afs_int32 aid, afs_uint32 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) {
@@ -1264,25 +1220,18 @@ getHostCPS(struct rx_call *call, afs_uint32 ahost, prlist *alist,
     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) {
@@ -1323,18 +1272,9 @@ listMax(struct rx_call *call, afs_int32 *uid, afs_int32 *gid)
     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)
@@ -1365,18 +1305,9 @@ setMax(struct rx_call *call, afs_int32 aid, afs_int32 gflag, afs_int32 *cid)
     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)
@@ -1417,18 +1348,9 @@ listEntry(struct rx_call *call, afs_int32 aid, struct prcheckentry *aentry,
     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)
@@ -1490,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.
@@ -1565,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);
        }
@@ -1625,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)
@@ -1691,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)
@@ -1786,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)
@@ -1851,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);
@@ -1882,7 +1764,6 @@ listSuperGroups(struct rx_call *call, afs_int32 aid, prlist *alist,
 
     code = ubik_EndTrans(tt);
 
-  done:
     return code;
 }
 
@@ -1926,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)
@@ -2001,18 +1873,9 @@ isAMemberOf(struct rx_call *call, afs_int32 uid, afs_int32 gid, afs_int32 *flag,
     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);
@@ -2058,11 +1921,12 @@ addWildCards(struct ubik_trans *tt, prlist *alist, afs_uint32 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) {
@@ -2099,7 +1963,7 @@ static afs_int32
 WhoIsThisWithName(struct rx_call *acall, struct ubik_trans *at, afs_int32 *aid,
                  char *aname)
 {
-    int foreign = 0;
+    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 */
     struct rx_connection *tconn;
@@ -2122,10 +1986,11 @@ WhoIsThisWithName(struct rx_call *acall, struct ubik_trans *at, afs_int32 *aid,
                                        name, inst, tcell, NULL)))
            goto done;
 
-       if (tcell[0])
-           foreign = afs_is_foreign_ticket_name(name, inst, tcell,
-                                                pr_realmName);
-
+       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))
@@ -2133,7 +1998,7 @@ WhoIsThisWithName(struct rx_call *acall, struct ubik_trans *at, afs_int32 *aid,
            strcat(vname, ".");
            strcat(vname, inst);
        }
-       if (foreign) {
+       if (!islocal) {
             if (strlen(vname) + strlen(tcell) + 1  >= sizeof(vname))
                goto done;
             strcat(vname, "@");