summaryrefslogtreecommitdiff
path: root/src/osfp.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/osfp.c')
-rw-r--r--src/osfp.c71
1 files changed, 48 insertions, 23 deletions
diff --git a/src/osfp.c b/src/osfp.c
index 87685ba..c629d57 100644
--- a/src/osfp.c
+++ b/src/osfp.c
@@ -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;