5 #include "TaAfsAdmSvrInternal.h"
9 * ROUTINES ___________________________________________________________________
14 // ...obtains a cookie to represent the calling process. The cookie should
15 // be freed with AfsAdmSvr_Disconnect when the process disconnects.
17 int AfsAdmSvr_Connect (STRING szClientAddress, DWORD *pidClient, ULONG *pStatus)
19 // Make sure AfsClass initialized properly. If it's already init'd,
20 // this won't hurt at all.
23 if (!AfsClass_Initialize (&status))
25 Print (TEXT("Denying client %s due to AfsClass initialization failure"), szClientAddress);
26 return FALSE_(status, pStatus);
29 // Find a free CLIENTINFO structure for this caller
31 if (!AfsAdmSvr_AttachClient (szClientAddress, pidClient, pStatus))
34 Print (TEXT("Connected to client %s (ID 0x%08lX)"), AfsAdmSvr_GetClientName (*pidClient), *pidClient);
41 // ...reminds the admin server that the specified client is still around.
42 // this call should be made at least every csecAFSADMSVR_CLIENT_PING
43 // seconds, lest the admin server think you've disconnected. (The
44 // client library TaAfsAdmSvrClient.lib automatically handles this.)
46 int AfsAdmSvr_Ping (DWORD idClient, ULONG *pStatus)
50 if (!AfsAdmSvr_fIsValidClient (idClient))
51 return Leave_FALSE_(ERROR_INVALID_PARAMETER, pStatus);
53 AfsAdmSvr_PingClient (idClient);
59 // AfsAdmSvr_Disconnect
60 // ...releases and invalidates the cookie representing the calling process.
62 int AfsAdmSvr_Disconnect (DWORD idClient, ULONG *pStatus)
66 // Make sure this is a valid client, and free its l.aClients[] entry if so.
68 if (!AfsAdmSvr_fIsValidClient (idClient))
69 return Leave_FALSE_(ERROR_INVALID_PARAMETER, pStatus);
71 Print (TEXT("Disconnected from client %s (ID 0x%08lX)"), AfsAdmSvr_GetClientName (idClient), idClient);
73 AfsAdmSvr_DetachClient (idClient);
79 // AfsAdmSvr_CrackCredentials
80 // ...queries the specified AFS credentials token for its cell, user
81 // and expiration date.
83 int AfsAdmSvr_CrackCredentials (DWORD idClient, DWORD hCreds, STRING pszCell, STRING pszUser, SYSTEMTIME *pstExpiration, ULONG *pStatus)
86 size_t iOp = AfsAdmSvr_BeginOperation (idClient);
88 if (!AfsAdmSvr_fIsValidClient (idClient))
89 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
91 Print (dlDETAIL, TEXT("Client 0x%08lX: CrackCredentials (0x%08lX)"), idClient, hCreds);
93 unsigned long dateExpirationQuery;
94 int fHasKasTokenQuery;
95 char szUser[ cchSTRING ];
96 char szUser2[ cchSTRING ];
97 char szCell[ cchSTRING ];
98 char *pszCellQuery = (pszCell) ? (char *)pszCell : szCell;
99 char *pszUserQuery = (pszUser) ? (char *)pszUser : szUser;
100 if (!afsclient_TokenQuery ((PVOID)hCreds, &dateExpirationQuery, pszUserQuery, szUser2, pszCellQuery, &fHasKasTokenQuery, (afs_status_p)&status))
101 return FALSE_(status, pStatus, iOp);
104 AfsAppLib_UnixTimeToSystemTime (pstExpiration, dateExpirationQuery);
106 AfsAdmSvr_EndOperation (iOp);
111 // AfsAdmSvr_GetCredentials
112 // ...queries the user's current AFS credentials for the specified cell
113 // if the user already has credentials in the cell, returns a nonzero
114 // token {hCreds}, suitable for use in AfsAdmSvr_OpenCell().
116 DWORD AfsAdmSvr_GetCredentials (DWORD idClient, STRING pszCell, ULONG *pStatus)
119 size_t iOp = AfsAdmSvr_BeginOperation (idClient);
121 if (!AfsAdmSvr_fIsValidClient (idClient))
122 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
124 Print (dlDETAIL, TEXT("Client 0x%08lX: GetCredentials (%s)"), idClient, pszCell);
126 const char *pszCellTest = (pszCell && *pszCell) ? (const char *)pszCell : NULL;
129 if (!afsclient_TokenGetExisting (pszCellTest, &hCreds, (afs_status_p)&status))
130 return FALSE_(status, pStatus, iOp);
132 AfsAdmSvr_EndOperation (iOp);
133 return (DWORD)hCreds;
137 // AfsAdmSvr_SetCredentials
138 // ...obtains new AFS credentials within the administrative server process
139 // on behalf of the specified user. if successful, returns a nonzero
140 // token {hCreds}, suitable for use in AfsAdmSvr_OpenCell().
142 DWORD AfsAdmSvr_SetCredentials (DWORD idClient, STRING pszCell, STRING pszUser, STRING pszPassword, ULONG *pStatus)
145 size_t iOp = AfsAdmSvr_BeginOperation (idClient);
147 Print (dlDETAIL, TEXT("Client 0x%08lX: SetCredentials (%s,%s)"), idClient, pszCell, pszUser);
149 if (!AfsAdmSvr_fIsValidClient (idClient))
150 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
152 const char *pszCellSet = (pszCell && *pszCell) ? (const char *)pszCell : NULL;
155 if (!afsclient_TokenGetNew (pszCellSet, (const char *)pszUser, (const char *)pszPassword, &hCreds, (afs_status_p)&status))
156 return FALSE_(status,pStatus,iOp);
158 AfsAdmSvr_EndOperation (iOp);
159 return (DWORD)hCreds;
163 // AfsAdmSvr_PushCredentials
164 // ...requests that the specified AFS credentials be used hereafter
165 // when manipulating the specified cell. You should follow this
166 // call with a Refresh request if necessary.
168 int AfsAdmSvr_PushCredentials (DWORD idClient, DWORD hCreds, ASID idCell, ULONG *pStatus)
171 size_t iOp = AfsAdmSvr_BeginOperation (idClient);
173 Print (dlDETAIL, TEXT("Client 0x%08lX: PushCredentials (hCreds=0x%08lX, idCell=0x%08lX)"), idClient, hCreds, idCell);
175 if (!AfsAdmSvr_fIsValidClient (idClient))
176 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
178 if (GetAsidType (idCell) != itCELL)
179 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
182 if ((lpCell = ((LPIDENT)idCell)->OpenCell (&status)) == NULL)
183 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
185 lpCell->SetCurrentCredentials ((PVOID)hCreds);
188 AfsAdmSvr_EndOperation (iOp);
193 // AfsAdmSvr_GetLocalCell
194 // ...obtains the name of the primary cell used by the admin server
196 int AfsAdmSvr_GetLocalCell (DWORD idClient, STRING pszCellName, ULONG *pStatus)
198 size_t iOp = AfsAdmSvr_BeginOperation (idClient);
200 Print (dlDETAIL, TEXT("Client 0x%08lX: GetLocalCell"), idClient);
202 if (!AfsAdmSvr_fIsValidClient (idClient))
203 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
205 if (!CELL::GetDefaultCell (pszCellName, pStatus))
207 AfsAdmSvr_EndOperation (iOp);
211 AfsAdmSvr_EndOperation (iOp);
216 // AfsAdmSvr_ErrorCodeTranslate
217 // ...translates an error code into an English string
219 int AfsAdmSvr_ErrorCodeTranslate (DWORD idClient, ULONG code, LANGID idLanguage, STRING pszErrorText, ULONG *pStatus)
221 if (!AfsAppLib_TranslateError (pszErrorText, code, idLanguage))
222 return FALSE_(ERROR_INVALID_PARAMETER,pStatus);
225 if ((pch = (LPTSTR)lstrrchr (pszErrorText, TEXT('('))) != NULL)
227 while (lstrlen(pszErrorText) && pszErrorText[ lstrlen(pszErrorText)-1 ] == TEXT(' '))
228 pszErrorText[ lstrlen(pszErrorText)-1 ] = TEXT('\0');
233 // AfsAdmSvr_GetAction
234 // ...returns information about a particular operation in progress.
236 int AfsAdmSvr_GetAction (DWORD idClient, DWORD idAction, LPASACTION pAction, ULONG *pStatus)
238 Print (dlDETAIL, TEXT("Client 0x%08lX: GetAction (idAction=0x%08lX)"), idClient, idAction);
240 if (!AfsAdmSvr_fIsValidClient (idClient))
241 return FALSE_(ERROR_INVALID_PARAMETER,pStatus);
243 if (!AfsAdmSvr_GetOperation (idAction, pAction))
244 return FALSE_(ERROR_INVALID_PARAMETER,pStatus);
246 Print (dlERROR, TEXT("Client 0x%08lX: GetAction succeeded"));
251 // AfsAdmSvr_GetActions
252 // ...returns a list of operations in progress. The list returned can
253 // be constrained to only including those operations initiated by
254 // a particular client and/or performed in a particular cell.
256 int AfsAdmSvr_GetActions (DWORD idClient, DWORD idClientSearch, ASID idCellSearch, LPASACTIONLIST *ppList, ULONG *pStatus)
258 Print (dlDETAIL, TEXT("Client 0x%08lX: GetActions (idClientSearch=0x%08lX, idCellSearch=0x%08lX)"), idClient, idClientSearch, idCellSearch);
260 if (!AfsAdmSvr_fIsValidClient (idClient))
261 return FALSE_(ERROR_INVALID_PARAMETER,pStatus);
263 if ((*ppList = AfsAdmSvr_GetOperations (idClientSearch, idCellSearch)) == NULL)
265 Print (dlERROR, TEXT("Client 0x%08lX: GetActions failed"), idClient);
266 return FALSE_(ERROR_NOT_ENOUGH_MEMORY,pStatus);
269 Print (dlERROR, TEXT("Client 0x%08lX: GetActions succeeded; %ld actions"), idClient, (*ppList) ? (*ppList)->cEntries : 0);
274 // AfsAdmSvr_OpenCell
275 // ...opens a cell for administration.
277 int AfsAdmSvr_OpenCell (DWORD idClient, DWORD hCreds, STRING pszCellName, DWORD dwScopeFlags, ASID *pidCell, ULONG *pStatus)
279 size_t iOp = AfsAdmSvr_BeginOperation (idClient);
281 if (!AfsAdmSvr_fIsValidClient (idClient))
282 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
284 Print (dlDETAIL, TEXT("Client 0x%08lX: OpenCell"), idClient);
286 AfsAdmSvr_AddToMinScope (dwScopeFlags);
289 if ((lpiCell = CELL::OpenCell ((LPTSTR)pszCellName, (PVOID)hCreds, pStatus)) == NULL)
291 AfsAdmSvr_EndOperation (iOp);
295 Print (dlDETAIL, TEXT("Client 0x%08lX: OpenCell succeeded (idCell=0x%08lX)"), idClient, (DWORD)lpiCell);
297 *pidCell = (ASID)lpiCell;
298 AfsAdmSvr_EndOperation (iOp);
303 // AfsAdmSvr_CloseCell
304 // ...used by client to open a cell for administration.
306 int AfsAdmSvr_CloseCell (DWORD idClient, ASID idCell, ULONG *pStatus)
308 size_t iOp = AfsAdmSvr_BeginOperation (idClient);
310 Print (dlDETAIL, TEXT("Client 0x%08lX: CloseCell (idCell=0x%08lX)"), idClient, idCell);
312 if (!AfsAdmSvr_fIsValidClient (idClient))
313 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
315 if (GetAsidType (idCell) != itCELL)
316 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
318 CELL::CloseCell ((LPIDENT)idCell);
320 AfsAdmSvr_EndOperation (iOp);
325 // AfsAdmSvr_FindObject
326 // AfsAdmSvr_FindObjects
327 // ...used to search through all objects in the cell, obtaining a list
328 // of those which match the specified criteria. For FindObjects, the
329 // {*ppList} parameter will be filled in with an allocated list of
330 // ASIDs, and should be freed using the AfsAdmSvr_FreeAsidList()
331 // routine (clients using the TaAfsAdmSvrClient.lib library should
332 // call asc_AsidListFree(), which is a wrapper for that routine).
333 // The _FindObject routine can be used to find exactly one object--
334 // for instance, finding the ASID for a particular user or volume--
335 // while the _FindObjects routine returns a list of all objects
336 // which match the specified criteria--all volumes on a partition,
337 // or all users named "b*" within a cell.
339 int AfsAdmSvr_FindObject (DWORD idClient, ASID idSearchScope, ASOBJTYPE ObjectType, AFSADMSVR_SEARCH_REFRESH SearchRefresh, STRING szName, ASID *pidObject, ULONG *pStatus)
344 size_t iOp = AfsAdmSvr_BeginOperation (idClient);
346 Print (dlDETAIL, TEXT("Client 0x%08lX: FindObject (scope=0x%08lX, type=%lu, name='%s')"), idClient, idSearchScope, ObjectType, szName);
348 if (!AfsAdmSvr_fIsValidClient (idClient))
349 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
351 if (GetAsidType (idSearchScope) == itUNUSED)
352 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
354 // We've got a special case here: if possible, we don't want to have to
355 // refresh the contents of the entire cell. So if the client is looking
356 // for a user or group, we can just try to grab that object by its name;
357 // afsclass supports an interface for just this case.
362 rc = AfsAdmSvr_Search_OneUser (pidObject, idSearchScope, szName, &status);
366 rc = AfsAdmSvr_Search_OneGroup (pidObject, idSearchScope, szName, &status);
370 // We'll have to do the search the hard way. First
371 // see if we need to refresh this cell/server.
373 if (!AfsAdmSvr_SearchRefresh (idSearchScope, ObjectType, SearchRefresh, &status))
374 return FALSE_(status,pStatus,iOp);
376 // Look for the specified object.
378 switch (GetAsidType (idSearchScope))
381 if (ObjectType == TYPE_SERVER)
382 rc = AfsAdmSvr_Search_ServerInCell (pidObject, idSearchScope, szName, &status);
383 else if (ObjectType == TYPE_SERVICE)
384 rc = AfsAdmSvr_Search_ServiceInCell (pidObject, idSearchScope, szName, &status);
385 else if (ObjectType == TYPE_PARTITION)
386 rc = AfsAdmSvr_Search_PartitionInCell (pidObject, idSearchScope, szName, &status);
387 else if (ObjectType == TYPE_VOLUME)
388 rc = AfsAdmSvr_Search_VolumeInCell (pidObject, idSearchScope, szName, &status);
389 else if (ObjectType == TYPE_USER)
390 rc = AfsAdmSvr_Search_UserInCell (pidObject, idSearchScope, szName, &status);
391 else if (ObjectType == TYPE_GROUP)
392 rc = AfsAdmSvr_Search_GroupInCell (pidObject, idSearchScope, szName, &status);
396 status = ERROR_INVALID_PARAMETER;
401 if (ObjectType == TYPE_SERVICE)
402 rc = AfsAdmSvr_Search_ServiceInServer (pidObject, idSearchScope, szName, &status);
403 else if (ObjectType == TYPE_PARTITION)
404 rc = AfsAdmSvr_Search_PartitionInServer (pidObject, idSearchScope, szName, &status);
405 else if (ObjectType == TYPE_VOLUME)
406 rc = AfsAdmSvr_Search_VolumeInServer (pidObject, idSearchScope, szName, &status);
410 status = ERROR_INVALID_PARAMETER;
415 if (ObjectType == TYPE_VOLUME)
416 rc = AfsAdmSvr_Search_VolumeInPartition (pidObject, idSearchScope, szName, &status);
420 status = ERROR_INVALID_PARAMETER;
431 Print (dlERROR, TEXT("Client 0x%08lX: FindObject failed (status=0x%08lX)"), idClient, status);
433 Print (dlDETAIL, TEXT("Client 0x%08lX: FindObject succeeded; returning idObject=0x%08lX"), idClient, *pidObject);
435 AfsAdmSvr_EndOperation (iOp);
440 int AfsAdmSvr_FindObjects (DWORD idClient, ASID idSearchScope, ASOBJTYPE ObjectType, AFSADMSVR_SEARCH_REFRESH SearchRefresh, STRING szPattern, LPAFSADMSVR_SEARCH_PARAMS pSearchParams, LPASIDLIST *ppList, ULONG *pStatus)
445 size_t iOp = AfsAdmSvr_BeginOperation (idClient);
447 Print (dlDETAIL, TEXT("Client 0x%08lX: FindObjects (scope=0x%08lX, type=%lu, pat='%s')"), idClient, idSearchScope, ObjectType, szPattern);
449 if (!AfsAdmSvr_fIsValidClient (idClient))
450 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
452 if (GetAsidType (idSearchScope) == itUNUSED)
453 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
455 // First see if we need to refresh this cell/server
457 if (!AfsAdmSvr_SearchRefresh (idSearchScope, ObjectType, SearchRefresh, &status))
458 return FALSE_(status,pStatus,iOp);
460 // Prepare an ASIDLIST, and call whatever subroutine is necessary to
461 // perform the actual search.
463 if ((*ppList = AfsAdmSvr_CreateAsidList()) == NULL)
464 return FALSE_(ERROR_NOT_ENOUGH_MEMORY,pStatus,iOp);
466 LPTSTR pszPattern = (szPattern && szPattern[0]) ? (LPTSTR)szPattern : NULL;
468 switch (GetAsidType (idSearchScope))
471 if (ObjectType == TYPE_ANY)
472 rc = AfsAdmSvr_Search_AllInCell (ppList, idSearchScope, pszPattern, &status);
473 else if (ObjectType == TYPE_SERVER)
474 rc = AfsAdmSvr_Search_ServersInCell (ppList, idSearchScope, pszPattern, &status);
475 else if (ObjectType == TYPE_SERVICE)
476 rc = AfsAdmSvr_Search_ServicesInCell (ppList, idSearchScope, pszPattern, &status);
477 else if (ObjectType == TYPE_PARTITION)
478 rc = AfsAdmSvr_Search_PartitionsInCell (ppList, idSearchScope, pszPattern, &status);
479 else if (ObjectType == TYPE_VOLUME)
480 rc = AfsAdmSvr_Search_VolumesInCell (ppList, idSearchScope, pszPattern, &status);
481 else if (ObjectType == TYPE_USER)
482 rc = AfsAdmSvr_Search_UsersInCell (ppList, idSearchScope, pszPattern, &status);
483 else if (ObjectType == TYPE_GROUP)
484 rc = AfsAdmSvr_Search_GroupsInCell (ppList, idSearchScope, pszPattern, &status);
488 status = ERROR_INVALID_PARAMETER;
493 if (ObjectType == TYPE_ANY)
494 rc = AfsAdmSvr_Search_AllInServer (ppList, idSearchScope, pszPattern, &status);
495 else if (ObjectType == TYPE_SERVICE)
496 rc = AfsAdmSvr_Search_ServicesInServer (ppList, idSearchScope, pszPattern, &status);
497 else if (ObjectType == TYPE_PARTITION)
498 rc = AfsAdmSvr_Search_PartitionsInServer (ppList, idSearchScope, pszPattern, &status);
499 else if (ObjectType == TYPE_VOLUME)
500 rc = AfsAdmSvr_Search_VolumesInServer (ppList, idSearchScope, pszPattern, &status);
504 status = ERROR_INVALID_PARAMETER;
509 if (ObjectType == TYPE_ANY)
510 rc = AfsAdmSvr_Search_VolumesInPartition (ppList, idSearchScope, pszPattern, &status);
511 else if (ObjectType == TYPE_VOLUME)
512 rc = AfsAdmSvr_Search_VolumesInPartition (ppList, idSearchScope, pszPattern, &status);
516 status = ERROR_INVALID_PARAMETER;
521 if (rc && (*ppList) && (pSearchParams))
522 AfsAdmSvr_Search_Advanced (ppList, pSearchParams);
524 if (!rc && (*ppList))
525 AfsAdmSvr_FreeAsidList (ppList);
530 Print (dlERROR, TEXT("Client 0x%08lX: FindObjects failed (status=0x%08lX)"), idClient, status);
532 Print (dlDETAIL, TEXT("Client 0x%08lX: FindObjects succeeded; returning %lu item(s)"), idClient, (*ppList)->cEntries);
534 AfsAdmSvr_EndOperation (iOp);
539 // AfsAdmSvr_GetObject
540 // AfsAdmSvr_GetObjects
541 // ...returns server-cached information about the specified object (or
544 int AfsAdmSvr_GetObject (DWORD idClient, AFSADMSVR_GET_TYPE GetType, AFSADMSVR_GET_LEVEL GetLevel, ASID idObject, DWORD verProperties, LPASOBJPROP pProperties, ULONG *pStatus)
546 size_t iOp = AfsAdmSvr_BeginOperation (idClient);
548 Print (dlDETAIL2, TEXT("Client 0x%08lX: GetObject (Type=%lu, Level=%lu, idObject=0x%08lX, ver=%ld)"), idClient, (LONG)GetType, (LONG)GetLevel, idObject, verProperties);
550 memset (pProperties, 0x00, sizeof(ASOBJPROP));
552 if (!AfsAdmSvr_fIsValidClient (idClient))
553 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
555 LPASOBJPROP pCurrentProperties;
556 if ((pCurrentProperties = AfsAdmSvr_GetCurrentProperties (idObject, pStatus)) == NULL)
558 Print (dlERROR, TEXT("Client 0x%08lX: GetObject failed; no properties"), idClient, idObject);
559 AfsAdmSvr_EndOperation (iOp);
563 // At this point pCurrentProperties may just be rudimentary properties.
564 // If the user has requested GET_ALL_DATA, we'll have to get full properties.
566 if ( (GetLevel == GET_ALL_DATA) && (pCurrentProperties->verProperties < verPROP_FIRST_SCAN) )
568 if (!AfsAdmSvr_ObtainFullProperties (pCurrentProperties, pStatus))
570 Print (dlERROR, TEXT("Client 0x%08lX: GetObject failed; no full properties"), idClient, idObject);
571 AfsAdmSvr_EndOperation (iOp);
576 // Now determine if we need to return anything at all; if the user specified
577 // RETURN_IF_OUT_OF_DATE, it's possible that there's no need to do so.
579 if ((pCurrentProperties->verProperties > verProperties) || (GetType == RETURN_DATA_ALWAYS))
581 memcpy (pProperties, pCurrentProperties, sizeof(ASOBJPROP));
584 Print (dlDETAIL2, TEXT("Client 0x%08lX: GetObject succeeded (idObject=0x%08lX)"), idClient, idObject);
585 AfsAdmSvr_EndOperation (iOp);
590 int AfsAdmSvr_GetObjects (DWORD idClient, AFSADMSVR_GET_TYPE GetType, AFSADMSVR_GET_LEVEL GetLevel, LPASIDLIST pListObjects, LPASOBJPROPLIST *ppListObjectProperties, ULONG *pStatus)
592 size_t iOp = AfsAdmSvr_BeginOperation (idClient);
594 Print (dlDETAIL, TEXT("Client 0x%08lX: GetObjects (Type=%lu, Level=%lu, nObjects=%lu)"), idClient, (LONG)GetType, (LONG)GetLevel, (pListObjects) ? (pListObjects->cEntries) : 0);
596 if (!AfsAdmSvr_fIsValidClient (idClient))
597 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
599 *ppListObjectProperties = NULL;
600 for (size_t iObject = 0; iObject < pListObjects->cEntries; ++iObject)
602 ASOBJPROP ObjectProperties;
605 if (AfsAdmSvr_GetObject (idClient, GetType, GetLevel, pListObjects->aEntries[ iObject ].idObject, pListObjects->aEntries[ iObject ].lParam, &ObjectProperties, &status))
607 if (ObjectProperties.idObject == pListObjects->aEntries[ iObject ].idObject)
609 if (!*ppListObjectProperties)
610 *ppListObjectProperties = AfsAdmSvr_CreateObjPropList();
612 if (*ppListObjectProperties)
613 AfsAdmSvr_AddToObjPropList (ppListObjectProperties, &ObjectProperties, 0);
618 Print (dlDETAIL, TEXT("Client 0x%08lX: GetObjects succeeded; returning %lu properties"), idClient, (*ppListObjectProperties) ? ((*ppListObjectProperties)->cEntries) : 0);
619 AfsAdmSvr_EndOperation (iOp);
624 // AfsAdmSvr_RefreshObject
625 // AfsAdmSvr_RefreshObjects
626 // ...invalidates the server's cache of information about the specified
627 // object or objects.
629 int AfsAdmSvr_RefreshObject (DWORD idClient, ASID idObject, ULONG *pStatus)
631 size_t iOp = AfsAdmSvr_BeginOperation (idClient);
633 Print (dlDETAIL, TEXT("Client 0x%08lX: RefreshObject (idObject=0x%08lX)"), idClient, idObject);
635 if (!AfsAdmSvr_fIsValidClient (idClient))
636 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
638 if (!AfsAdmSvr_InvalidateObjectProperties (idObject, pStatus))
640 AfsAdmSvr_EndOperation (iOp);
644 AfsAdmSvr_EndOperation (iOp);
649 int AfsAdmSvr_RefreshObjects (DWORD idClient, LPASIDLIST pListObjects, ULONG *pStatus)
651 size_t iOp = AfsAdmSvr_BeginOperation (idClient);
653 Print (dlDETAIL, TEXT("Client 0x%08lX: RefreshObjects (nObjects=%lu)"), idClient, (pListObjects) ? (pListObjects->cEntries) : 0);
655 if (!AfsAdmSvr_fIsValidClient (idClient))
656 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
658 for (size_t iObject = 0; iObject < pListObjects->cEntries; ++iObject)
661 AfsAdmSvr_RefreshObject (idClient, pListObjects->aEntries[ iObject ].idObject, &status);
664 AfsAdmSvr_EndOperation (iOp);
669 // AfsAdmSvr_CallbackHost
670 // ...provides a context in which the server can issue callback functions
671 // via the AfsAdmSvrCallBack_* routines, which the client must implement.
672 // This routine will only return if the server is shut down. It should
673 // be called on a dedicated thread by the client. (TaAfsAdmSvrClient.lib
674 // automatically handles this.)
676 void AfsAdmSvr_CallbackHost (void)
678 AfsAdmSvr_CallbackManager();
683 // AfsAdmSvr_GetRandomKey
684 // ...returns a randomly-generated 8-byte encryption key
686 int AfsAdmSvr_GetRandomKey (DWORD idClient, ASID idCell, BYTE keyData[ ENCRYPTIONKEYLENGTH ], ULONG *pStatus)
688 if (!AfsAdmSvr_fIsValidClient (idClient))
689 return FALSE_(ERROR_INVALID_PARAMETER,pStatus);
691 return AfsClass_GetRandomKey ((LPIDENT)idCell, (LPENCRYPTIONKEY)keyData, pStatus);