summaryrefslogtreecommitdiff
path: root/src/libosfp.c
diff options
context:
space:
mode:
authorzhuzhenjun <[email protected]>2023-09-22 15:59:40 +0800
committerzhuzhenjun <[email protected]>2023-09-22 18:44:27 +0800
commit554867aa4e8a61eb43c6fda82c32f87f67e857d6 (patch)
tree132e8910a95be8880b41ba086219d2c717e1f1ca /src/libosfp.c
parent91e6b79afc817f06b570b48fca67d92690bb7d27 (diff)
v0.0.1
Diffstat (limited to 'src/libosfp.c')
-rw-r--r--src/libosfp.c120
1 files changed, 24 insertions, 96 deletions
diff --git a/src/libosfp.c b/src/libosfp.c
index 82a5834..ee3cc39 100644
--- a/src/libosfp.c
+++ b/src/libosfp.c
@@ -1,77 +1,8 @@
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <malloc.h>
-
-#include <linux/in.h>
-#include <linux/if_ether.h>
-#include <linux/ip.h>
-#include <linux/ipv6.h>
-#include <linux/tcp.h>
-
#include "libosfp.h"
#include "libosfp_fingerprint.h"
#include "libosfp_score_db.h"
#include "libosfp_log.h"
-#define LIBOSFP_OS_CLASS_NAME_WINDOWS "Windows"
-#define LIBOSFP_OS_CLASS_NAME_LINUX "Linux"
-#define LIBOSFP_OS_CLASS_NAME_MAC_OS "Mac OS"
-#define LIBOSFP_OS_CLASS_NAME_IOS "iOS"
-#define LIBOSFP_OS_CLASS_NAME_ANDROID "Android"
-
-#define LIBOSFP_WRITE_STRING_TO_BUF(ret, buf, size, off, ...) do { \
- ret = snprintf((char *)buf + off, \
- size - off, \
- __VA_ARGS__); \
- if (ret >= 0) { \
- if ( (off + ret) >= size) { \
- off = size - 1; \
- } else { \
- off += ret; \
- } \
- } \
- } while (0)
-
-
-const char *os_class_name[LIBOSFP_OS_CLASS_MAX] = {
- LIBOSFP_OS_CLASS_NAME_WINDOWS,
- LIBOSFP_OS_CLASS_NAME_LINUX,
- LIBOSFP_OS_CLASS_NAME_MAC_OS,
- LIBOSFP_OS_CLASS_NAME_IOS,
- LIBOSFP_OS_CLASS_NAME_ANDROID
-};
-
-libosfp_os_class_id_t libosfp_os_class_name_to_id(char *name)
-{
- libosfp_os_class_id_t os_class;
-
- if (0 == strncmp(name, LIBOSFP_OS_CLASS_NAME_WINDOWS, strlen(LIBOSFP_OS_CLASS_NAME_WINDOWS))) {
- os_class = LIBOSFP_OS_CLASS_WINDOWS;
- } else if (0 == strncmp(name, LIBOSFP_OS_CLASS_NAME_LINUX, strlen(LIBOSFP_OS_CLASS_NAME_LINUX))) {
- os_class = LIBOSFP_OS_CLASS_Linux;
- } else if (0 == strncmp(name, LIBOSFP_OS_CLASS_NAME_MAC_OS, strlen(LIBOSFP_OS_CLASS_NAME_MAC_OS))) {
- os_class = LIBOSFP_OS_CLASS_MAC_OS;
- } else if (0 == strncmp(name, LIBOSFP_OS_CLASS_NAME_IOS, strlen(LIBOSFP_OS_CLASS_NAME_IOS))) {
- os_class = LIBOSFP_OS_CLASS_IOS;
- } else if (0 == strncmp(name, LIBOSFP_OS_CLASS_NAME_ANDROID, strlen(LIBOSFP_OS_CLASS_NAME_ANDROID))) {
- os_class = LIBOSFP_OS_CLASS_ANDROID;
- } else {
- os_class = LIBOSFP_OS_CLASS_MAX;
- }
-
- return os_class;
-}
-
-const char *libosfp_os_class_id_to_name(libosfp_os_class_id_t os_class)
-{
- if (os_class < 0 || os_class >= LIBOSFP_OS_CLASS_MAX) {
- return NULL;
- }
-
- return os_class_name[os_class];
-}
-
const char *libosfp_result_likely_os_class_name_get(libosfp_result_t *result)
{
libosfp_os_class_id_t os_class;
@@ -80,50 +11,45 @@ const char *libosfp_result_likely_os_class_name_get(libosfp_result_t *result)
return NULL;
}
- os_class = result->likely_os_class;
+ os_class = result->score.likely_os_class;
if (os_class < 0 || os_class >= LIBOSFP_OS_CLASS_MAX) {
return NULL;
}
- return os_class_name[os_class];
-}
-
-unsigned int libosfp_result_likely_os_class_score_get(libosfp_result_t *result)
-{
- if (result == NULL) {
- return 0;
- }
-
- return result->likely_score;
+ return libosfp_os_class_id_to_name(os_class);
}
int libosfp_result_to_buf(libosfp_result_t *result, char *strbuf, unsigned int buf_len)
{
int ret, offset = 0, i;
+ libosfp_os_class_id_t likely_os_class;
if (result == NULL || strbuf == NULL || buf_len == 0) {
return 0;
}
+ likely_os_class = result->score.likely_os_class;
+ if (likely_os_class < 0 || likely_os_class >= LIBOSFP_OS_CLASS_MAX) {
+ return 0;
+ }
+
LIBOSFP_WRITE_STRING_TO_BUF(ret, strbuf, buf_len, offset,
"Most likely os class: %s\nLikely score: %u/100\n",
- os_class_name[result->likely_os_class], result->likely_score);
-
- LIBOSFP_WRITE_STRING_TO_BUF(ret, strbuf, buf_len, offset,"Details:\n");
+ libosfp_os_class_id_to_name(likely_os_class), result->score.likely_score);
for (i = 0; i < LIBOSFP_OS_CLASS_MAX; i++) {
LIBOSFP_WRITE_STRING_TO_BUF(ret, strbuf, buf_len, offset,"%s score: %u\n",
- os_class_name[i], result->score.os_class_score[i]);
+ libosfp_os_class_id_to_name(i), result->score.os_class_score[i]);
}
exit:
return offset;
}
-libosfp_error_code_t libosfp_header_match(libosfp_context_t *libosfp_context, unsigned char *ip_hdr, unsigned char *tcp_hdr, libosfp_result_t *result)
+libosfp_error_code_t libosfp_detect(libosfp_context_t *libosfp_context, unsigned int flags, unsigned char *ip_hdr, unsigned char *tcp_hdr, libosfp_result_t *result)
{
int ret = LIBOSFP_EINVAL;
- libosfp_fingerprint_t fp = {0};
+ libosfp_fingerprint_t fp;
if (libosfp_context == NULL || ip_hdr == NULL || tcp_hdr == NULL || result == NULL) {
goto exit;
@@ -134,7 +60,7 @@ libosfp_error_code_t libosfp_header_match(libosfp_context_t *libosfp_context, un
goto exit;
}
- ret = libosfp_score_db_score(libosfp_context, &fp, result);
+ ret = libosfp_score_db_score(libosfp_context->score_db, flags, &fp, &result->score);
if (ret != 0) {
goto exit;
}
@@ -164,20 +90,22 @@ exit:
libosfp_context_t *libosfp_context_create(char *fp_file)
{
- libosfp_context_t *libosfp_context = NULL;
-
- if (fp_file == NULL || 0 != access(fp_file, R_OK)) {
- goto exit;
- }
+ libosfp_context_t *libosfp_context;
- libosfp_context = malloc(sizeof(libosfp_context_t));
+ libosfp_context = calloc(1, sizeof(libosfp_context_t));
if (libosfp_context == NULL) {
goto exit;
}
- libosfp_context->fp_file = strdup((const char*)fp_file);
- if (libosfp_context->fp_file == NULL) {
- goto exit;
+ if (fp_file != NULL) {
+ if (0 != access(fp_file, R_OK)) {
+ goto exit;
+ }
+
+ libosfp_context->fp_file = strdup((const char*)fp_file);
+ if (libosfp_context->fp_file == NULL) {
+ goto exit;
+ }
}
libosfp_context->score_db = (void *)libosfp_score_db_create();