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; }
/* 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); }
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; }
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; }
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; }