Accessory* initAccessory( const char* manufacturer, const char* modelName, const char* description, const char* const* bt_uuids, const char* version, const char* uri, const char* serialNumber) { libusb_context *usb_context; if (libusb_init(&usb_context)) { fprintf(stderr,"libAndroidAccessory: Failed to init libusb-1.0\n"); return NULL; } #ifdef DEBUG libusb_set_debug(usb_context,3); #else libusb_set_debug(usb_context,2); #endif struct udev *udev = udev_new(); if (!udev) { fprintf(stderr,"libAndroidAccessory: Failed to init udev\n"); libusb_exit(usb_context); return NULL; } struct udev_monitor *udev_monitor = udev_monitor_new_from_netlink(udev,"udev"); udev_monitor_filter_add_match_subsystem_devtype(udev_monitor, "usb", "usb_device"); udev_monitor_enable_receiving(udev_monitor); Accessory* accessory = malloc(sizeof(Accessory)); accessory->manufacturer = manufacturer; accessory->modelName = modelName; accessory->description = description; accessory->bt_uuids = bt_uuids; accessory->version = version; accessory->uri = uri; accessory->serialNumber = serialNumber; accessory->usb_context = usb_context; accessory->udev_context = udev; accessory->udev_monitor = udev_monitor; accessory->bt_service = bt_listen(modelName, description, NULL, accessory->bt_uuids ); accessory->fds[0].fd = udev_monitor_get_fd(accessory->udev_monitor); accessory->fds[0].events = POLLIN; accessory->fds[0].revents = 0; if(accessory->bt_service != NULL) { accessory->fds[1].fd = bt_getFD(accessory->bt_service); accessory->fds[1].events = POLLIN; accessory->fds[1].revents = 0; } else { fprintf(stderr, "libAndroidAccessory: Not listening on bluetooth. Do you have a bt device and have sufficient permissions (added to bluetooth group) ?\n"); accessory->fds[1].fd = -1; accessory->fds[1].revents = 0; } return accessory; }
void portthread (void * port_ptr) { SOCKET s; BT_PORT port_info ; port_info = *(BT_PORT*) port_ptr ; s = bt_listen (port_info.port); if (!s) _endthread(); while (1) { socklen_t addrlen = sizeof(SOCKADDR_IN); SOCKADDR_IN addr ; SOCKET client_sock; BT_CLIENT * client ; char reason, *ip; client_sock = accept (s, (SOCKADDR*) &addr, &addrlen); if (client_sock == -1) continue; ip = inet_ntoa (addr.sin_addr); if ((reason = allow(ip)) <= 0) { switch (reason) { case 0: logevent("Refused %s:%i (filter)", ip,port_info.port); break; case -1: logevent("Refused %s:%i (connection limit)", ip,port_info.port); break; case -2: logevent("Refused %s:%i (clone limit)", ip,port_info.port); break; } bt_close(client_sock); continue; } client = addconn(ip,port_info.port); client->sock = client_sock; client->use_pass = port_info.use_pass ; if (client->use_pass) bt_cpy (client->password, port_info.password); if (_beginthread (proxythread,0,client) == -1) { logevent ("Could not create proxy thread for %s:%i", client->ip,client->port); bt_close(client->sock); delconn(client); _endthread(); } } _endthread(); }