Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/sys_socket.c
Show First 20 Lines • Show All 270 Lines • ▼ Show 20 Lines | default: | ||||
if (IOCGROUP(cmd) == 'i') | if (IOCGROUP(cmd) == 'i') | ||||
error = ifioctl(so, cmd, data, td); | error = ifioctl(so, cmd, data, td); | ||||
else if (IOCGROUP(cmd) == 'r') { | else if (IOCGROUP(cmd) == 'r') { | ||||
CURVNET_SET(so->so_vnet); | CURVNET_SET(so->so_vnet); | ||||
error = rtioctl_fib(cmd, data, so->so_fibnum); | error = rtioctl_fib(cmd, data, so->so_fibnum); | ||||
CURVNET_RESTORE(); | CURVNET_RESTORE(); | ||||
} else { | } else { | ||||
CURVNET_SET(so->so_vnet); | CURVNET_SET(so->so_vnet); | ||||
error = ((*so->so_proto->pr_usrreqs->pru_control) | error = so->so_proto->pr_control(so, cmd, data, 0, td); | ||||
(so, cmd, data, 0, td)); | |||||
CURVNET_RESTORE(); | CURVNET_RESTORE(); | ||||
} | } | ||||
break; | break; | ||||
} | } | ||||
return (error); | return (error); | ||||
} | } | ||||
static int | static int | ||||
▲ Show 20 Lines • Show All 42 Lines • ▼ Show 20 Lines | if (!SOLISTENING(so)) { | ||||
sb = &so->so_snd; | sb = &so->so_snd; | ||||
SOCK_SENDBUF_LOCK(so); | SOCK_SENDBUF_LOCK(so); | ||||
if ((sb->sb_state & SBS_CANTSENDMORE) == 0) | if ((sb->sb_state & SBS_CANTSENDMORE) == 0) | ||||
ub->st_mode |= S_IWUSR | S_IWGRP | S_IWOTH; | ub->st_mode |= S_IWUSR | S_IWGRP | S_IWOTH; | ||||
SOCK_SENDBUF_UNLOCK(so); | SOCK_SENDBUF_UNLOCK(so); | ||||
} | } | ||||
ub->st_uid = so->so_cred->cr_uid; | ub->st_uid = so->so_cred->cr_uid; | ||||
ub->st_gid = so->so_cred->cr_gid; | ub->st_gid = so->so_cred->cr_gid; | ||||
error = so->so_proto->pr_usrreqs->pru_sense(so, ub); | error = so->so_proto->pr_sense(so, ub); | ||||
SOCK_UNLOCK(so); | SOCK_UNLOCK(so); | ||||
return (error); | return (error); | ||||
} | } | ||||
/* | /* | ||||
* API socket close on file pointer. We call soclose() to close the socket | * API socket close on file pointer. We call soclose() to close the socket | ||||
* (including initiating closing protocols). soclose() will sorele() the | * (including initiating closing protocols). soclose() will sorele() the | ||||
* file reference but the actual socket will not go away until the socket's | * file reference but the actual socket will not go away until the socket's | ||||
▲ Show 20 Lines • Show All 61 Lines • ▼ Show 20 Lines | if (so->so_pcb != NULL) { | ||||
kif->kf_un.kf_sock.kf_sock_sendq = | kif->kf_un.kf_sock.kf_sock_sendq = | ||||
sbused(&so->so_snd); | sbused(&so->so_snd); | ||||
kif->kf_un.kf_sock.kf_sock_recvq = | kif->kf_un.kf_sock.kf_sock_recvq = | ||||
sbused(&so->so_rcv); | sbused(&so->so_rcv); | ||||
} | } | ||||
} | } | ||||
break; | break; | ||||
} | } | ||||
error = so->so_proto->pr_usrreqs->pru_sockaddr(so, &sa); | error = so->so_proto->pr_sockaddr(so, &sa); | ||||
if (error == 0 && | if (error == 0 && | ||||
sa->sa_len <= sizeof(kif->kf_un.kf_sock.kf_sa_local)) { | sa->sa_len <= sizeof(kif->kf_un.kf_sock.kf_sa_local)) { | ||||
bcopy(sa, &kif->kf_un.kf_sock.kf_sa_local, sa->sa_len); | bcopy(sa, &kif->kf_un.kf_sock.kf_sa_local, sa->sa_len); | ||||
free(sa, M_SONAME); | free(sa, M_SONAME); | ||||
} | } | ||||
error = so->so_proto->pr_usrreqs->pru_peeraddr(so, &sa); | error = so->so_proto->pr_peeraddr(so, &sa); | ||||
if (error == 0 && | if (error == 0 && | ||||
sa->sa_len <= sizeof(kif->kf_un.kf_sock.kf_sa_peer)) { | sa->sa_len <= sizeof(kif->kf_un.kf_sock.kf_sa_peer)) { | ||||
bcopy(sa, &kif->kf_un.kf_sock.kf_sa_peer, sa->sa_len); | bcopy(sa, &kif->kf_un.kf_sock.kf_sa_peer, sa->sa_len); | ||||
free(sa, M_SONAME); | free(sa, M_SONAME); | ||||
} | } | ||||
strncpy(kif->kf_path, so->so_proto->pr_domain->dom_name, | strncpy(kif->kf_path, so->so_proto->pr_domain->dom_name, | ||||
sizeof(kif->kf_path)); | sizeof(kif->kf_path)); | ||||
CURVNET_RESTORE(); | CURVNET_RESTORE(); | ||||
▲ Show 20 Lines • Show All 375 Lines • ▼ Show 20 Lines | |||||
soo_aio_queue(struct file *fp, struct kaiocb *job) | soo_aio_queue(struct file *fp, struct kaiocb *job) | ||||
{ | { | ||||
struct socket *so; | struct socket *so; | ||||
struct sockbuf *sb; | struct sockbuf *sb; | ||||
sb_which which; | sb_which which; | ||||
int error; | int error; | ||||
so = fp->f_data; | so = fp->f_data; | ||||
error = (*so->so_proto->pr_usrreqs->pru_aio_queue)(so, job); | error = so->so_proto->pr_aio_queue(so, job); | ||||
if (error == 0) | if (error == 0) | ||||
return (0); | return (0); | ||||
/* Lock through the socket, since this may be a listening socket. */ | /* Lock through the socket, since this may be a listening socket. */ | ||||
switch (job->uaiocb.aio_lio_opcode & (LIO_WRITE | LIO_READ)) { | switch (job->uaiocb.aio_lio_opcode & (LIO_WRITE | LIO_READ)) { | ||||
case LIO_READ: | case LIO_READ: | ||||
SOCK_RECVBUF_LOCK(so); | SOCK_RECVBUF_LOCK(so); | ||||
sb = &so->so_rcv; | sb = &so->so_rcv; | ||||
Show All 28 Lines |