Ejemplo n.º 1
0
static void cleanup()
{
	divert_close();

	if (_state.s_ctl > 0)
		close(_state.s_ctl);

	if (_state.s_raw > 0)
		close(_state.s_raw);

	profile_end();
}
Ejemplo n.º 2
0
int main(int argc, char *argv[]) {
    char *dev_str;
    if (argc == 3) {
        dev_str = argv[1];
        sscanf(argv[2], "%lf", &rate);
    } else {
        puts("Usage: ./violated_wifi <dev_name> <drop_rate>");
        exit(EXIT_FAILURE);
    }

    // create a handle for divert object
    divert_t *handle = divert_create(0, 0);

    divert_set_device(handle, dev_str);

    // register signal handler to exit process gracefully
    divert_set_signal_handler(SIGINT, divert_signal_handler_stop_loop, (void *)handle);

    divert_set_callback(handle, ip_callback, handle);

    divert_update_ipfw(handle, "ip from any to any");

    // activate the divert handler
    divert_activate(handle);

    // check error message
    if (handle->errmsg[0]) {
        puts(handle->errmsg);
        exit(EXIT_FAILURE);
    }

    // call the non-blocking main loop
    divert_loop(handle, -1);

    printf("Num reused: %zu, num new allocated: %zu, num large: %zu\n",
           handle->pool->num_reuse,
           handle->pool->num_alloc,
           handle->pool->num_large);

    // clean the handle to release resources
    if (divert_close(handle) == 0) {
        puts("Successfully cleaned.");
    }

    return 0;
}