kaddress_t* knet_channel_ref_get_peer_address(kchannel_ref_t* channel_ref) { verify(channel_ref); if (channel_ref->ref_info->peer_address) { return channel_ref->ref_info->peer_address; } channel_ref->ref_info->peer_address = knet_address_create(); socket_getpeername(channel_ref, channel_ref->ref_info->peer_address); return channel_ref->ref_info->peer_address; }
/* ** addr, port, err = socket.getpeername(fd) */ static int lsocket_getpeername(lua_State *L) { int fd = luaL_checkinteger(L, 1); char addr[INET6_ADDRSTRLEN]; int port = 0; int err = socket_getpeername(fd, addr, &port); if (err == 0) { lua_pushstring(L, addr); lua_pushinteger(L, port); } else { lua_pushnil(L); lua_pushnil(L); } lua_pushinteger(L, err); return 3; }
int ksocket_getpeername(ksocket_t ks, struct sockaddr *addr, socklen_t *addrlen, struct cred *cr) { struct sonode *so; /* All Solaris components should pass a cred for this operation. */ ASSERT(cr != NULL); if (!KSOCKET_VALID(ks)) return (ENOTSOCK); so = KSTOSO(ks); if (addrlen == NULL || (addr == NULL && *addrlen != 0)) return (EFAULT); return (socket_getpeername(so, addr, addrlen, B_FALSE, cr)); }
int ksocket_accept(ksocket_t ks, struct sockaddr *addr, socklen_t *addrlenp, ksocket_t *nks, struct cred *cr) { int error; struct sonode *nso = NULL; /* All Solaris components should pass a cred for this operation. */ ASSERT(cr != NULL); *nks = NULL; if (!KSOCKET_VALID(ks)) return (ENOTSOCK); if (addr != NULL && addrlenp == NULL) return (EFAULT); error = socket_accept(KSTOSO(ks), KSOCKET_FMODE(ks), cr, &nso); if (error != 0) return (error); ASSERT(nso != NULL); nso->so_mode |= SM_KERNEL; if (addr != NULL && addrlenp != NULL) { error = socket_getpeername(nso, addr, addrlenp, B_TRUE, cr); if (error != 0) { (void) socket_close(nso, 0, cr); socket_destroy(nso); return ((error == ENOTCONN) ? ECONNABORTED : error); } } *nks = SOTOKS(nso); return (error); }