aclp->backp = NULL;
}
- /* release the old user */
- if (aclp->userp) {
+ /* release the old user */
+ if (aclp->userp) {
cm_ReleaseUser(aclp->userp);
- aclp->userp = NULL;
+ aclp->userp = NULL;
}
return aclp;
}
aclp->backp = scp;
aclp->nextp = scp->randomACLp;
scp->randomACLp = aclp;
+ cm_HoldUser(userp);
aclp->userp = userp;
- cm_HoldUser(userp);
aclp->randomAccess = rights;
aclp->tgtLifetime = cm_TGTLifeTime(userp);
lock_ReleaseWrite(&cm_aclLock);
for (aclp = *laclpp; aclp; laclpp = &aclp->nextp, aclp = *laclpp) {
if (userp == aclp->userp) { /* One for a given user/scache */
*laclpp = aclp->nextp;
- cm_ReleaseUser(aclp->userp);
- aclp->userp = NULL;
+ cm_ReleaseUser(aclp->userp);
+ aclp->userp = NULL;
aclp->backp = (struct cm_scache *) 0;
break;
}
{
long code;
cm_buf_t *bp; /* buffer we're hacking on */
- cm_buf_t *nbp; /* next one */
+ cm_buf_t *nbp; /* next one */
long i;
i = BUF_FILEHASH(&scp->fid);
code = 0;
lock_ObtainWrite(&buf_globalLock);
- bp = buf_fileHashTablepp[i];
- if (bp) bp->refCount++;
- lock_ReleaseWrite(&buf_globalLock);
+ bp = buf_fileHashTablepp[i];
+ if (bp) bp->refCount++;
+ lock_ReleaseWrite(&buf_globalLock);
for(; bp; bp = nbp) {
/* clean buffer synchronously */
if (cm_FidCmp(&bp->fid, &scp->fid) == 0) {
if (userp) {
+ cm_HoldUser(userp);
lock_ObtainMutex(&bp->mx);
- if (bp->userp) cm_ReleaseUser(bp->userp);
- bp->userp = userp;
+ if (bp->userp)
+ cm_ReleaseUser(bp->userp);
+ bp->userp = userp;
lock_ReleaseMutex(&bp->mx);
- cm_HoldUser(userp);
- }
+ }
buf_CleanAsync(bp, reqp);
- buf_CleanWait(bp);
- lock_ObtainMutex(&bp->mx);
+ buf_CleanWait(bp);
+ lock_ObtainMutex(&bp->mx);
if (bp->flags & CM_BUF_ERROR) {
if (code == 0 || code == -1) code = bp->error;
- if (code == 0) code = -1;
- }
- lock_ReleaseMutex(&bp->mx);
+ if (code == 0) code = -1;
+ }
+ lock_ReleaseMutex(&bp->mx);
}
lock_ObtainWrite(&buf_globalLock);
buf_LockedRelease(bp);
- nbp = bp->fileHashp;
- if (nbp) nbp->refCount++;
+ nbp = bp->fileHashp;
+ if (nbp) nbp->refCount++;
lock_ReleaseWrite(&buf_globalLock);
} /* for loop over a bunch of buffers */
- /* done */
+ /* done */
return code;
}
DeregisterEventSource(h);
}
-#define MAXBUF_ 131
+#define MAXBUF_ 512
void DebugEvent_local(char *a,char *b,...)
{
long cm_SearchCellFile(char *cellNamep, char *newCellNamep,
cm_configProc_t *procp, void *rockp)
{
- char wdir[256];
+ char wdir[257];
int tlen;
FILE *tfilep, *bestp, *tempp;
char *tp;
- char lineBuffer[256];
+ char lineBuffer[257];
struct hostent *thp;
char *valuep;
struct sockaddr_in vlSockAddr;
#if defined(DJGPP) || defined(AFS_WIN95_ENV)
long ip_addr;
int c1, c2, c3, c4;
- char aname[256];
+ char aname[241];
char *afsconf_path;
#endif
#if !defined(DJGPP)
code = GetWindowsDirectory(wdir, sizeof(wdir));
- if (code == 0 || code > sizeof(wdir))
+ if (code == 0 || code > sizeof(wdir))
return -1;
/* add trailing backslash, if required */
void cm_GCConnections(cm_server_t *serverp)
{
cm_conn_t *tcp;
- cm_conn_t **lcpp;
- cm_user_t *userp;
+ cm_conn_t **lcpp;
+ cm_user_t *userp;
lock_ObtainWrite(&cm_connLock);
lcpp = &serverp->connsp;
userp = tcp->userp;
if (userp && tcp->refCount == 0 && (userp->vcRefs == 0)) {
/* do the deletion of this guy */
- cm_ReleaseUser(userp);
- *lcpp = tcp->nextp;
+ cm_ReleaseUser(userp);
+ *lcpp = tcp->nextp;
rx_DestroyConnection(tcp->callp);
- lock_FinalizeMutex(&tcp->mx);
- free(tcp);
- }
- else {
+ lock_FinalizeMutex(&tcp->mx);
+ free(tcp);
+ }
+ else {
/* just advance to the next */
- lcpp = &tcp->nextp;
- }
+ lcpp = &tcp->nextp;
}
+ }
lock_ReleaseWrite(&cm_connLock);
}
static void cm_NewRXConnection(cm_conn_t *tcp, cm_ucell_t *ucellp,
cm_server_t *serverp)
{
- unsigned short port;
- int serviceID;
- int secIndex;
- struct rx_securityClass *secObjp;
+ unsigned short port;
+ int serviceID;
+ int secIndex;
+ struct rx_securityClass *secObjp;
afs_int32 level;
if (serverp->type == CM_SERVER_VLDB) {
port = htons(7003);
- serviceID = 52;
- }
- else {
+ serviceID = 52;
+ }
+ else {
osi_assert(serverp->type == CM_SERVER_FILE);
- port = htons(7000);
- serviceID = 1;
- }
+ port = htons(7000);
+ serviceID = 1;
+ }
if (ucellp->flags & CM_UCELLFLAG_RXKAD) {
secIndex = 2;
if (cryptall) {
} else {
level = rxkad_clear;
}
- secObjp = rxkad_NewClientSecurityObject(level,
- &ucellp->sessionKey, ucellp->kvno,
- ucellp->ticketLen, ucellp->ticketp);
- }
- else {
- /* normal auth */
- secIndex = 0;
- secObjp = rxnull_NewClientSecurityObject();
- }
+ secObjp = rxkad_NewClientSecurityObject(level,
+ &ucellp->sessionKey, ucellp->kvno,
+ ucellp->ticketLen, ucellp->ticketp);
+ }
+ else {
+ /* normal auth */
+ secIndex = 0;
+ secObjp = rxnull_NewClientSecurityObject();
+ }
osi_assert(secObjp != NULL);
- tcp->callp = rx_NewConnection(serverp->addr.sin_addr.s_addr,
- port,
- serviceID,
- secObjp,
- secIndex);
+ tcp->callp = rx_NewConnection(serverp->addr.sin_addr.s_addr,
+ port,
+ serviceID,
+ secObjp,
+ secIndex);
rx_SetConnDeadTime(tcp->callp, CM_CONN_CONNDEADTIME);
rx_SetConnHardDeadTime(tcp->callp, CM_CONN_HARDDEADTIME);
tcp->ucgen = ucellp->gen;
long cm_ConnByServer(cm_server_t *serverp, cm_user_t *userp, cm_conn_t **connpp)
{
cm_conn_t *tcp;
- cm_ucell_t *ucellp;
+ cm_ucell_t *ucellp;
lock_ObtainMutex(&userp->mx);
lock_ObtainWrite(&cm_connLock);
for(tcp = serverp->connsp; tcp; tcp=tcp->nextp) {
if (tcp->userp == userp) break;
- }
+ }
/* find ucell structure */
- ucellp = cm_GetUCell(userp, serverp->cellp);
+ ucellp = cm_GetUCell(userp, serverp->cellp);
if (!tcp) {
tcp = malloc(sizeof(*tcp));
- memset(tcp, 0, sizeof(*tcp));
- tcp->nextp = serverp->connsp;
- serverp->connsp = tcp;
- tcp->userp = userp;
- cm_HoldUser(userp);
- lock_InitializeMutex(&tcp->mx, "cm_conn_t mutex");
- tcp->serverp = serverp;
+ memset(tcp, 0, sizeof(*tcp));
+ tcp->nextp = serverp->connsp;
+ serverp->connsp = tcp;
+ cm_HoldUser(userp);
+ tcp->userp = userp;
+ lock_InitializeMutex(&tcp->mx, "cm_conn_t mutex");
+ tcp->serverp = serverp;
tcp->cryptlevel = rxkad_clear;
cm_NewRXConnection(tcp, ucellp, serverp);
tcp->refCount = 1;
- }
+ }
else {
if ((tcp->ucgen < ucellp->gen) || (tcp->cryptlevel != cryptall))
{
rx_DestroyConnection(tcp->callp);
cm_NewRXConnection(tcp, ucellp, serverp);
}
- tcp->refCount++;
+ tcp->refCount++;
}
lock_ReleaseWrite(&cm_connLock);
- lock_ReleaseMutex(&userp->mx);
+ lock_ReleaseMutex(&userp->mx);
/* return this pointer to our caller */
- osi_Log1(afsd_logp, "cm_ConnByServer returning conn 0x%x", (long) tcp);
+ osi_Log1(afsd_logp, "cm_ConnByServer returning conn 0x%x", (long) tcp);
*connpp = tcp;
- return 0;
+ return 0;
}
long cm_Conn(struct cm_fid *fidp, struct cm_user *userp, cm_req_t *reqp,
{
cm_bkgRequest_t *rp;
- rp = malloc(sizeof(*rp));
- memset(rp, 0, sizeof(*rp));
+ rp = malloc(sizeof(*rp));
+ memset(rp, 0, sizeof(*rp));
- rp->scp = scp;
- cm_HoldSCache(scp);
- rp->userp = userp;
- cm_HoldUser(userp);
- rp->procp = procp;
- rp->p1 = p1;
- rp->p2 = p2;
- rp->p3 = p3;
- rp->p4 = p4;
-
- lock_ObtainWrite(&cm_daemonLock);
+ cm_HoldSCache(scp);
+ rp->scp = scp;
+ cm_HoldUser(userp);
+ rp->userp = userp;
+ rp->procp = procp;
+ rp->p1 = p1;
+ rp->p2 = p2;
+ rp->p3 = p3;
+ rp->p4 = p4;
+
+ lock_ObtainWrite(&cm_daemonLock);
cm_bkgQueueCount++;
- osi_QAdd((osi_queue_t **) &cm_bkgListp, &rp->q);
- if (!cm_bkgListEndp) cm_bkgListEndp = rp;
- lock_ReleaseWrite(&cm_daemonLock);
-
- osi_Wakeup((long) &cm_bkgListp);
+ osi_QAdd((osi_queue_t **) &cm_bkgListp, &rp->q);
+ if (!cm_bkgListEndp) cm_bkgListEndp = rp;
+ lock_ReleaseWrite(&cm_daemonLock);
+
+ osi_Wakeup((long) &cm_bkgListp);
}
/* periodic check daemon */
void cm_Daemon(long parm)
{
- long now;
+ long now;
long lastLockCheck;
- long lastVolCheck;
- long lastCBExpirationCheck;
+ long lastVolCheck;
+ long lastCBExpirationCheck;
long lastDownServerCheck;
long lastUpServerCheck;
long lastTokenCacheCheck;
void cm_ReleaseUser(cm_user_t *up)
{
cm_ucell_t *ucp;
- cm_ucell_t *ncp;
+ cm_ucell_t *ncp;
if (up == NULL) return;
osi_assert(up->refCount-- > 0);
if (up->refCount == 0) {
lock_FinalizeMutex(&up->mx);
- for(ucp = up->cellInfop; ucp; ucp = ncp) {
+ for(ucp = up->cellInfop; ucp; ucp = ncp) {
ncp = ucp->nextp;
if (ucp->ticketp) free(ucp->ticketp);
- free(ucp);
- }
- free(up);
+ free(ucp);
}
+ free(up);
+ }
lock_ReleaseWrite(&cm_userLock);
}
*/
lock_ObtainWrite(&smb_rctLock);
for(vcp=smb_allVCsp; vcp; vcp=vcp->nextp) {
- for(usersp=vcp->usersp; usersp; usersp=usersp->nextp) {\r
+ for(usersp=vcp->usersp; usersp; usersp=usersp->nextp) {
if (usersp->unp) {
- if ((userp=usersp->unp->userp)==0)\r
- continue;\r
- } else\r
- continue;\r
+ if ((userp=usersp->unp->userp)==0)
+ continue;
+ } else
+ continue;
lock_ObtainMutex(&userp->mx);
for(ucellp=userp->cellInfop; ucellp; ucellp=ucellp->nextp) {
if(ucellp->flags & CM_UCELLFLAG_RXKAD) {
if (code == 0 || Timeout != 0) {
fileLock = malloc(sizeof(cm_file_lock_t));
fileLock->LockType = LockType;
- fileLock->userp = userp;
cm_HoldUser(userp);
+ fileLock->userp = userp;
fileLock->fid = scp->fid;
fileLock->LOffset = LOffset;
fileLock->LLength = LLength;
q = scp->fileLocks;
while (q) {
fileLock = (cm_file_lock_t *)
- ((char *) q - offsetof(cm_file_lock_t, fileq));
+ ((char *) q - offsetof(cm_file_lock_t, fileq));
if (!found
&& fileLock->userp == userp
&& LargeIntegerEqualTo(fileLock->LOffset, LOffset)
lock_ReleaseMutex(&scp->mx);
do {
code = cm_Conn(&scp->fid, userp, reqp, &connp);
- if (code) break;
+ if (code)
+ break;
code = RXAFS_ReleaseLock(connp->callp, &tfid, &volSync);
} while (cm_Analyze(connp, userp, reqp, &scp->fid, &volSync,
NULL, code));
code = cm_MapRPCError(code, &req);
}
-handleCode:
+ handleCode:
if (code != 0 && code != CM_ERROR_WOULDBLOCK) {
lock_ObtainMutex(&scp->mx);
osi_QRemove(&scp->fileLocks, &oldFileLock->fileq);
else if (code != CM_ERROR_WOULDBLOCK) {
oldFileLock->flags |= CM_FILELOCK_FLAG_INVALID;
cm_ReleaseUser(oldFileLock->userp);
+ oldFileLock->userp = NULL;
}
lock_ReleaseWrite(&cm_scacheLock);
local_tm = *(localtime(&t));
days = local_tm.tm_yday - gmt_tm.tm_yday;
- hours = 24 * days + local_tm.tm_hour - gmt_tm.tm_hour;
+ hours = 24 * days + local_tm.tm_hour - gmt_tm.tm_hour - (local_tm.tm_isdst ? 1 : 0);
minutes = 60 * hours + local_tm.tm_min - gmt_tm.tm_min;
seconds = 60 * minutes + local_tm.tm_sec - gmt_tm.tm_sec;
osi_assert(up != NULL);
*lupp = up->nextp;
lock_FinalizeMutex(&uidp->mx);
- if (uidp->unp)
+ if (uidp->unp) {
userp = uidp->unp->userp; /* remember to drop ref later */
+ uidp->unp->userp = NULL;
+ }
}
lock_ReleaseWrite(&smb_rctLock);
if (userp) {
}
else /* create \\<netbiosName>\<cellname> */
{
- if (cm_GetCell_Gen(shareName, temp, CM_FLAG_CREATE))
- {
- int len = min(strlen(shareName), strlen(temp));
- if (!_strnicmp(shareName, temp, len)) { /* partial matches allowed */
- sprintf(pathName,"/%s/",temp);
- *pathNamep = strdup(strlwr(pathName));
- return 1;
- }
- }
+ /* Get the full name for this cell */
+ code = cm_SearchCellFile(shareName, temp, 0, 0);
+#ifdef AFS_AFSDB_ENV
+ if (code && cm_dnsEnabled) {
+ int ttl;
+ code = cm_SearchCellByDNS(shareName, temp, &ttl, 0, 0);
+ }
+#endif
+ /* construct the path */
+ if (code == 0) {
+ sprintf(pathName,"/%s/",temp);
+ *pathNamep = strdup(strlwr(pathName));
+ return 1;
+ }
}
/* failure */
*pathNamep = NULL;
/* and record the last writer */
if (bufferp->userp != userp) {
- if (bufferp->userp) cm_ReleaseUser(bufferp->userp);
- bufferp->userp = userp;
cm_HoldUser(userp);
+ if (bufferp->userp)
+ cm_ReleaseUser(bufferp->userp);
+ bufferp->userp = userp;
}
/* adjust counters, pointers, etc. */