static long UpdateGPONodes( PCSTR pszDomain, const PGROUP_POLICY_OBJECT pCurrentGPOs ) { long macError = eDSNoErr; PGROUP_POLICY_OBJECT pDeletedGPOs = NULL; PGROUP_POLICY_OBJECT pNewGPOs = NULL; PGROUP_POLICY_OBJECT pTemp = NULL; macError = GPAComputeDeletedList( pCurrentGPOs, GlobalState.pGPOs, &pDeletedGPOs); GOTO_CLEANUP_ON_MACERROR(macError); macError = GPAComputeDeletedList( GlobalState.pGPOs, pCurrentGPOs, &pNewGPOs); GOTO_CLEANUP_ON_MACERROR(macError); pTemp = pDeletedGPOs; while (pTemp) { LOG("Removing GPO directory node (%s)", pTemp->pszDisplayName); UnregisterGPONode(GlobalState.pszRealm, pTemp->pszDisplayName); pTemp = pTemp->pNext; } pTemp = pNewGPOs; while (pTemp) { LOG("Adding GPO directory node (%s)", pTemp->pszDisplayName); RegisterGPONode(pszDomain, pTemp->pszDisplayName); pTemp = pTemp->pNext; } cleanup: GPA_SAFE_FREE_GPO_LIST(pDeletedGPOs); GPA_SAFE_FREE_GPO_LIST(pNewGPOs); return macError; }
/* * This must be called between GS_ACQUIRE_EXCLUSIVE() and GS_RELEASE(). */ static long Deactivate(void) { long macError = eDSNoErr; PGROUP_POLICY_OBJECT pTemp = NULL; if ( GlobalState.NodeDictionary ) { CFRelease(GlobalState.NodeDictionary); GlobalState.NodeDictionary = NULL; } if ( GlobalState.NodeNameList ) { macError = DSUnregisterNode( GlobalState.Signature, GlobalState.NodeNameList ); if (macError) { LOG_ERROR("Unregister error: %d", macError); } dsDataListDeallocate(0, GlobalState.NodeNameList); free(GlobalState.NodeNameList); GlobalState.NodeNameList = NULL; } while (GlobalState.pGPOs) { pTemp = GlobalState.pGPOs; GlobalState.pGPOs = pTemp->pNext; pTemp->pNext = NULL; /* Remove node representing the GPO */ UnregisterGPONode(GlobalState.pszRealm, pTemp->pszDisplayName); GPA_SAFE_FREE_GPO_LIST(pTemp); } if ( GlobalState.pszRealm ) { LW_SAFE_FREE_STRING(GlobalState.pszRealm); GlobalState.pszRealm = NULL; } GlobalState.IsJoinedToAD = false; if ( GlobalState.pNetAdapterList ) { LWFreeNetAdapterList(GlobalState.pNetAdapterList); GlobalState.pNetAdapterList = NULL; } if ( GlobalState.DsRoot ) { dsCloseDirService( GlobalState.DsRoot ); GlobalState.DsRoot = 0; } if (GlobalState.pAllowAdminCheckData) { FreeAccessCheckData(GlobalState.pAllowAdminCheckData); GlobalState.pAllowAdminCheckData = NULL; } return macError; }
static long RefreshGPONodes(void) { long macError = eDSNoErr; PGROUP_POLICY_OBJECT pCurrentGPOs = NULL; PGROUP_POLICY_OBJECT pDeletedGPOs = NULL; PGROUP_POLICY_OBJECT pNewGPOs = NULL; PGROUP_POLICY_OBJECT pTemp = NULL; PSTR pszDomain = NULL; bool isAcquired = false; macError = GetDomainJoinState(&pszDomain); GOTO_CLEANUP_ON_MACERROR(macError); if (pszDomain) { if (pszDomain && GlobalState.pszRealm && strcmp(pszDomain, GlobalState.pszRealm)) { LOG("Unexpected domain name change: '%s' -> '%s'", pszDomain, GlobalState.pszRealm); // ISSUE-2008/10/07-dalmeida -- To support this, we would // need to unregister all nodes. macError = eDSOperationFailed; GOTO_CLEANUP_ON_MACERROR(macError); } macError = EnumWorkgroupManagerEnabledGPOs(pszDomain, &pCurrentGPOs); if (macError == eDSReceiveFailed || macError == eDSBogusServer || macError == eDSSendFailed || macError == eDSAuthMasterUnreachable) { LOG("EnumWorkgroupManagerEnableGPOs failed %d, treating as okay", macError); GlobalState.fDomainControllerNotAvailable = true; GlobalState.OfflineTimerCount = 1; macError = eDSNoErr; } if (macError) { LOG("EnumWorkgroupManagerEnableGPOs failed unexpectedly (error = %d)", macError); GOTO_CLEANUP_ON_MACERROR(macError); } } GS_ACQUIRE_SHARED(); pthread_mutex_lock(&GlobalState.PeriodicTaskMutex); isAcquired = true; macError = GPAComputeDeletedList(pCurrentGPOs, GlobalState.pGPOs, &pDeletedGPOs); GOTO_CLEANUP_ON_MACERROR(macError); macError = GPAComputeDeletedList(GlobalState.pGPOs, pCurrentGPOs, &pNewGPOs); GOTO_CLEANUP_ON_MACERROR(macError); pTemp = pDeletedGPOs; while (pTemp) { LOG("Removing GPO directory node (%s)", pTemp->pszDisplayName); UnregisterGPONode(GlobalState.pszRealm, pTemp->pszDisplayName); pTemp = pTemp->pNext; } pTemp = pNewGPOs; while (pTemp) { LOG("Adding GPO directory node (%s)", pTemp->pszDisplayName); RegisterGPONode(pszDomain, pTemp->pszDisplayName); pTemp = pTemp->pNext; } GPA_SAFE_FREE_GPO_LIST(GlobalState.pGPOs); GlobalState.pGPOs = pCurrentGPOs; pCurrentGPOs = NULL; GlobalState.IsJoinedToAD = pszDomain ? true : false; LW_SAFE_FREE_STRING(GlobalState.pszRealm); GlobalState.pszRealm = pszDomain; pszDomain = NULL; cleanup: if (isAcquired) { pthread_mutex_unlock(&GlobalState.PeriodicTaskMutex); GS_RELEASE(); } GPA_SAFE_FREE_GPO_LIST(pCurrentGPOs); GPA_SAFE_FREE_GPO_LIST(pDeletedGPOs); GPA_SAFE_FREE_GPO_LIST(pNewGPOs); LW_SAFE_FREE_STRING(pszDomain); return macError; }