void cm_InitIoctl(void)
{
- lock_InitializeMutex(&cm_Afsdsbmt_Lock, "AFSDSBMT.INI Access Lock");
+ lock_InitializeMutex(&cm_Afsdsbmt_Lock, "AFSDSBMT.INI Access Lock",
+ LOCK_HIERARCHY_AFSDBSBMT_GLOBAL);
}
/*
clientchar_t *cp;
cp = cm_ParseIoctlStringAlloc(ioctlp, NULL);
- code = cm_Lookup(dscp, cp, CM_FLAG_NOMOUNTCHASE, userp, reqp, &scp);
+
+ code = cm_Lookup(dscp, cp[0] ? cp : L".", CM_FLAG_NOMOUNTCHASE, userp, reqp, &scp);
if (code)
goto done_2;
cp = cm_ParseIoctlStringAlloc(ioctlp, NULL);
- code = cm_Lookup(dscp, cp, CM_FLAG_NOMOUNTCHASE, userp, reqp, &scp);
+ code = cm_Lookup(dscp, cp[0] ? cp : L".", CM_FLAG_NOMOUNTCHASE, userp, reqp, &scp);
/* if something went wrong, bail out now */
if (code)
for (cp = cm_data.allCellsp; cp; cp=cp->allNextp)
{
afs_int32 code;
- lock_ObtainMutex(&cp->mx);
+
/* delete all previous server lists - cm_FreeServerList will ask for write on cm_ServerLock*/
cm_FreeServerList(&cp->vlServersp, CM_FREESERVERLIST_DELETE);
cp->vlServersp = NULL;
+ lock_ReleaseWrite(&cm_cellLock);
+
rock.cellp = cp;
rock.flags = 0;
code = cm_SearchCellFile(cp->name, cp->name, cm_AddCellProc, &rock);
int ttl;
code = cm_SearchCellByDNS(cp->name, cp->name, &ttl, cm_AddCellProc, &rock);
if ( code == 0 ) { /* got cell from DNS */
+ lock_ObtainMutex(&cp->mx);
cp->flags |= CM_CELLFLAG_DNS;
cp->flags &= ~CM_CELLFLAG_VLSERVER_INVALID;
cp->timeout = time(0) + ttl;
+ lock_ReleaseMutex(&cp->mx);
}
}
}
else {
+ lock_ObtainMutex(&cp->mx);
cp->flags &= ~CM_CELLFLAG_DNS;
+ lock_ReleaseMutex(&cp->mx);
}
#endif /* AFS_AFSDB_ENV */
if (code) {
+ lock_ObtainMutex(&cp->mx);
cp->flags |= CM_CELLFLAG_VLSERVER_INVALID;
+ lock_ReleaseMutex(&cp->mx);
+ lock_ObtainWrite(&cm_cellLock);
}
else {
+ lock_ObtainMutex(&cp->mx);
cp->flags &= ~CM_CELLFLAG_VLSERVER_INVALID;
+ lock_ReleaseMutex(&cp->mx);
+ lock_ObtainWrite(&cm_cellLock);
cm_RandomizeServer(&cp->vlServersp);
}
- lock_ReleaseMutex(&cp->mx);
}
-
lock_ReleaseWrite(&cm_cellLock);
return 0;
}
clientchar_t *cell = NULL;
cm_volume_t *volp = NULL;
cm_cell_t *cellp = NULL;
+ size_t len;
/*
* The fs command allows the user to specify partial cell names on NT. These must
cellp = cm_FindCellByID(dscp->fid.cell, CM_FLAG_NOPROBE);
}
+ /* remove the trailing dot if it is present */
+ len = strlen(fsvolume);
+ if (len > 1 && fsvolume[len-1] == '.')
+ fsvolume[len-1] = '\0';
+
/* validate the target info */
if (cm_VolNameIsID(fsvolume)) {
code = cm_FindVolumeByID(cellp, atoi(fsvolume), userp, reqp,
cp = ioctlp->inDatap;
clientp = cm_Utf8ToClientStringAlloc(cp, -1, NULL);
- code = cm_Lookup(dscp, clientp, CM_FLAG_NOMOUNTCHASE, userp, reqp, &scp);
+ code = cm_Lookup(dscp, clientp[0] ? clientp : L".", CM_FLAG_NOMOUNTCHASE, userp, reqp, &scp);
free(clientp);
if (code)
return code;
code = cm_AssembleLink(scp, "", &newRootScp, &spacep, userp, reqp);
cm_ReleaseSCache(scp);
if (code == 0) {
+ char * linkstr;
cp = ioctlp->outDatap;
if (newRootScp != NULL) {
StringCbCopyA(cp, SMB_IOCTL_MAXDATA - (cp - ioctlp->outAllocp), cm_mountRoot);
StringCbCatA(cp, SMB_IOCTL_MAXDATA - (cp - ioctlp->outAllocp), "/");
cp += strlen(cp);
}
- StringCbCopyA(cp, SMB_IOCTL_MAXDATA - (cp - ioctlp->outAllocp), spacep->data);
+
+ linkstr = cm_ClientStringToFsStringAlloc(spacep->wdata, -1, NULL);
+ StringCbCopyA(cp, SMB_IOCTL_MAXDATA - (cp - ioctlp->outAllocp), linkstr);
cp += strlen(cp) + 1;
ioctlp->outDatap = cp;
cm_FreeSpace(spacep);
+ free(linkstr);
if (newRootScp != NULL)
cm_ReleaseSCache(newRootScp);
code = 0;
osi_LogEvent("cm_IoctlListlink",NULL," name[%s]",cp);
clientp = cm_Utf8ToClientStringAlloc(cp, -1, NULL);
- code = cm_Lookup(dscp, clientp, CM_FLAG_NOMOUNTCHASE, userp, reqp, &scp);
+ code = cm_Lookup(dscp, clientp[0] ? clientp : L".", CM_FLAG_NOMOUNTCHASE, userp, reqp, &scp);
free(clientp);
if (code)
return code;
cp = ioctlp->inDatap;
clientp = cm_Utf8ToClientStringAlloc(cp, -1, NULL);
- code = cm_Lookup(dscp, clientp, CM_FLAG_NOMOUNTCHASE, userp, reqp, &scp);
+ code = cm_Lookup(dscp, clientp[0] ? clientp : L".", CM_FLAG_NOMOUNTCHASE, userp, reqp, &scp);
/* if something went wrong, bail out now */
if (code)
memcpy(&cryptall, ioctlp->inDatap, sizeof(cryptall));
if (c != cryptall) {
- if (cryptall)
+ if (cryptall == 1)
LogEvent(EVENTLOG_INFORMATION_TYPE, MSG_CRYPT_ON);
+ else if (cryptall == 2)
+ LogEvent(EVENTLOG_INFORMATION_TYPE, MSG_CRYPT_AUTH);
else
LogEvent(EVENTLOG_INFORMATION_TYPE, MSG_CRYPT_OFF);
}