diff options
Diffstat (limited to 'src/osfp.c')
| -rw-r--r-- | src/osfp.c | 71 |
1 files changed, 48 insertions, 23 deletions
@@ -33,24 +33,18 @@ static struct osfp_result *osfp_result_build(struct osfp_os_class_score *os_clas likely_score = tmp_score; likely_os_class = i; } - result->detail.scores[i] = tmp_score; + result->details[i].score = tmp_score; sum_score += tmp_score; } if (sum_score) { for (i = 0; i < OSFP_OS_CLASS_MAX; i++) { - result->detail.possibility[i] = OSFP_PERCENTILE * result->detail.scores[i] / sum_score; + result->details[i].possibility = OSFP_PERCENTILE * result->details[i].score / sum_score; } } - result->likely_score = likely_score; - result->likely_os_class = likely_os_class; - result->likely_possibility = result->detail.possibility[likely_os_class]; - if (likely_score < OSFP_LOWEST_SCORE_LIMIT) { - result->likely_os_class = OSFP_OS_CLASS_OTHERS; - result->likely_score = 0; - result->likely_possibility = 0; + likely_os_class = OSFP_OS_CLASS_OTHERS; } else { for (i = 0; i < OSFP_OS_CLASS_MAX; i++) { if (likely_os_class == i) { @@ -62,15 +56,15 @@ static struct osfp_result *osfp_result_build(struct osfp_os_class_score *os_clas } else if (likely_os_class == OSFP_OS_CLASS_MAC_OS && i == OSFP_OS_CLASS_IOS) { continue; } else { - result->likely_os_class = OSFP_OS_CLASS_UNKNOWN; - result->likely_score = 0; - result->likely_possibility = 0; + likely_os_class = OSFP_OS_CLASS_UNKNOWN; break; } } } } + result->likely_os_class = likely_os_class; + return result; exit: return NULL; @@ -95,6 +89,7 @@ const char *osfp_result_os_name_get(struct osfp_result *result) char *osfp_result_score_detail_export(struct osfp_result *result) { int i; + char *result_str = NULL; cJSON *root = NULL; cJSON *array; cJSON *os_score; @@ -104,6 +99,7 @@ char *osfp_result_score_detail_export(struct osfp_result *result) } if (result->json_str != NULL) { + result_str = result->json_str; goto exit; } @@ -115,37 +111,35 @@ char *osfp_result_score_detail_export(struct osfp_result *result) os_score = cJSON_AddObjectToObject(root, "likely"); if (os_score) { cJSON_AddStringToObject(os_score, "name", osfp_os_class_id_to_name(result->likely_os_class)); - cJSON_AddNumberToObject(os_score, "score", result->likely_score); - //cJSON_AddNumberToObject(os_score, "possibility", result->likely_possibility); + cJSON_AddNumberToObject(os_score, "score", result->details[result->likely_os_class].score); + //cJSON_AddNumberToObject(os_score, "possibility", result->details[result->likely_os_class].possibility); } - array = cJSON_AddArrayToObject(root, "detail"); + array = cJSON_AddArrayToObject(root, "details"); if (array) { for (i = OSFP_OS_CLASS_WINDOWS; i < OSFP_OS_CLASS_OTHERS; i++) { os_score = cJSON_CreateObject(); if (os_score) { cJSON_AddStringToObject(os_score, "name", osfp_os_class_id_to_name(i)); - cJSON_AddNumberToObject(os_score, "score", result->detail.scores[i]); - //cJSON_AddNumberToObject(os_score, "possibility", result->detail.possibility[i]); + cJSON_AddNumberToObject(os_score, "score", result->details[i].score); + //cJSON_AddNumberToObject(os_score, "possibility", result->details[i].possibility); cJSON_AddItemToArray(array, os_score); } } } - result->json_str = malloc(OSFP_DEFAULT_RESULT_BUFLEN_MAX); - if (result->json_str == NULL) { + result_str = cJSON_Print(root); + if (result_str == NULL) { goto exit; } - if (!cJSON_PrintPreallocated(root, result->json_str, OSFP_DEFAULT_RESULT_BUFLEN_MAX, 1)) { - goto exit; - } + result->json_str = result_str; exit: if (root) { cJSON_Delete(root); } - return result->json_str; + return result_str; } void osfp_result_free(struct osfp_result *result) @@ -220,6 +214,37 @@ exit: return NULL; } +struct osfp_result *osfp_json_identify(struct osfp_db *db, const char *json_str) +{ + int ret = OSFP_EINVAL; + struct osfp_fingerprint fp; + struct osfp_os_class_score os_class_score; + struct osfp_result *result; + + if (db == NULL) { + goto exit; + } + + ret = osfp_fingerprint_from_json(&fp, json_str); + if (ret != 0) { + goto exit; + } + + ret = osfp_score_db_score(db->score_db, 0, &fp, &os_class_score); + if (ret != 0) { + goto exit; + } + + result = osfp_result_build(&os_class_score); + if (result == NULL) { + goto exit; + } + + return result; +exit: + return NULL; +} + struct osfp_db *osfp_db_new(const char *db_json_file) { int ret; |
