int main(int argc, char **argv){ int sock_fd; socklen_t len; struct sockaddr_un addr1, addr2; if(argc != 2){ error("Usage: unixbind <pathname>"); } sock_fd = _Socket(AF_LOCAL, SOCK_STREAM, 0); unlink(argv[1]); bzero(&addr1, sizeof(addr1)); addr1.sun_family = AF_LOCAL; strncpy(addr1.sun_path, argv[1], sizeof(addr1.sun_path)); _Bind(sock_fd, (struct sockaddr *)&addr1, SUN_LEN(&addr1)); len = sizeof(addr2); _Getsockname(sock_fd, (struct sockaddr *)&addr2, &len); printf("bound name = %s, returned len = %d\n", addr2.sun_path, len); exit(0); }
int32_t EPollServer::Listen(const std::string& host, int32_t port, int32_t backlog) { _Bind(host, port); int32_t listenfd = GetNativeSocket(); int32_t errorCode = listen(listenfd, backlog); if (-1 == errorCode) { TRACE_ERROR("Listen socket failed!"); assert(0); return errorCode; } errorCode = EPollLoop::Get()->AddEpollEvents(EPOLLIN, listenfd); if (errorCode == -1) { TRACE_ERROR("FATAL epoll_ctl: listen_sock!"); assert(0); return errorCode; } <<<<<<< HEAD
status_t UnixEndpoint::Bind(const struct sockaddr *_address) { if (_address->sa_family != AF_UNIX) RETURN_ERROR(EAFNOSUPPORT); TRACE("[%ld] %p->UnixEndpoint::Bind(\"%s\")\n", find_thread(NULL), this, ConstSocketAddress(&gAddressModule, _address).AsString().Data()); const sockaddr_un* address = (const sockaddr_un*)_address; UnixEndpointLocker endpointLocker(this); if (fState != UNIX_ENDPOINT_NOT_CONNECTED || IsBound()) RETURN_ERROR(B_BAD_VALUE); if (address->sun_path[0] == '\0') { UnixAddressManagerLocker addressLocker(gAddressManager); // internal address space (or empty address) int32 internalID; if (UnixAddress::IsEmptyAddress(*address)) internalID = gAddressManager.NextUnusedInternalID(); else internalID = UnixAddress::InternalID(*address); if (internalID < 0) RETURN_ERROR(internalID); status_t error = _Bind(internalID); if (error != B_OK) RETURN_ERROR(error); sockaddr_un* outAddress = (sockaddr_un*)&socket->address; outAddress->sun_path[0] = '\0'; sprintf(outAddress->sun_path + 1, "%05lx", internalID); outAddress->sun_len = INTERNAL_UNIX_ADDRESS_LEN; // null-byte + 5 hex digits gAddressManager.Add(this); } else { // FS address space size_t pathLen = strnlen(address->sun_path, sizeof(address->sun_path)); if (pathLen == 0 || pathLen == sizeof(address->sun_path)) RETURN_ERROR(B_BAD_VALUE); struct vnode* vnode; status_t error = vfs_create_special_node(address->sun_path, NULL, S_IFSOCK | 0644, 0, !gStackModule->is_syscall(), NULL, &vnode); if (error != B_OK) RETURN_ERROR(error == B_FILE_EXISTS ? EADDRINUSE : error); error = _Bind(vnode); if (error != B_OK) { vfs_put_vnode(vnode); RETURN_ERROR(error); } size_t addressLen = address->sun_path + pathLen + 1 - (char*)address; memcpy(&socket->address, address, addressLen); socket->address.ss_len = addressLen; UnixAddressManagerLocker addressLocker(gAddressManager); gAddressManager.Add(this); } RETURN_ERROR(B_OK); }