/* Memory info: Caller must free 'buf' parameter on success Callers do not need to free buf on function failure */ int32 psGetFileBuf(psPool_t *pool, const char *fileName, unsigned char **buf, int32 *bufLen) { DWORD dwAttributes; HANDLE hFile; int32 size; DWORD tmp = 0; *bufLen = 0; *buf = NULL; dwAttributes = GetFileAttributesA(fileName); if (dwAttributes != 0xFFFFFFFF && dwAttributes & FILE_ATTRIBUTE_DIRECTORY) { psTraceStrCore("Unable to find %s\n", (char*)fileName); return PS_PLATFORM_FAIL; } if ((hFile = CreateFileA(fileName, GENERIC_READ, FILE_SHARE_READ && FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE) { psTraceStrCore("Unable to open %s\n", (char*)fileName); return PS_PLATFORM_FAIL; } /* * Get the file size. */ size = GetFileSize(hFile, NULL); *buf = psMalloc(pool, size + 1); if (*buf == NULL) { CloseHandle(hFile); return PS_MEM_FAIL; } memset(*buf, 0x0, size + 1); while (*bufLen < size) { if (ReadFile(hFile, *buf + *bufLen, (size-*bufLen > 512 ? 512 : size-*bufLen), &tmp, NULL) == FALSE) { psFree(*buf); psTraceStrCore("Unable to read %s\n", (char*)fileName); CloseHandle(hFile); return PS_PLATFORM_FAIL; } *bufLen += (int32)tmp; } CloseHandle(hFile); return PS_SUCCESS; }
/* Memory info: Caller must free 'buf' parameter on success Callers do not need to free buf on function failure */ int32 psGetFileBuf(psPool_t *pool, const char *fileName, unsigned char **buf, int32 *bufLen) { FILE *fp; struct stat fstat; size_t tmp = 0; *bufLen = 0; *buf = NULL; if (fileName == NULL) { return PS_ARG_FAIL; } if ((stat(fileName, &fstat) != 0) || (fp = fopen(fileName, "r")) == NULL) { psTraceStrCore("Unable to open %s\n", (char*)fileName); return PS_PLATFORM_FAIL; } *buf = psMalloc(pool, (size_t)(fstat.st_size + 1)); if (*buf == NULL) { return PS_MEM_FAIL; } memset(*buf, 0x0, (size_t)fstat.st_size + 1); while (((tmp = fread(*buf + *bufLen, sizeof(char), 512, fp)) > 0) && (*bufLen < fstat.st_size)) { *bufLen += (int32)tmp; } fclose(fp); return PS_SUCCESS; }
int32 psGetFileBuf(psPool_t *pool, const char *fileName, unsigned char **buf, int32 *bufLen) { FILE *fp; *bufLen = 0; *buf = NULL; if (fileName == NULL) { return PS_ARG_FAIL; } if ((fp = fopen(fileName, "r")) == NULL) { psTraceStrCore("Unable to open %s\n", (char *) fileName); return PS_PLATFORM_FAIL; } return psGetFileBufFp(pool, fp, buf, bufLen); }