static int create_service_thread(const char* service_name, void (*func)(int, void*), void* cookie) { int s[2]; if (adb_socketpair(s)) { printf("cannot create service socket pair\n"); return -1; } D("socketpair: (%d,%d)", s[0], s[1]); #if !ADB_HOST if (func == &file_sync_service) { // Set file sync service socket to maximum size int max_buf = LINUX_MAX_SOCKET_SIZE; adb_setsockopt(s[0], SOL_SOCKET, SO_SNDBUF, &max_buf, sizeof(max_buf)); adb_setsockopt(s[1], SOL_SOCKET, SO_SNDBUF, &max_buf, sizeof(max_buf)); } #endif // !ADB_HOST stinfo* sti = reinterpret_cast<stinfo*>(malloc(sizeof(stinfo))); if (sti == nullptr) { fatal("cannot allocate stinfo"); } sti->service_name = service_name; sti->func = func; sti->cookie = cookie; sti->fd = s[1]; std::thread(service_bootstrap_func, sti).detach(); D("service thread started, %d:%d",s[0], s[1]); return s[0]; }
static void ss_listener_event_func(int _fd, unsigned ev, void *_l) { if (ev & FDE_READ) { int fd = adb_socket_accept(_fd, nullptr, nullptr); if (fd < 0) return; int rcv_buf_size = CHUNK_SIZE; adb_setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &rcv_buf_size, sizeof(rcv_buf_size)); asocket* s = create_local_socket(fd); if (s) { connect_to_smartsocket(s); return; } adb_close(fd); } }
static void ss_listener_event_func(int _fd, unsigned ev, void *_l) { if (ev & FDE_READ) { sockaddr_storage ss; sockaddr* addrp = reinterpret_cast<sockaddr*>(&ss); socklen_t alen = sizeof(ss); int fd = adb_socket_accept(_fd, addrp, &alen); if (fd < 0) return; int rcv_buf_size = CHUNK_SIZE; adb_setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &rcv_buf_size, sizeof(rcv_buf_size)); asocket* s = create_local_socket(fd); if (s) { connect_to_smartsocket(s); return; } adb_close(fd); } }