#include <malloc.h>
#include <osi.h>
#include <string.h>
+#define STRSAFE_NO_DEPRECATE
+#include <strsafe.h>
#include "afsd.h"
{
long code = 0;
cm_cell_rock_t rock;
+ afs_uint32 mxheld = 0;
if (cp == NULL)
return NULL;
lock_ObtainMutex(&cp->mx);
+ mxheld = 1;
if ((cp->vlServersp == NULL
#ifdef AFS_FREELANCE_CLIENT
&& !(cp->flags & CM_CELLFLAG_FREELANCE)
#endif
) || (time(0) > cp->timeout)
-#ifdef AFS_AFSDB_ENV
|| (cm_dnsEnabled && (cp->flags & CM_CELLFLAG_DNS) &&
((cp->flags & CM_CELLFLAG_VLSERVER_INVALID)))
-#endif
)
{
lock_ReleaseMutex(&cp->mx);
+ mxheld = 0;
/* must empty cp->vlServersp */
- if (cp->vlServersp) {
+ if (cp->vlServersp)
cm_FreeServerList(&cp->vlServersp, CM_FREESERVERLIST_DELETE);
- cp->vlServersp = NULL;
- }
rock.cellp = cp;
rock.flags = flags;
code = cm_SearchCellFileEx(cp->name, NULL, cp->linkedName, cm_AddCellProc, &rock);
if (code == 0) {
lock_ObtainMutex(&cp->mx);
+ mxheld = 1;
cp->timeout = time(0) + 7200;
- lock_ReleaseMutex(&cp->mx);
}
-#ifdef AFS_AFSDB_ENV
else {
if (cm_dnsEnabled) {
int ttl;
code = cm_SearchCellByDNS(cp->name, NULL, &ttl, cm_AddCellProc, &rock);
if (code == 0) { /* got cell from DNS */
lock_ObtainMutex(&cp->mx);
+ mxheld = 1;
cp->flags |= CM_CELLFLAG_DNS;
cp->flags &= ~CM_CELLFLAG_VLSERVER_INVALID;
cp->timeout = time(0) + ttl;
- lock_ReleaseMutex(&cp->mx);
#ifdef DEBUG
fprintf(stderr, "cell %s: ttl=%d\n", cp->name, ttl);
#endif
* current entry alone
*/
lock_ObtainMutex(&cp->mx);
+ mxheld = 1;
cp->flags |= CM_CELLFLAG_VLSERVER_INVALID;
- lock_ReleaseMutex(&cp->mx);
}
}
}
-#endif /* AFS_AFSDB_ENV */
- } else {
- lock_ReleaseMutex(&cp->mx);
}
if (code == 0)
cm_RandomizeServer(&cp->vlServersp);
+ if (mxheld)
+ lock_ReleaseMutex(&cp->mx);
+
return code ? NULL : cp;
}
osi_LogSaveString(afsd_logp,namep), code, osi_LogSaveString(afsd_logp,fullname),
osi_LogSaveString(afsd_logp,linkedName));
-#ifdef AFS_AFSDB_ENV
if (cm_dnsEnabled) {
int ttl;
}
}
else
-#endif
{
lock_ObtainMutex(&cp->mx);
lock_ObtainWrite(&cm_cellLock);