void id_process(int fd, short revents, void *data){ int err; unsigned char *b; struct sockaddr_rc addr_them; char cmd[100]; socklen_t addrLength = sizeof(addr_them); struct connectioninfo *ci; UNUSED(data); if(revents&POLLHUP || revents&POLLNVAL){ close(fd); removefd(head, fd); return; } err = getpeername(fd, (struct sockaddr *)&addr_them, &addrLength); if(err < 0){ perror("failed to get socket name"); exit(-1); } b = addr_them.rc_bdaddr.b; sprintf(cmd, "hcitool name %02x:%02x:%02x:%02x:%02x:%02x", b[5], b[4], b[3], b[2], b[1], b[0]); FILE *f = popen(cmd, "r"); ci = malloc(sizeof(struct connectioninfo)); ci->socket = fd; ci->pipe = f; memcpy(&ci->addr_them, &addr_them, sizeof(struct sockaddr_rc)); addfd(head, fileno(f), POLLIN, id_greeting, ci); }
void service::close_conn(bool real_close) { if(real_close&&(m_sockfd!=-1)) { removefd(m_epollfd,m_sockfd); m_sockfd=-1; m_user_count--; } }
void id_greeting(int fd, short revents, void *data){ int err; unsigned char *a, *b; struct sockaddr_rc addr; char buffer[1024]; char name[100]; socklen_t addrLength = sizeof(addr); struct connectioninfo *ci; if(revents&POLLHUP || revents&POLLNVAL){ close(fd); removefd(head, fd); return; } ci = (struct connectioninfo *)data; err = getsockname(ci->socket, (struct sockaddr *)&addr, &addrLength); if(err < 0){ perror("failed to get socket name"); exit(-1); } a = addr.rc_bdaddr.b; b = ci->addr_them.rc_bdaddr.b; err = fscanf(ci->pipe, "%s", name); removefd(head, fd); pclose(ci->pipe); sprintf(buffer, "%02x:%02x:%02x:%02x:%02x:%02x %d %s %02x:%02x:%02x:%02x:%02x:%02x %d\n", a[5], a[4], a[3], a[2], a[1], a[0], addr.rc_channel, name, b[5], b[4], b[3], b[2], b[1], b[0], ci->addr_them.rc_channel); if(write(ci->socket, buffer, strlen(buffer)) < 0){ perror("Failed to write greeting"); } printf("%s", buffer); free(ci); }
void l2_process(int fd, short revents, void *data){ char buff[1024]; UNUSED(data); if(revents&POLLHUP || revents&POLLNVAL){ close(fd); removefd(head, fd); return; } int size = read(fd, buff, 1024); printf("%d: Read: %d bytes\n", fd, size); size = write(fd, buff, size); printf("%d: Wrote: %d bytes\n", fd, size); }