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(); }
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; }