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;
}
예제 #2
0
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();
}