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; }
DWORD CTCopyFileWithPerms( PCSTR pszSrcPath, PCSTR pszDstPath, mode_t dwPerms ) { DWORD ceError = ERROR_SUCCESS; PCSTR pszTmpSuffix = ".tmp_likewise"; PSTR pszTmpPath = NULL; BOOLEAN bRemoveFile = FALSE; CHAR szBuf[1024+1]; int iFd = -1; int oFd = -1; ssize_t bytesRead = 0; if (IsNullOrEmptyString(pszSrcPath) || IsNullOrEmptyString(pszDstPath)) { ceError = ERROR_INVALID_PARAMETER; BAIL_ON_CENTERIS_ERROR(ceError); } ceError = CTAllocateMemory(strlen(pszDstPath)+strlen(pszTmpSuffix)+2, (PVOID*)&pszTmpPath); BAIL_ON_CENTERIS_ERROR(ceError); strcpy(pszTmpPath, pszDstPath); strcat(pszTmpPath, pszTmpSuffix); if ((iFd = open(pszSrcPath, O_RDONLY, S_IRUSR)) < 0) { ceError = LwMapErrnoToLwError(errno); BAIL_ON_CENTERIS_ERROR(ceError); } if ((oFd = open(pszTmpPath, O_WRONLY|O_TRUNC|O_CREAT, S_IRUSR|S_IWUSR)) < 0) { ceError = LwMapErrnoToLwError(errno); BAIL_ON_CENTERIS_ERROR(ceError); } bRemoveFile = TRUE; while (1) { if ((bytesRead = read(iFd, szBuf, 1024)) < 0) { if (errno == EINTR) continue; ceError = LwMapErrnoToLwError(errno); BAIL_ON_CENTERIS_ERROR(ceError); } if (bytesRead == 0) break; if (write(oFd, szBuf, bytesRead) != bytesRead) { if (errno == EINTR) continue; ceError = LwMapErrnoToLwError(errno); BAIL_ON_CENTERIS_ERROR(ceError); } } close(iFd); iFd = -1; close(oFd); oFd = -1; ceError = CTMoveFile(pszTmpPath, pszDstPath); BAIL_ON_CENTERIS_ERROR(ceError); bRemoveFile = FALSE; ceError = CTChangePermissions(pszDstPath, dwPerms); BAIL_ON_CENTERIS_ERROR(ceError); error: if (iFd >= 0) close(iFd); if (oFd >= 0) close(oFd); if (bRemoveFile) { CTRemoveFile(pszTmpPath); } if (pszTmpPath) CTFreeString(pszTmpPath); return ceError; }