+ if(setsockopt(dd, SOL_HCI, HCI_FILTER, &nf, sizeof(nf))<0){
+ printf("some problem with setsockopt: %d",dd);
+ return -1;
+ }
+
+ if(hci_send_command(dd, p_req)<0){
+ printf("some problems with sending command: %d",dd);
+ goto fail;
+ }
+
+ try_count= 30;
+
+ while(try_count--){
+ int sign=0;
+ printf("try %d \n",try_count);
+ evt_cmd_complete *cc;
+ evt_cmd_status *cs;
+ evt_remote_name_req_complete *rnrc;
+ remote_name_req_cp *cpar;
+ inquiry_info_with_rssi *p_res_ev;
+ bt_address *p_actual;
+
+ if(timeout){
+ struct pollfd p;
+ int n;
+
+ p.fd = dd; p.events = POLLIN;
+ while((n = poll(&p, 1, timeout)) < 0){ //pool return 1 when there are some incoming data
+ if(errno == EAGAIN || errno == EINTR)
+ continue;
+ perror("Problem with poll");
+ goto fail;
+ }
+
+ if (!n) { //time out pool return 0
+ errno = ETIMEDOUT;
+ perror("Poll return 0 timeout");
+ printf("exited pool timeout \n ");
+ goto fail;
+ }
+
+ timeout -= 10;
+ if(timeout < 0) timeout = 0;
+
+ }
+ printf("Timeout after round is: %d \n",timeout);
+
+ while((len=read(dd, recbuf, sizeof(recbuf)))<0){
+ if(errno == EAGAIN || errno == EINTR)
+ continue;
+ perror("Problem with cmd reading");
+ goto fail;
+ }
+ printf("Count of received bytes %d \n ",len);
+ for(j=0;j<len;j++){
+ printf("%2.2X ",recbuf[j]);
+ }
+ printf("\n");
+ p_hdr = (void *) (recbuf + 1);
+ p_recbuf = recbuf + (1 + HCI_EVENT_HDR_SIZE);
+ len -= (1 + HCI_EVENT_HDR_SIZE);
+
+ switch(p_hdr->evt){
+ case EVT_CMD_STATUS:
+ cs = (void *) p_recbuf;
+ if(cs->opcode != *(p_req->p_OCF_OGF))
+ continue;
+ if(p_req->event != EVT_CMD_STATUS){
+ if(cs->status){ // if there is something except 0 it is error
+ errno = EIO;
+ perror("Some error state has occured on receive");
+ goto fail;
+ }
+ break;
+ }
+ p_req->retcmdp_len = min(len, p_req->retcmdp_len);
+ memcpy(p_req->p_retcmdp, p_recbuf, p_req->retcmdp_len);
+ goto succes;
+
+ case EVT_CMD_COMPLETE:
+ cc = (void *) p_recbuf;
+ if(cc->opcode != *(p_req->p_OCF_OGF))
+ continue;
+ p_recbuf += EVT_CMD_COMPLETE_SIZE;
+ len -= EVT_CMD_COMPLETE_SIZE;
+
+ p_req->retcmdp_len = min(len, p_req->retcmdp_len);
+ memcpy(p_req->p_retcmdp, p_recbuf, p_req->retcmdp_len);
+ printf("retcmdp lenght: %d \n",p_req->retcmdp_len);
+ goto succes;
+
+ case EVT_REMOTE_NAME_REQ_COMPLETE:
+ if(p_hdr->evt != p_req->event)
+ break;
+ rnrc = (void *) p_recbuf;
+ cpar = p_req->p_cmdp;
+
+ if(bacmp(&rnrc->bdaddr, &cpar->bdaddr))
+ continue;
+
+ p_req->retcmdp_len = min(len, p_req->retcmdp_len);
+ memcpy(p_req->p_retcmdp, p_recbuf, p_req->retcmdp_len);
+ goto succes;
+
+ case EVT_INQUIRY_RESULT_WITH_RSSI:
+ printf("bingo inquiry result RSSI event \n");
+ p_recbuf = recbuf + (1 + HCI_EVENT_HDR_SIZE + 1);// one byte set forward
+ p_res_ev = (void *) p_recbuf;
+ p_actual = &(p_res_ev->bdaddr);
+ //todo:involve signal strength
+ if(count==0){ //array is empty
+ *(bt_address*)(p_req->p_retcmdp)= *p_actual;
+ count++;
+ }
+ else{
+ for(j=0;j<count;j++){
+ if(compare_bda(p_actual,(bt_address *)(p_req->p_retcmdp+(j*sizeof(bt_address)))) == 1){
+ sign=1;
+ } //im looking for all array members an compare with actual address
+ }
+ if(!sign){ // if in array address doesnt exist i will add it to array
+ *(bt_address*)(p_req->p_retcmdp+(count*sizeof(bt_address)))= *p_actual;
+ count++;
+ }
+ }
+
+ //printf("type %2.2X \n",((hci_inquiry_result_RSSI_ev *)p_req->p_retcmdp)->RSSI_array);
+ break;
+ //goto succes;
+
+ case EVT_INQUIRY_COMPLETE:
+ if(p_hdr->evt != p_req->event)
+ break;
+ if(*p_recbuf != 0)
+ goto fail;
+ printf("bingo inquiry complete event \n");
+ p_req->retcmdp_len=count; //count of diferent remote decices
+
+ goto succes;
+
+ case EVT_CONN_COMPLETE:
+ if(p_hdr->evt != p_req->event)
+ break;
+ if(*p_recbuf != 0)
+ goto fail;
+ printf("bingo two devices were connected");
+ p_req->retcmdp_len = min(len, p_req->retcmdp_len);
+ memcpy(p_req->p_retcmdp, p_recbuf, p_req->retcmdp_len);
+ goto succes;
+
+ default:
+ if(p_hdr->evt != p_req->event)
+ break;
+ p_req->retcmdp_len = min(len, p_req->retcmdp_len);
+ memcpy(p_req->p_retcmdp, p_recbuf, p_req->retcmdp_len);
+ goto succes;
+ }
+