DWORD LsaInitCacheFolders( VOID ) { DWORD dwError = 0; PSTR pszCachePath = NULL; BOOLEAN bExists = FALSE; dwError = LsaSrvGetCachePath(&pszCachePath); BAIL_ON_LSA_ERROR(dwError); dwError = LsaCheckDirectoryExists( pszCachePath, &bExists); BAIL_ON_LSA_ERROR(dwError); if (!bExists) { mode_t cacheDirMode = S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH; dwError = LsaCreateDirectory(pszCachePath, cacheDirMode); BAIL_ON_LSA_ERROR(dwError); } cleanup: LW_SAFE_FREE_STRING(pszCachePath); return dwError; error: goto cleanup; }
DWORD LsaCopyDirectory( PCSTR pszSourceDirPath, uid_t ownerUid, gid_t ownerGid, PSELINUX pSELinux, PCSTR pszDestDirPath ) { DWORD dwError = 0; DIR* pDir = NULL; struct dirent* pDirEntry = NULL; struct stat statbuf = {0}; CHAR szSrcPath[PATH_MAX+1]; CHAR szDstPath[PATH_MAX+1]; PSTR pszTargetPath = NULL; PSELINUX pSELinuxLocal = NULL; if (NULL == (pDir = opendir(pszSourceDirPath))) { dwError = LwMapErrnoToLwError(errno); BAIL_ON_LSA_ERROR(dwError); } if (pSELinux == NULL) { dwError = SELinuxCreate(&pSELinuxLocal); BAIL_ON_LSA_ERROR(dwError); pSELinux = pSELinuxLocal; } while (NULL != (pDirEntry = readdir(pDir))) { if (!strcmp(pDirEntry->d_name, ".") || !strcmp(pDirEntry->d_name, "..")|| !strcmp(pDirEntry->d_name, "lost+found")) continue; memset(&statbuf, 0, sizeof(statbuf)); sprintf(szSrcPath, "%s/%s", pszSourceDirPath, pDirEntry->d_name); if (lstat(szSrcPath, &statbuf) < 0) { dwError = LwMapErrnoToLwError(errno); BAIL_ON_LSA_ERROR(dwError); } sprintf(szDstPath, "%s/%s", pszDestDirPath, pDirEntry->d_name); if (S_ISDIR(statbuf.st_mode)) { dwError = LsaCreateDirectory( szDstPath, statbuf.st_mode); BAIL_ON_LSA_ERROR(dwError); dwError = LsaChangeOwner( szDstPath, ownerUid, ownerGid); BAIL_ON_LSA_ERROR(dwError); dwError = SELinuxSetContext( szDstPath, statbuf.st_mode, pSELinux); BAIL_ON_LSA_ERROR(dwError); dwError = LsaCopyDirectory( szSrcPath, ownerUid, ownerGid, pSELinux, szDstPath); BAIL_ON_LSA_ERROR(dwError); } else if (S_ISREG(statbuf.st_mode)) { dwError = LsaCopyFileWithPerms( szSrcPath, szDstPath, statbuf.st_mode); BAIL_ON_LSA_ERROR(dwError); dwError = LsaChangeOwner( szDstPath, ownerUid, ownerGid); BAIL_ON_LSA_ERROR(dwError); dwError = SELinuxSetContext( szDstPath, statbuf.st_mode, pSELinux); BAIL_ON_LSA_ERROR(dwError); } else if (S_ISLNK(statbuf.st_mode)) { dwError = LsaGetSymlinkTarget( szSrcPath, &pszTargetPath); BAIL_ON_LSA_ERROR(dwError); dwError = LsaCreateSymlink( pszTargetPath, szDstPath); BAIL_ON_LSA_ERROR(dwError); dwError = LsaChangeOwner( szDstPath, ownerUid, ownerGid); BAIL_ON_LSA_ERROR(dwError); dwError = SELinuxSetContext( szDstPath, 0, pSELinux); BAIL_ON_LSA_ERROR(dwError); } } cleanup: if (pDir) { closedir(pDir); } if (pSELinuxLocal) { SELinuxFree(pSELinuxLocal); pSELinuxLocal = NULL; } LW_SAFE_FREE_STRING(pszTargetPath); return dwError; error: goto cleanup; }