DWORD LwSmSrvEnumerateServices( PWSTR** pppwszServiceNames ) { return LwSmTableEnumerateEntries(pppwszServiceNames); }
static DWORD LwSmShutdownServices( VOID ) { DWORD dwError = 0; PWSTR* ppwszServiceNames = NULL; size_t i = 0; PSM_TABLE_ENTRY pEntry = NULL; SM_LOG_INFO("Shutting down running services"); dwError = LwSmTableEnumerateEntries(&ppwszServiceNames); BAIL_ON_ERROR(dwError); for (i = 0; ppwszServiceNames[i]; i++) { dwError = LwSmTableGetEntry(ppwszServiceNames[i], &pEntry); BAIL_ON_ERROR(dwError); dwError = LwSmShutdownService(pEntry); if (dwError) { /* Ignore errors and try to shut down everything we can */ SM_LOG_WARNING("Could not shut down service: %u\n", (unsigned int) dwError); dwError = 0; } LwSmTableReleaseEntry(pEntry); pEntry = NULL; } cleanup: if (ppwszServiceNames) { LwSmFreeStringList(ppwszServiceNames); } if (pEntry) { LwSmTableReleaseEntry(pEntry); } return dwError; error: goto cleanup; }
DWORD LwSmTableGetEntryReverseDependencyClosure( PSM_TABLE_ENTRY pEntry, PWSTR** pppwszServiceList ) { DWORD dwError = 0; PWSTR* ppwszServiceList = NULL; PWSTR* ppwszAllServices = NULL; dwError = LwAllocateMemory(sizeof(*ppwszServiceList) * 1, OUT_PPVOID(&ppwszServiceList)); BAIL_ON_ERROR(dwError); dwError = LwSmTableEnumerateEntries(&ppwszAllServices); BAIL_ON_ERROR(dwError); dwError = LwSmTableGetEntryReverseDependencyClosureHelper( pEntry, ppwszAllServices, &ppwszServiceList); BAIL_ON_ERROR(dwError); *pppwszServiceList = ppwszServiceList; cleanup: if (ppwszAllServices) { LwSmFreeStringList(ppwszAllServices); } return dwError; error: *pppwszServiceList = NULL; if (ppwszServiceList) { LwSmFreeStringList(ppwszServiceList); } goto cleanup; }