static char afsdb_handler_running; /* Protected by GLOCK */
static char afsdb_handler_shutdown; /* Protected by GLOCK */
+/* from cellconfig.h */
+#define MAXCELLCHARS 64
static struct {
- afs_rwlock_t lock;
+ /* lock moved to afsdb_req_lock for cmdebug */
char pending;
char complete;
char *cellname;
- afs_int32 *cellhosts;
- int *timeout;
- char **realname;
} afsdb_req;
void
int
afs_AFSDBHandler(char *acellName, int acellNameLen, afs_int32 * kernelMsg)
{
+ afs_int32 timeout, code;
+ afs_int32 cellHosts[MAXCELLHOSTS];
+
if (afsdb_handler_shutdown)
return -2;
afsdb_handler_running = 1;
UpgradeSToWLock(&afsdb_req_lock, 684);
hostCount = kernelMsg[0];
- *afsdb_req.timeout = kernelMsg[1];
- if (*afsdb_req.timeout)
- *afsdb_req.timeout += osi_Time();
- *afsdb_req.realname = afs_strdup(acellName);
+ timeout = kernelMsg[1];
+ if (timeout)
+ timeout += osi_Time();
for (i = 0; i < MAXCELLHOSTS; i++) {
if (i >= hostCount)
- afsdb_req.cellhosts[i] = 0;
+ cellHosts[i] = 0;
else
- afsdb_req.cellhosts[i] = kernelMsg[2 + i];
+ cellHosts[i] = kernelMsg[2 + i];
}
+ if (hostCount)
+ code = afs_NewCell(acellName, cellHosts, CNoSUID, NULL, 0, 0,
+ timeout);
+
+ if (!hostCount || (code && code != EEXIST))
+ /* null out the cellname if the lookup failed */
+ afsdb_req.cellname = NULL;
+ else
+ /* If we found an alias, create it */
+ if (afs_strcasecmp(afsdb_req.cellname, acellName))
+ afs_NewCellAlias(afsdb_req.cellname, acellName);
+
/* Request completed, wake up the relevant thread */
afsdb_req.pending = 0;
afsdb_req.complete = 1;
}
static int
-afs_GetCellHostsAFSDB(char *acellName, afs_int32 * acellHosts, int *timeout,
- char **realName)
+afs_GetCellHostsAFSDB(char *acellName)
{
AFS_ASSERT_GLOCK();
if (!afsdb_handler_running)
ObtainWriteLock(&afsdb_client_lock, 685);
ObtainWriteLock(&afsdb_req_lock, 686);
- *acellHosts = 0;
- afsdb_req.cellname = afs_strdup(acellName);
- afsdb_req.cellhosts = acellHosts;
- afsdb_req.timeout = timeout;
- afsdb_req.realname = realName;
+ afsdb_req.cellname = acellName;
afsdb_req.complete = 0;
afsdb_req.pending = 1;
ReleaseReadLock(&afsdb_req_lock);
ReleaseWriteLock(&afsdb_client_lock);
- if (*acellHosts)
+ if (afsdb_req.cellname)
return 0;
else
return ENOENT;
afs_LookupAFSDB(char *acellName)
{
#ifdef AFS_AFSDB_ENV
- afs_int32 *cellHosts;
- char **realName=NULL;
int code;
- int *timeout=NULL;
-
- if(!(cellHosts = afs_osi_Alloc(MAXCELLHOSTS * sizeof(afs_int32))))
- goto done;
-
- if(!(realName = afs_osi_Alloc(sizeof(char *))))
- goto done;
- *realName = NULL;
-
- if(!(timeout = afs_osi_Alloc(sizeof(int))))
- goto done;
-
- code = afs_GetCellHostsAFSDB(acellName, cellHosts, timeout, realName);
- if (code)
- goto done;
- code = afs_NewCell(*realName, cellHosts, CNoSUID, NULL, 0, 0, *timeout);
- if (code && code != EEXIST)
- goto done;
-
- /* If we found an alias, create it */
- if (afs_strcasecmp(acellName, *realName))
- afs_NewCellAlias(acellName, *realName);
-
- done:
- afs_Trace2(afs_iclSetp, CM_TRACE_AFSDB, ICL_TYPE_STRING, acellName,
- ICL_TYPE_INT32, code);
- if(timeout)
- afs_osi_Free(timeout, sizeof(int));
- if (realName && *realName)
- afs_osi_FreeStr(*realName);
- if(realName)
- afs_osi_Free(realName, sizeof(char *));
- if(cellHosts)
- afs_osi_Free(cellHosts, MAXCELLHOSTS * sizeof(afs_int32));
+ char *cellName = afs_strdup(acellName);
+
+ code = afs_GetCellHostsAFSDB(cellName);
+ afs_Trace2(afs_iclSetp, CM_TRACE_AFSDB, ICL_TYPE_STRING, cellName,
+ ICL_TYPE_INT32, code);
+ afs_osi_FreeStr(cellName);
#endif
}