| 642 | } |
| 643 | |
| 644 | int |
| 645 | sbsetopt(struct socket *so, int cmd, u_long cc) |
| 646 | { |
| 647 | struct sockbuf *sb; |
| 648 | short *flags; |
| 649 | u_int *hiwat, *lowat; |
| 650 | int error; |
| 651 | |
| 652 | sb = NULL; |
| 653 | SOCK_LOCK(so); |
| 654 | if (SOLISTENING(so)) { |
| 655 | switch (cmd) { |
| 656 | case SO_SNDLOWAT: |
| 657 | case SO_SNDBUF: |
| 658 | lowat = &so->sol_sbsnd_lowat; |
| 659 | hiwat = &so->sol_sbsnd_hiwat; |
| 660 | flags = &so->sol_sbsnd_flags; |
| 661 | break; |
| 662 | case SO_RCVLOWAT: |
| 663 | case SO_RCVBUF: |
| 664 | lowat = &so->sol_sbrcv_lowat; |
| 665 | hiwat = &so->sol_sbrcv_hiwat; |
| 666 | flags = &so->sol_sbrcv_flags; |
| 667 | break; |
| 668 | } |
| 669 | } else { |
| 670 | switch (cmd) { |
| 671 | case SO_SNDLOWAT: |
| 672 | case SO_SNDBUF: |
| 673 | sb = &so->so_snd; |
| 674 | break; |
| 675 | case SO_RCVLOWAT: |
| 676 | case SO_RCVBUF: |
| 677 | sb = &so->so_rcv; |
| 678 | break; |
| 679 | } |
| 680 | flags = &sb->sb_flags; |
| 681 | hiwat = &sb->sb_hiwat; |
| 682 | lowat = &sb->sb_lowat; |
| 683 | SOCKBUF_LOCK(sb); |
| 684 | } |
| 685 | |
| 686 | error = 0; |
| 687 | switch (cmd) { |
| 688 | case SO_SNDBUF: |
| 689 | case SO_RCVBUF: |
| 690 | if (SOLISTENING(so)) { |
| 691 | if (cc > sb_max_adj) { |
| 692 | error = ENOBUFS; |
| 693 | break; |
| 694 | } |
| 695 | *hiwat = cc; |
| 696 | if (*lowat > *hiwat) |
| 697 | *lowat = *hiwat; |
| 698 | } else { |
| 699 | if (!sbreserve_locked(sb, cc, so, curthread)) |
| 700 | error = ENOBUFS; |
| 701 | } |
no test coverage detected