static int set_traps_enabled(int val, void *param) { int new_value = val ? 1 : 0; if ((!traps_enabled && new_value) || (traps_enabled && !new_value)) { if (!new_value) { /* Traps have been disabled. */ traplist_t *p; for (p = traplist; p != NULL; p = p->next) { remove_trap(p->trap); } } else { /* Traps have been enabled. */ traplist_t *p; for (p = traplist; p != NULL; p = p->next) { install_trap(p->trap); } } } traps_enabled = new_value; machine_bus_status_virtualdevices_set((unsigned int)new_value); return 0; }
int traps_remove(const trap_t *trap) { traplist_t *p = traplist, *prev = NULL; while (p) { if (p->trap->address == trap->address) { break; } prev = p; p = p->next; } if (!p) { log_error(traps_log, "Trap `%s' not found.", trap->name); return -1; } if (prev) { prev->next = p->next; } else { traplist = p->next; } lib_free(p); if (traps_enabled) { remove_trap(trap); } return 0; }
void traps_refresh(void) { if (traps_enabled) { traplist_t *p; for (p = traplist; p != NULL; p = p->next) { remove_trap(p->trap); install_trap(p->trap); } } return; }
void drakvuf_remove_trap(drakvuf_t drakvuf, drakvuf_trap_t *trap, void(*free_routine)(drakvuf_trap_t *trap)) { if ( drakvuf->in_callback) { struct free_trap_wrapper *free_wrapper = g_hash_table_lookup(drakvuf->remove_traps, &trap); if (!free_wrapper) { free_wrapper = g_malloc0(sizeof(struct free_trap_wrapper)); free_wrapper->free_routine = free_routine; free_wrapper->trap = trap; g_hash_table_insert(drakvuf->remove_traps, g_memdup(&trap, sizeof(void*)), free_wrapper); } free_wrapper->counter++; } else { remove_trap(drakvuf, trap); if(free_routine) free_routine(trap); } }