Exemplo n.º 1
0
int svcBrowse(uuid_t *groupToExtract)
{
	int 		status = -1, i;
	uint16_t	count = 0;
	slist_t		*searchList = NULL;
	slist_t		*attrIdList = NULL;
	slist_t		*svcRecList = NULL;
	sdpsvc_t	*svcRec;

	s_list_append(&searchList, groupToExtract);
	s_list_append_uint(&attrIdList, 0x0000ffff);
	status = sdp_search_attr_req(srvHandle, searchList, 
			RangeOfAttributes, attrIdList, 0xFFFF, &svcRecList, &count);
	s_list_free(&attrIdList);
	s_list_free(&searchList);
	//printf("Status : %d Count : %d, list: %d\n", status, count, s_list_length(svcRecList));
	
	if (status || count == 0)
		return status;

	for (i = 0; i < s_list_length(svcRecList); i++) {
		printf("==============================\n");

		svcRec = (sdpsvc_t *)s_list_nth_data(svcRecList, i);
		print_info_attr(svcRec);
		printf("------------------------------\n");

		printf("SvcRecHdl: 0x%x\n", svcRec->serviceRecordHandle);

		if (!verboseflag) {
			print_svc_class(svcRec);
			print_access_proto(svcRec);
			print_profile_desc(svcRec);
			print_group(svcRec);
		} else {
			// print detailed info
		}

		if (sdp_is_group(svcRec)) {
			uuid_t	*groupId;

			// printf("SvcRec : 0x%x is a group\n", svcRecHandle);
			printf("This is a group.\n");
			groupId = sdp_get_group_attr(svcRec);
			printf("  0x%s\n", sdp_uuid2str(groupId));
			if (sdp_uuidcmp(groupId, groupToExtract) != 0) {
				printf("Extracting it\n");
				svcBrowse(groupId);
			}
		}
	}
	sdp_free_svclist(&svcRecList);
	return status;
}
Exemplo n.º 2
0
/* signal handler, also called by AS when it wants to kill the module */
void
DeadPipe (int sig)
{
#ifdef DEBUG_ALLOCS
  int i;
#endif
  switch (sig)
    {
    case SIGSEGV:
      fprintf (stderr, "Segmentation fault in %s, please send a bug report\n", MyName);
      exit (-1);
    case SIGINT:
      fprintf (stderr, "User abort, exiting\n");
      exit (-1);
    case SIGPIPE:
      fprintf (stderr, "pipe\n");
    default:
      break;
    }
#ifdef DEBUG_ALLOCS
  s_list_free (window_list);
  for (i = 0; i < desk_count; i++)
    free (desk_names[i]);
  free (desk_names);
  print_unfreed_mem ();
#endif
  exit (0);
}
Exemplo n.º 3
0
int sdpreg_pan(struct btservice *svc)
{
	int		status = -1;
	sdpsvc_t	*svcRec;
	sdpdata_t	*attr;
	slist_t		*ptype = NULL;

	/*
	 ** First create a service record handle
	 */
	s_list_append_uint(&ptype, 0x800); 
	s_list_append_uint(&ptype, 0x806);
	svcRec = sdp_create_pan_svc(svc->profile->svc_class, ptype, 0x0000, 0x0005, 0x100);
	s_list_free(&ptype);
	if (svcRec == NULL)
		return -1;
	/* add language attribute */
	attr = sdp_set_lang_attr(svcRec);
	if (attr == NULL) {
		BTERROR("setLanguageBase failed");
		sdp_free_svc(svcRec);
		return -1;
	}
	status = sdp_add_lang(attr, 0, 0, 0);
	if (status) {
		sdp_free_svc(svcRec);
		return -1;
	}
	/* set informational attibutes */		
	status = sdp_set_info_attr(svcRec, svc->name, svc->prov, svc->desc);
	if (status != 0) {
		sdp_free_svc(svcRec);
		return -1;
	}
	status = sdp_register_service(srvHandle, svcRec);
	if (status != 0) {
		BTERROR("sdp_register_service failed");
		sdp_free_svc(svcRec);
		return -1;
	}
	svc->svcRec = svcRec;
	return 0;
}
Exemplo n.º 4
0
int cmd_pan_connect(struct command *cmd)
{
	int		err, role = AFFIX_PAN_NAP;
	BD_ADDR		bda;
	struct sockaddr_affix	saddr;

	__argv = &__argv[optind];

	if (!*__argv) {
		printf("Address missing\n");
		print_usage(cmd);
		return 1;
	}
	err = btdev_get_bda(&bda, *__argv);
	if (err) {
		printf("Incorrect address given\n");
		return 1;
	}
	if (*(++__argv)) {
		/* role */
		role = str2role(*__argv);
		if (!role) {
			fprintf(stderr, "invalid role: %s\n", *__argv);
			return 1;
		}
	}

	saddr.family = PF_AFFIX;
	saddr.bda = bda;
	saddr.devnum = HCIDEV_ANY;

#if defined(CONFIG_AFFIX_SDP)
	if (sdpmode) {
		uint16_t	ServiceID;
		uint16_t	count;
		slist_t		*searchList = NULL;
		slist_t		*attrList = NULL;
		slist_t		*svcList = NULL;
		sdpsvc_t	*svcRec;

		if (role == AFFIX_PAN_NAP)
			ServiceID = SDP_UUID_NAP;
		else if (role == AFFIX_PAN_GN)
			ServiceID = SDP_UUID_GN;
		else
			ServiceID = SDP_UUID_PANU;

		printf("Connecting to host %s ...\n", bda2str(&bda));

		/* search for service ServiceID */
		s_list_append_uuid16(&searchList, ServiceID);
		/* set attributes to find */
		s_list_append_uint(&attrList, SDP_ATTR_SERVICE_RECORD_HANDLE);
		s_list_append_uint(&attrList, SDP_ATTR_PROTO_DESC_LIST);
		err = __sdp_search_attr_req(&saddr, searchList, IndividualAttributes, attrList, 0xffff, &svcList, &count);
		s_list_destroy(&searchList);
		s_list_free(&attrList);
		if (err) {
			fprintf(stderr, "%s\n", sdp_error(err));
			return -1;
		}
		if (count == 0) {
			printf("services [%s] not found\n", val2str(sdp_service_map, ServiceID));
			return -1;
		}
		printf("Service found\n");
		svcRec = s_list_dequeue(&svcList);
		sdp_free_svc(svcRec);
		sdp_free_svclist(&svcList);
	}
#endif
	saddr.devnum = hci_devnum(btdev);
	err = affix_pan_connect(&saddr, role);
	if (err) {
		if (errno == EINVAL)
			fprintf(stderr, "Connection not allowed in this role.\n");
		else
			fprintf(stderr, "failed.\n");
	} else 
		fprintf(stderr, "connected.\n");
	return 0;
}
Exemplo n.º 5
0
int cmd_pan_discovery(struct command *cmd)
{
	int		role = AFFIX_PAN_NAP;
	int		fd, i, found = 0;
	__u32		length = 8;
	int		err;
	INQUIRY_ITEM	devs[20];
	char		*devnames[20];
	char		name[248];
	__u8		num;
	uint16_t	ServiceID;
	uint16_t	count;
	slist_t		*searchList = NULL;
	slist_t		*attrList = NULL;
	slist_t		*svcList = NULL;
	sdpsvc_t	*svcRec;
	struct sockaddr_affix	saddr;

	__argv = &__argv[optind];

	if (*__argv) {
		role = str2role(*__argv);
		if (!role) {
			fprintf(stderr, "invalid role: %s\n", *__argv);
			return 1;
		}
		if (*(++__argv))
			sscanf(*__argv, "%x", &length);
	}

	fd = hci_open(btdev);
	if (fd < 0) {
		printf("Unable to open device %s: %s\n", btdev, strerror(errno));
		return -1;
	}
	printf("Searching %d sec ...\n", length);
	err = HCI_Inquiry(fd, length, 20, devs, &num);
	if (err) {
		fprintf(stderr, "%s\n", hci_error(err));
		exit(1);
	}
	if (num == 0) {
		printf("done.\nNo devices found.\n");
	} else {
		printf("Searching done. Checking for service %s ...\n", role2str(role));
		btdev_cache_reload();
		btdev_cache_retire();
		for (i = 0; i < num; i++) {
			if (!(devs[i].Class_of_Device & HCI_COD_NETWORKING))
				continue;
			saddr.family = PF_AFFIX;
			saddr.bda = devs[i].bda;
			saddr.devnum = HCIDEV_ANY;
			printf("% 2d: %s ", ++found, bda2str(&saddr.bda));
			devs[i].Clock_Offset |= 0x8000;
			err = HCI_RemoteNameRequest(fd, &devs[i], name);
			if (!err)
				devnames[i] = strdup(name);
			else 
				devnames[i] = NULL;
			printf("(%s)... ", name);
#if defined(CONFIG_AFFIX_SDP)
			if (role == AFFIX_PAN_NAP)
				ServiceID = SDP_UUID_NAP;
			else if (role == AFFIX_PAN_GN)
				ServiceID = SDP_UUID_GN;
			else
				ServiceID = SDP_UUID_PANU;

			/* search for service ServiceID */
			s_list_append_uuid16(&searchList, ServiceID);
			/* set attributes to find */
			s_list_append_uint(&attrList, SDP_ATTR_SERVICE_RECORD_HANDLE);
			s_list_append_uint(&attrList, SDP_ATTR_PROTO_DESC_LIST);
			err = __sdp_search_attr_req(&saddr, searchList, IndividualAttributes, attrList, 0xffff, &svcList, &count);
			s_list_destroy(&searchList);
			s_list_free(&attrList);
			hci_disconnect(&saddr);
			if (err) {
				//fprintf(stderr, "%s\n", sdp_error(err));
				printf("no\n");
				continue;
			}
			if (count == 0) {
				printf("no\n");
				continue;
			}
			printf("yes\n");
			svcRec = s_list_dequeue(&svcList);
			sdp_free_svc(svcRec);
			sdp_free_svclist(&svcList);
			//hci_get_conn();
#else
			fprintf(stderr, "Affix SDP support disabled at compile time!\n");
			break;
#endif
			__btdev_cache_add(devs[i].bda, devs[i].Class_of_Device, devnames[i]);
			if (devnames[i])
				free(devnames[i]);
		}
		btdev_cache_save();
	}
	close(fd);
	return 0;
}