diff --git a/interfaces/inner_api/syscap_interface.c b/interfaces/inner_api/syscap_interface.c index 8b239c274e8904cd3946dc67a8bcdd33a661d832..dfa453e6d6ec31da9bfe8a3b98818b0546143cfb 100644 --- a/interfaces/inner_api/syscap_interface.c +++ b/interfaces/inner_api/syscap_interface.c @@ -13,16 +13,18 @@ * limitations under the License. */ -#include -#include -#include -#include #include +#include +#include +#include +#include #include +#include +#include #include "syscap_interface.h" -#define PCID_OUT_BUFFER 32 #define MAX_SYSCAP_STR_LEN 128 +#define MAX_PRISYSCAP_COUNT 32 #define PRINT_ERR(...) \ do { \ @@ -30,38 +32,161 @@ printf(__VA_ARGS__); \ } while (0) -bool EncodeOsSyscap(int output[32]) +static char *inputFile = "/system/etc/PCID.sc"; + +static void FreeContextBuffer(char *contextBuffer) { - uint8_t *outputArray = (uint8_t *)malloc(sizeof(int) * PCID_OUT_BUFFER); - if (outputArray == NULL) { - PRINT_ERR("malloc failed."); - return false; - } - (void)memset_s(outputArray, sizeof(int) * PCID_OUT_BUFFER, 0, sizeof(int) * PCID_OUT_BUFFER); + (void)free(contextBuffer); +} - uint16_t countBytes = PCID_OUT_BUFFER * sizeof(int); - for (uint16_t i = 0; i < countBytes; i++) { - outputArray[i] |= 0XFF; +static uint32_t GetFileContext(char **contextBufPtr, uint32_t *bufferLen) +{ + uint32_t ret; + FILE *fp = NULL; + struct stat statBuf; + char *contextBuffer = NULL; + ret = stat(inputFile, &statBuf); + if (ret != 0) { + PRINT_ERR("get file(%s) st_mode failed, errno = %d\n", inputFile, errno); + return -1; } - int ret = memcpy_s(output, sizeof(int) * PCID_OUT_BUFFER, outputArray, sizeof(int) * PCID_OUT_BUFFER); + if (!(statBuf.st_mode & S_IRUSR)) { + PRINT_ERR("don't have permission to read the file(%s)\n", inputFile); + return -1; + } + contextBuffer = (char *)malloc(statBuf.st_size + 1); + if (contextBuffer == NULL) { + PRINT_ERR("malloc buffer failed, size = %d, errno = %d\n", (int32_t)statBuf.st_size + 1, errno); + return -1; + } + fp = fopen(inputFile, "rb"); + if (fp == NULL) { + PRINT_ERR("open file(%s) failed, errno = %d\n", inputFile, errno); + FreeContextBuffer(contextBuffer); + return -1; + } + ret = fread(contextBuffer, statBuf.st_size, 1, fp); + if (ret != 1) { + PRINT_ERR("read file(%s) failed, errno = %d\n", inputFile, errno); + FreeContextBuffer(contextBuffer); + (void)fclose(fp); + return -1; + } + contextBuffer[statBuf.st_size] = '\0'; + (void)fclose(fp); + + *contextBufPtr = contextBuffer; + *bufferLen = statBuf.st_size + 1; + return 0; +} + +bool EncodeOsSyscap(int **output) +{ + int32_t ret; + int32_t res; + char *contextBuffer = NULL; + char *outputStr = NULL; + uint32_t bufferLen; + + ret = GetFileContext(&contextBuffer, &bufferLen); if (ret != 0) { - PRINT_ERR("memcpy_s failed."); - free(outputArray); + PRINT_ERR("GetFileContext failed, input file : rk3568.sc\n"); return false; } - free(outputArray); + outputStr = (char *)malloc(MAX_SYSCAP_STR_LEN); + if (outputStr == NULL) { + PRINT_ERR("malloc buffer failed, size = %d, errno = %d\n", MAX_SYSCAP_STR_LEN, errno); + return false; + } + (void)memset_s(outputStr, MAX_SYSCAP_STR_LEN, 0, MAX_SYSCAP_STR_LEN); + res = strcpy_s(outputStr, MAX_SYSCAP_STR_LEN, contextBuffer); + if (res != 0) { + PRINT_ERR("strcpy_s failed."); + FreeContextBuffer(contextBuffer); + return false; + } + + FreeContextBuffer(contextBuffer); + *output = outputStr; return true; } -bool EncodePrivateSyscap(char *output, int *outputLen) +bool EncodePrivateSyscap(char **output, int *outputLen) { - static char syscapStr[MAX_SYSCAP_STR_LEN] = "Systemcapability.Ai.AiEngine"; - int ret = strcpy_s(output, MAX_SYSCAP_STR_LEN, syscapStr); + int32_t ret; + int32_t res; + char *contextBuffer = NULL; + char *outputStr = NULL; + uint32_t bufferLen; + + ret = GetFileContext(&contextBuffer, &bufferLen); if (ret != 0) { + PRINT_ERR("GetFileContext failed, input file : rk3568.sc\n"); + return false; + } + + *outputLen = bufferLen - MAX_SYSCAP_STR_LEN - 1; + outputStr = (char *)malloc(*outputLen ); + if (outputStr == NULL) { + PRINT_ERR("malloc buffer failed, size = %d, errno = %d\n", *outputLen, errno); + return false; + } + (void)memset_s(outputStr, *outputLen, 0, *outputLen); + res = strncpy_s(output, *outputLen + 1, contextBuffer + MAX_SYSCAP_STR_LEN, *outputLen); + if (res != 0) { PRINT_ERR("strcpy_s failed."); + FreeContextBuffer(contextBuffer); + return false; + } + + FreeContextBuffer(contextBuffer); + *output = outputStr; + return true; +} + +bool DecodeOsSyscap(int input[32], char ***output, int *outputCnt) +{ + return true; +} + +bool DecodePrivateSyscap(char *input, char ***output, int *outputCnt) +{ + char **outputArray = NULL; + char *inputStr = input; + int32_t outcharLen = 0; + int32_t ret; + uint32_t bufferLen; + *outputCnt = 0; + + while(NULL != inputStr){ + if(*inputStr = ',') + *outputCnt++; + } + bufferLen = MAX_SYSCAP_STR_LEN*(*outputCnt); + outputArray = (char **)malloc(bufferLen); + if (outputArray == NULL) { + PRINT_ERR("malloc buffer failed, size = %d, errno = %d\n", bufferLen, errno); + *outputCnt = 0; return false; } - *outputLen = strlen(syscapStr); + (void)memset_s(outputArray, bufferLen, 0, bufferLen); + + while(inputStr != NULL){ + while(*inputStr != ','){ + outcharLen ++; + } + ret = strcpy_s(*outputArray, outcharLen, inputStr); + if (ret != 0) { + PRINT_ERR("strcpy_s failed."); + *outputCnt = 0; + free(outputArray); + return false; + } + inputStr = inputStr + outcharLen; + outputArray++; + outcharLen = 0; + } + **output = outputArray; return true; } \ No newline at end of file diff --git a/interfaces/inner_api/syscap_interface.h b/interfaces/inner_api/syscap_interface.h index 1649a960d0f4a8b276e6be3292c590527ecd42e0..781936356e7e64874b510da5429546056e3ca5b1 100644 --- a/interfaces/inner_api/syscap_interface.h +++ b/interfaces/inner_api/syscap_interface.h @@ -33,11 +33,10 @@ typedef struct ProductCompatibilityIDHead { uint32_t manufacturerID; } PCIDHead; // to do - -bool EncodeOsSyscap(int output[32]); -bool DecodeOsSyscap(int input[32], char **output, int *outputCnt, int** outputLen); -bool EncodePrivateSyscap(char *output, int *outputLen); -bool DecodePrivateSyscap(char *input, int inputLen, char *output, int *outputCnt, int **outputLen); +bool EncodeOsSyscap(int **output); +bool DecodeOsSyscap(int input[32], char ***output, int *outputCnt); +bool EncodePrivateSyscap(char **output, int *outputLen); +bool DecodePrivateSyscap(char *input, char ***output, int *outputCnt); #ifdef __cplusplus #if __cplusplus