DWORD DJIsAppleADPluginInUse(BOOLEAN* pExists) { DWORD ceError = ERROR_SUCCESS; PPROCINFO pProcInfo = NULL; PSTR* ppszArgs = NULL; DWORD nArgs = 7; LONG status = 0; BOOLEAN bInUse = FALSE; DJ_LOG_INFO("Testing to see if Apple AD plugin is already in use"); ceError = CTAllocateMemory(sizeof(PSTR)*nArgs, (PVOID*)(PVOID)&ppszArgs); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTAllocateString("/usr/bin/dscl", ppszArgs); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTAllocateString("localhost", ppszArgs+1); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTAllocateString("-list", ppszArgs+2); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTAllocateString("|", ppszArgs+3); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTAllocateString("grep", ppszArgs+4); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTAllocateString(APPLEADDSPLUGIN_NAME, ppszArgs+5); BAIL_ON_CENTERIS_ERROR(ceError); ceError = DJSpawnProcess(ppszArgs[0], ppszArgs, &pProcInfo); BAIL_ON_CENTERIS_ERROR(ceError); ceError = DJGetProcessStatus(pProcInfo, &status); BAIL_ON_CENTERIS_ERROR(ceError); if (status == 0) { bInUse = TRUE; } error: if (ppszArgs) { CTFreeStringArray(ppszArgs, nArgs); } if (pProcInfo) { FreeProcInfo(pProcInfo); } *pExists = bInUse; return ceError; }
static DWORD SetAIXHostname( PSTR pszComputerName ) { DWORD ceError = ERROR_SUCCESS; PPROCINFO pProcInfo = NULL; PSTR* ppszArgs = NULL; DWORD nArgs = 6; CHAR szBuf[512]; LONG status = 0; DJ_LOG_INFO("Setting hostname to [%s]", pszComputerName); ceError = CTAllocateMemory(sizeof(PSTR)*nArgs, PPCAST(&ppszArgs)); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTAllocateString("chdev", ppszArgs); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTAllocateString("-a", ppszArgs+1); BAIL_ON_CENTERIS_ERROR(ceError); sprintf(szBuf, "hostname=%s", pszComputerName); ceError = CTAllocateString(szBuf, ppszArgs+2); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTAllocateString("-l", ppszArgs+3); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTAllocateString("inet0", ppszArgs+4); BAIL_ON_CENTERIS_ERROR(ceError); ceError = DJSpawnProcess(ppszArgs[0], ppszArgs, &pProcInfo); BAIL_ON_CENTERIS_ERROR(ceError); ceError = DJGetProcessStatus(pProcInfo, &status); BAIL_ON_CENTERIS_ERROR(ceError); if (status != 0) { ceError = ERROR_BAD_COMMAND; BAIL_ON_CENTERIS_ERROR(ceError); } error: if (ppszArgs) CTFreeStringArray(ppszArgs, nArgs); if (pProcInfo) FreeProcInfo(pProcInfo); return ceError; }
static DWORD DJConfigureDHCPService( PSTR pszComputerName ) { DWORD ceError = ERROR_SUCCESS; int EE = 0; BOOLEAN bFileExists = FALSE; PSTR dhcpFilePath = "/etc/sysconfig/network/dhcp"; PSTR ppszArgs[] = { "/bin/sed", "s/^.*\\(DHCLIENT_SET_HOSTNAME\\).*=.*$/\\1=\\\"no\\\"/", dhcpFilePath, NULL }; #if !defined(HAVE_SETHOSTNAME) || !HAVE_DECL_SETHOSTNAME PSTR ppszNetArgs[] = { #if defined(_AIX) "/etc/rc.d/init.d/network", #else "/etc/init.d/network", #endif "restart", NULL }; #endif PPROCINFO pProcInfo = NULL; LONG status = 0; PSTR pszFinalPath = NULL; PSTR pszTmpPath = NULL; ceError = CTCheckFileExists(dhcpFilePath, &bFileExists); CLEANUP_ON_DWORD_EE(ceError, EE); if (bFileExists) { ceError = CTGetFileTempPath( dhcpFilePath, &pszFinalPath, &pszTmpPath); CLEANUP_ON_DWORD_EE(ceError, EE); ppszArgs[2] = pszFinalPath; ceError = DJSpawnProcessOutputToFile(ppszArgs[0], ppszArgs, pszTmpPath, &pProcInfo); CLEANUP_ON_DWORD_EE(ceError, EE); ceError = DJGetProcessStatus(pProcInfo, &status); CLEANUP_ON_DWORD_EE(ceError, EE); if (status != 0) { ceError = ERROR_FAIL_RESTART; CLEANUP_ON_DWORD_EE(ceError, EE); } ceError = CTSafeReplaceFile(pszFinalPath, pszTmpPath); CLEANUP_ON_DWORD_EE(ceError, EE); } if (pProcInfo) { FreeProcInfo(pProcInfo); pProcInfo = NULL; } #if defined(HAVE_SETHOSTNAME) && HAVE_DECL_SETHOSTNAME if (sethostname(pszComputerName, strlen(pszComputerName)) < 0) { ceError = LwMapErrnoToLwError(errno); CLEANUP_ON_DWORD_EE(ceError, EE); } #else ceError = DJFixNetworkManagerOnlineTimeout(); CLEANUP_ON_DWORD_EE(ceError, EE); /* Restart network */ ceError = DJSpawnProcess(ppszNetArgs[0], ppszNetArgs, &pProcInfo); CLEANUP_ON_DWORD_EE(ceError, EE); ceError = DJGetProcessStatus(pProcInfo, &status); CLEANUP_ON_DWORD_EE(ceError, EE); if (status != 0) { ceError = ERROR_BAD_COMMAND; CLEANUP_ON_DWORD_EE(ceError, EE); } #endif cleanup: if (pProcInfo) FreeProcInfo(pProcInfo); DJ_LOG_VERBOSE("DJRestartDHCPService LEAVE -> 0x%08x (EE = %d)", ceError, EE); CT_SAFE_FREE_STRING(pszFinalPath); CT_SAFE_FREE_STRING(pszTmpPath); return ceError; }
static DWORD SetHPUXHostname(PSTR pszComputerName) { DWORD ceError = ERROR_SUCCESS; PPROCINFO pProcInfo = NULL; PSTR *ppszArgs = NULL; DWORD nArgs = 6; CHAR szBuf[512]; LONG status = 0; DJ_LOG_INFO("Setting hostname to [%s]", pszComputerName); ceError = CTAllocateMemory(sizeof(PSTR)*nArgs, PPCAST(&ppszArgs)); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTAllocateString("/bin/sh", ppszArgs); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTAllocateString("-c", ppszArgs+1); BAIL_ON_CENTERIS_ERROR(ceError); memset(szBuf, 0, sizeof(szBuf)); snprintf(szBuf, sizeof(szBuf), "/usr/bin/sed s/HOSTNAME=\\\"[a-zA-Z0-9].*\\\"/HOSTNAME=\\\"%s\\\"/ %s > %s.new", pszComputerName, NETCONF, NETCONF); ceError = CTAllocateString(szBuf, ppszArgs+2); BAIL_ON_CENTERIS_ERROR(ceError); ceError = DJSpawnProcess(ppszArgs[0], ppszArgs, &pProcInfo); BAIL_ON_CENTERIS_ERROR(ceError); ceError = DJGetProcessStatus(pProcInfo, &status); BAIL_ON_CENTERIS_ERROR(ceError); if (status != 0) { ceError = ERROR_BAD_COMMAND; BAIL_ON_CENTERIS_ERROR(ceError); } memset(szBuf, 0, sizeof(szBuf)); snprintf(szBuf, sizeof(szBuf), "%s.new", NETCONF); ceError = CTMoveFile(szBuf, NETCONF); BAIL_ON_CENTERIS_ERROR(ceError); CTFreeStringArray(ppszArgs, nArgs); ppszArgs = NULL; FreeProcInfo(pProcInfo); pProcInfo = NULL; /* After updating the file, HP-UX wants us to "start" the hostname */ ceError = CTAllocateMemory(sizeof(PSTR)*nArgs, PPCAST(&ppszArgs)); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTAllocateString("/sbin/init.d/hostname", ppszArgs); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTAllocateString("start", ppszArgs + 1); BAIL_ON_CENTERIS_ERROR(ceError); ceError = DJSpawnProcess(ppszArgs[0], ppszArgs, &pProcInfo); BAIL_ON_CENTERIS_ERROR(ceError); ceError = DJGetProcessStatus(pProcInfo, &status); BAIL_ON_CENTERIS_ERROR(ceError); if (status != 0) { ceError = ERROR_BAD_COMMAND; BAIL_ON_CENTERIS_ERROR(ceError); } error: if(ppszArgs) CTFreeStringArray(ppszArgs, nArgs); if(pProcInfo) FreeProcInfo(pProcInfo); return ceError; }
static DWORD DJSetSearchPath( SearchPolicyType searchPolicyType ) { DWORD ceError = ERROR_SUCCESS; PPROCINFO pProcInfo = NULL; PSTR* ppszArgs = NULL; DWORD nArgs = 7; LONG status = 0; DJ_LOG_INFO("Setting search policy to %s", searchPolicyType == CSPSearchPath ? "Custom path" : "Automatic"); ceError = CTAllocateMemory(sizeof(PSTR)*nArgs, (PVOID*)(PVOID)&ppszArgs); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTAllocateString("/usr/bin/dscl", ppszArgs); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTAllocateString("/Search", ppszArgs+1); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTAllocateString("-create", ppszArgs+2); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTAllocateString("/", ppszArgs+3); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTAllocateString("SearchPolicy", ppszArgs+4); BAIL_ON_CENTERIS_ERROR(ceError); switch (searchPolicyType) { case CSPSearchPath: { ceError = CTAllocateString("CSPSearchPath", ppszArgs+5); BAIL_ON_CENTERIS_ERROR(ceError); break; } case NSPSearchPath: { ceError = CTAllocateString("NSPSearchPath", ppszArgs+5); BAIL_ON_CENTERIS_ERROR(ceError); break; } } ceError = DJSpawnProcess(ppszArgs[0], ppszArgs, &pProcInfo); BAIL_ON_CENTERIS_ERROR(ceError); ceError = DJGetProcessStatus(pProcInfo, &status); BAIL_ON_CENTERIS_ERROR(ceError); if (status != 0) { ceError = ERROR_BAD_COMMAND; BAIL_ON_CENTERIS_ERROR(ceError); } error: if (ppszArgs) { CTFreeStringArray(ppszArgs, nArgs); } if (pProcInfo) { FreeProcInfo(pProcInfo); } return ceError; }
/* Remove DSPlugin from the authenticator list */ static DWORD DJUnregisterDSPlugin() { DWORD ceError = ERROR_SUCCESS; PPROCINFO pProcInfo = NULL; PSTR* ppszArgs = NULL; DWORD nArgs = 7; LONG status = 0; DJ_LOG_INFO("Unregistering DSPlugin from Open Directory Authentication"); ceError = CTAllocateMemory(sizeof(PSTR)*nArgs, (PVOID*)(PVOID)&ppszArgs); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTAllocateString("/usr/bin/dscl", ppszArgs); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTAllocateString("/Search", ppszArgs+1); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTAllocateString("-delete", ppszArgs+2); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTAllocateString("/", ppszArgs+3); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTAllocateString("CSPSearchPath", ppszArgs+4); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTAllocateString(LWDSPLUGIN_NAME, ppszArgs+5); BAIL_ON_CENTERIS_ERROR(ceError); ceError = DJSpawnProcess(ppszArgs[0], ppszArgs, &pProcInfo); BAIL_ON_CENTERIS_ERROR(ceError); ceError = DJGetProcessStatus(pProcInfo, &status); BAIL_ON_CENTERIS_ERROR(ceError); if (status != 0) { ceError = ERROR_REGISTRY_IO_FAILED; BAIL_ON_CENTERIS_ERROR(ceError); } ceError = DJSetSearchPath(NSPSearchPath); BAIL_ON_CENTERIS_ERROR(ceError); error: if (ppszArgs) { CTFreeStringArray(ppszArgs, nArgs); } if (pProcInfo) { FreeProcInfo(pProcInfo); } return ceError; }
/* Use dscl to place the DSPlugin in the authenticator list */ static DWORD DJRegisterDSPlugin() { DWORD ceError = ERROR_SUCCESS; PPROCINFO pProcInfo = NULL; PSTR* ppszArgs = NULL; DWORD nArgs = 7; LONG status = 0; DWORD retryCount = 3; DJ_LOG_INFO("Registering DSPlugin for Macintosh Directory Services Authentication"); ceError = DJSetSearchPath(CSPSearchPath); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTAllocateMemory(sizeof(PSTR)*nArgs, (PVOID*)(PVOID)&ppszArgs); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTAllocateString("/usr/bin/dscl", ppszArgs); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTAllocateString("/Search", ppszArgs+1); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTAllocateString("-append", ppszArgs+2); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTAllocateString("/", ppszArgs+3); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTAllocateString("CSPSearchPath", ppszArgs+4); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTAllocateString(LWDSPLUGIN_NAME, ppszArgs+5); BAIL_ON_CENTERIS_ERROR(ceError); while (retryCount) { ceError = DJSpawnProcess(ppszArgs[0], ppszArgs, &pProcInfo); BAIL_ON_CENTERIS_ERROR(ceError); ceError = DJGetProcessStatus(pProcInfo, &status); BAIL_ON_CENTERIS_ERROR(ceError); if (status == 0) { goto error; } if (pProcInfo) { FreeProcInfo(pProcInfo); pProcInfo = NULL; } retryCount--; sleep(5); // Set last error ceError = ERROR_REGISTRY_IO_FAILED; } error: if (ppszArgs) { CTFreeStringArray(ppszArgs, nArgs); } if (pProcInfo) { FreeProcInfo(pProcInfo); } return ceError; }