/* * Get name of peer for connected socket. */ int sys_getpeername(struct lwp *l, const struct sys_getpeername_args *uap, register_t *retval) { /* { syscallarg(int) fdes; syscallarg(struct sockaddr *) asa; syscallarg(unsigned int *) alen; } */ struct mbuf *m; int error; error = do_sys_getpeername(SCARG(uap, fdes), &m); if (error != 0) return error; error = copyout_sockname(SCARG(uap, asa), SCARG(uap, alen), MSG_LENUSRSPACE, m); if (m != NULL) m_free(m); return error; }
static void try_set_affinity_full(const char* caller, int fd) { struct sockaddr_in sa_local, sa_peer; socklen_t sa_len; int errno_save = errno; int rc, type; T(fprintf(stderr, LPF "%s(%s(%d))\n", __FUNCTION__, caller, fd)); if( is_inet_sock(fd, &type, &sa_local) ) if( type == SOCK_STREAM || type == SOCK_DGRAM ) { sa_len = sizeof(sa_peer); rc = do_sys_getpeername(fd, (struct sockaddr*) &sa_peer, &sa_len); if( rc == 0 ) set_affinity(type, sa_local.sin_addr.s_addr, sa_local.sin_port, sa_peer.sin_addr.s_addr, sa_peer.sin_port); else if( type == SOCK_DGRAM ) /* ?? TODO: We'll sometimes want a full-match for UDP. */ set_affinity(type, sa_local.sin_addr.s_addr, sa_local.sin_port, 0, 0); } errno = errno_save; }