int main(void) { struct sigaction sigact; int r = 1; r = libusb_init(NULL); if (r < 0) { fprintf(stderr, "failed to initialise libusb\n"); exit(1); } r = find_dpfp_device(); if (r < 0) { fprintf(stderr, "Could not find/open device\n"); goto out; } r = libusb_claim_interface(devh, 0); if (r < 0) { fprintf(stderr, "usb_claim_interface error %d %s\n", r, strerror(-r)); goto out; } printf("claimed interface\n"); r = print_f0_data(); if (r < 0) goto out_release; r = do_init(); if (r < 0) goto out_deinit; /* async from here onwards */ sigact.sa_handler = sighandler; sigemptyset(&sigact.sa_mask); sigact.sa_flags = 0; sigaction(SIGINT, &sigact, NULL); sigaction(SIGTERM, &sigact, NULL); sigaction(SIGQUIT, &sigact, NULL); r = pthread_create(&poll_thread, NULL, poll_thread_main, NULL); if (r) goto out_deinit; r = alloc_transfers(); if (r < 0) { request_exit(1); pthread_join(poll_thread, NULL); goto out_deinit; } r = init_capture(); if (r < 0) { request_exit(1); pthread_join(poll_thread, NULL); goto out_deinit; } while (!do_exit) { pthread_mutex_lock(&exit_cond_lock); pthread_cond_wait(&exit_cond, &exit_cond_lock); pthread_mutex_unlock(&exit_cond_lock); } printf("shutting down...\n"); pthread_join(poll_thread, NULL); r = libusb_cancel_transfer(irq_transfer); if (r < 0) { request_exit(1); goto out_deinit; } r = libusb_cancel_transfer(img_transfer); if (r < 0) { request_exit(1); goto out_deinit; } while (img_transfer || irq_transfer) if (libusb_handle_events(NULL) < 0) break; if (do_exit == 1) r = 0; else r = 1; out_deinit: libusb_free_transfer(img_transfer); libusb_free_transfer(irq_transfer); set_mode(0); set_hwstat(0x80); out_release: libusb_release_interface(devh, 0); out: libusb_close(devh); libusb_exit(NULL); return r >= 0 ? r : -r; }
static int init(void) { unsigned char req_data[MAX_PACKET_LEN]; int len; int r; alloc_transfers(); wmlog_msg(2, "Continuous async read start..."); CHECK_DISCONNECTED(libusb_submit_transfer(req_transfer)); len = fill_protocol_info_req(req_data, USB_HOST_SUPPORT_SELECTIVE_SUSPEND | USB_HOST_SUPPORT_DL_SIX_BYTES_HEADER | USB_HOST_SUPPORT_UL_SIX_BYTES_HEADER | USB_HOST_SUPPORT_DL_MULTI_PACKETS); set_data(req_data, len); process_events_by_mask(500, WDS_PROTO_FLAGS); len = fill_mac_lowlevel_req(req_data); set_data(req_data, len); process_events_by_mask(500, WDS_OTHER); len = fill_init_cmd(req_data); set_data(req_data, len); len = fill_string_info_req(req_data); set_data(req_data, len); process_events_by_mask(500, WDS_CHIP | WDS_FIRMWARE); wmlog_msg(1, "Chip info: %s", wd_status.chip); wmlog_msg(1, "Firmware info: %s", wd_status.firmware); len = fill_diode_control_cmd(req_data, diode_on); set_data(req_data, len); len = fill_mac_req(req_data); set_data(req_data, len); process_events_by_mask(500, WDS_MAC); wmlog_msg(1, "MAC: %02x:%02x:%02x:%02x:%02x:%02x", wd_status.mac[0], wd_status.mac[1], wd_status.mac[2], wd_status.mac[3], wd_status.mac[4], wd_status.mac[5]); len = fill_string_info_req(req_data); set_data(req_data, len); process_events_by_mask(500, WDS_CHIP | WDS_FIRMWARE); len = fill_auth_policy_req(req_data); set_data(req_data, len); process_events_by_mask(500, WDS_OTHER); len = fill_auth_method_req(req_data); set_data(req_data, len); process_events_by_mask(500, WDS_OTHER); len = fill_auth_set_cmd(req_data, ssid); set_data(req_data, len); return 0; }