Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/uipc_sockbuf.c
Show First 20 Lines • Show All 645 Lines • ▼ Show 20 Lines | if (!chgsbsize(so->so_cred->cr_uidinfo, &sb->sb_hiwat, cc, | ||||
return (false); | return (false); | ||||
sb->sb_mbmax = min(cc * sb_efficiency, sb_max); | sb->sb_mbmax = min(cc * sb_efficiency, sb_max); | ||||
if (sb->sb_lowat > sb->sb_hiwat) | if (sb->sb_lowat > sb->sb_hiwat) | ||||
sb->sb_lowat = sb->sb_hiwat; | sb->sb_lowat = sb->sb_hiwat; | ||||
return (true); | return (true); | ||||
} | } | ||||
int | int | ||||
sbsetopt(struct socket *so, int cmd, u_long cc) | sbsetopt(struct socket *so, struct sockopt *sopt) | ||||
{ | { | ||||
struct sockbuf *sb; | struct sockbuf *sb; | ||||
sb_which wh; | sb_which wh; | ||||
short *flags; | short *flags; | ||||
u_int *hiwat, *lowat; | u_int cc, *hiwat, *lowat; | ||||
int error; | int error, optval; | ||||
error = sooptcopyin(sopt, &optval, sizeof optval, sizeof optval); | |||||
if (error != 0) | |||||
return (error); | |||||
/* | |||||
* Values < 1 make no sense for any of these options, | |||||
* so disallow them. | |||||
*/ | |||||
if (optval < 1) | |||||
return (EINVAL); | |||||
cc = optval; | |||||
sb = NULL; | sb = NULL; | ||||
SOCK_LOCK(so); | SOCK_LOCK(so); | ||||
if (SOLISTENING(so)) { | if (SOLISTENING(so)) { | ||||
switch (cmd) { | switch (sopt->sopt_name) { | ||||
case SO_SNDLOWAT: | case SO_SNDLOWAT: | ||||
case SO_SNDBUF: | case SO_SNDBUF: | ||||
lowat = &so->sol_sbsnd_lowat; | lowat = &so->sol_sbsnd_lowat; | ||||
hiwat = &so->sol_sbsnd_hiwat; | hiwat = &so->sol_sbsnd_hiwat; | ||||
flags = &so->sol_sbsnd_flags; | flags = &so->sol_sbsnd_flags; | ||||
break; | break; | ||||
case SO_RCVLOWAT: | case SO_RCVLOWAT: | ||||
case SO_RCVBUF: | case SO_RCVBUF: | ||||
lowat = &so->sol_sbrcv_lowat; | lowat = &so->sol_sbrcv_lowat; | ||||
hiwat = &so->sol_sbrcv_hiwat; | hiwat = &so->sol_sbrcv_hiwat; | ||||
flags = &so->sol_sbrcv_flags; | flags = &so->sol_sbrcv_flags; | ||||
break; | break; | ||||
} | } | ||||
} else { | } else { | ||||
switch (cmd) { | switch (sopt->sopt_name) { | ||||
case SO_SNDLOWAT: | case SO_SNDLOWAT: | ||||
case SO_SNDBUF: | case SO_SNDBUF: | ||||
sb = &so->so_snd; | sb = &so->so_snd; | ||||
wh = SO_SND; | wh = SO_SND; | ||||
break; | break; | ||||
case SO_RCVLOWAT: | case SO_RCVLOWAT: | ||||
case SO_RCVBUF: | case SO_RCVBUF: | ||||
sb = &so->so_rcv; | sb = &so->so_rcv; | ||||
wh = SO_RCV; | wh = SO_RCV; | ||||
break; | break; | ||||
} | } | ||||
flags = &sb->sb_flags; | flags = &sb->sb_flags; | ||||
hiwat = &sb->sb_hiwat; | hiwat = &sb->sb_hiwat; | ||||
lowat = &sb->sb_lowat; | lowat = &sb->sb_lowat; | ||||
SOCK_BUF_LOCK(so, wh); | SOCK_BUF_LOCK(so, wh); | ||||
} | } | ||||
error = 0; | error = 0; | ||||
switch (cmd) { | switch (sopt->sopt_name) { | ||||
case SO_SNDBUF: | case SO_SNDBUF: | ||||
case SO_RCVBUF: | case SO_RCVBUF: | ||||
if (SOLISTENING(so)) { | if (SOLISTENING(so)) { | ||||
if (cc > sb_max_adj) { | if (cc > sb_max_adj) { | ||||
error = ENOBUFS; | error = ENOBUFS; | ||||
break; | break; | ||||
} | } | ||||
*hiwat = cc; | *hiwat = cc; | ||||
▲ Show 20 Lines • Show All 1,136 Lines • Show Last 20 Lines |