mirror of
				https://github.com/telekom-security/tpotce.git
				synced 2025-10-30 20:12:53 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			106 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|    p0f - API query code
 | |
|    --------------------
 | |
| 
 | |
|    Copyright (C) 2012 by Michal Zalewski <lcamtuf@coredump.cx>
 | |
| 
 | |
|    Distributed under the terms and conditions of GNU LGPL.
 | |
| 
 | |
|  */
 | |
| 
 | |
| #define _FROM_API
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| #include <unistd.h>
 | |
| 
 | |
| #include "types.h"
 | |
| #include "config.h"
 | |
| #include "debug.h"
 | |
| #include "alloc-inl.h"
 | |
| #include "p0f.h"
 | |
| #include "api.h"
 | |
| #include "process.h"
 | |
| #include "readfp.h"
 | |
| 
 | |
| /* Process API queries. */
 | |
| 
 | |
| void handle_query(struct p0f_api_query* q, struct p0f_api_response* r) {
 | |
| 
 | |
|   struct host_data* h;
 | |
| 
 | |
|   memset(r, 0, sizeof(struct p0f_api_response));
 | |
| 
 | |
|   r->magic = P0F_RESP_MAGIC;
 | |
| 
 | |
|   if (q->magic != P0F_QUERY_MAGIC) {
 | |
| 
 | |
|     WARN("Query with bad magic (0x%x).", q->magic);
 | |
| 
 | |
|     r->status = P0F_STATUS_BADQUERY;
 | |
| 
 | |
|     return;
 | |
| 
 | |
|   }
 | |
| 
 | |
|   switch (q->addr_type) {
 | |
| 
 | |
|     case P0F_ADDR_IPV4:
 | |
|     case P0F_ADDR_IPV6:
 | |
|       h = lookup_host(q->addr, q->addr_type);
 | |
|       break;
 | |
| 
 | |
|     default:
 | |
| 
 | |
|       WARN("Query with unknown address type %u.\n", q->addr_type);
 | |
|       r->status = P0F_STATUS_BADQUERY;
 | |
|       return;
 | |
| 
 | |
|   }
 | |
| 
 | |
|   if (!h) {
 | |
|     r->status = P0F_STATUS_NOMATCH;
 | |
|     return;
 | |
|   }
 | |
| 
 | |
|   r->status     = P0F_STATUS_OK;
 | |
|   r->first_seen = h->first_seen;
 | |
|   r->last_seen  = h->last_seen;
 | |
|   r->total_conn = h->total_conn;
 | |
| 
 | |
|   if (h->last_name_id != -1) {
 | |
| 
 | |
|     strncpy((char*)r->os_name, (char*)fp_os_names[h->last_name_id],
 | |
|             P0F_STR_MAX + 1);
 | |
| 
 | |
|     if (h->last_flavor)
 | |
|        strncpy((char*)r->os_flavor, (char*)h->last_flavor, P0F_STR_MAX + 1);
 | |
| 
 | |
|   }
 | |
| 
 | |
|   if (h->http_name_id != -1) {
 | |
| 
 | |
|     strncpy((char*)r->http_name, (char*)fp_os_names[h->http_name_id],
 | |
|             P0F_STR_MAX + 1);
 | |
| 
 | |
|     if (h->http_flavor)
 | |
|       strncpy((char*)r->http_flavor, (char*)h->http_flavor, P0F_STR_MAX + 1);
 | |
| 
 | |
|   }
 | |
| 
 | |
|   if (h->link_type)
 | |
|     strncpy((char*)r->link_type, (char*)h->link_type, P0F_STR_MAX + 1);
 | |
| 
 | |
|   if (h->language)
 | |
|     strncpy((char*)r->language, (char*)h->language, P0F_STR_MAX + 1);
 | |
| 
 | |
|   r->bad_sw      = h->bad_sw;
 | |
|   r->last_nat    = h->last_nat;
 | |
|   r->last_chg    = h->last_chg;
 | |
|   r->up_mod_days = h->up_mod_days;
 | |
|   r->distance    = h->distance;
 | |
|   r->os_match_q  = h->last_quality;
 | |
| 
 | |
|   if (h->last_up_min != -1) r->uptime_min = h->last_up_min;
 | |
| 
 | |
| }
 | 
