| 514 | } |
| 515 | |
| 516 | static int |
| 517 | uipc_attach(struct socket *so, int proto, struct thread *td) |
| 518 | { |
| 519 | u_long sendspace, recvspace; |
| 520 | struct unpcb *unp; |
| 521 | int error; |
| 522 | bool locked; |
| 523 | |
| 524 | KASSERT(so->so_pcb == NULL, ("uipc_attach: so_pcb != NULL")); |
| 525 | if (so->so_snd.sb_hiwat == 0 || so->so_rcv.sb_hiwat == 0) { |
| 526 | switch (so->so_type) { |
| 527 | case SOCK_STREAM: |
| 528 | sendspace = unpst_sendspace; |
| 529 | recvspace = unpst_recvspace; |
| 530 | break; |
| 531 | |
| 532 | case SOCK_DGRAM: |
| 533 | sendspace = unpdg_sendspace; |
| 534 | recvspace = unpdg_recvspace; |
| 535 | break; |
| 536 | |
| 537 | case SOCK_SEQPACKET: |
| 538 | sendspace = unpsp_sendspace; |
| 539 | recvspace = unpsp_recvspace; |
| 540 | break; |
| 541 | |
| 542 | default: |
| 543 | panic("uipc_attach"); |
| 544 | } |
| 545 | error = soreserve(so, sendspace, recvspace); |
| 546 | if (error) |
| 547 | return (error); |
| 548 | } |
| 549 | unp = uma_zalloc(unp_zone, M_NOWAIT | M_ZERO); |
| 550 | if (unp == NULL) |
| 551 | return (ENOBUFS); |
| 552 | LIST_INIT(&unp->unp_refs); |
| 553 | UNP_PCB_LOCK_INIT(unp); |
| 554 | unp->unp_socket = so; |
| 555 | so->so_pcb = unp; |
| 556 | refcount_init(&unp->unp_refcount, 1); |
| 557 | |
| 558 | if ((locked = UNP_LINK_WOWNED()) == false) |
| 559 | UNP_LINK_WLOCK(); |
| 560 | |
| 561 | unp->unp_gencnt = ++unp_gencnt; |
| 562 | unp->unp_ino = ++unp_ino; |
| 563 | unp_count++; |
| 564 | switch (so->so_type) { |
| 565 | case SOCK_STREAM: |
| 566 | LIST_INSERT_HEAD(&unp_shead, unp, unp_link); |
| 567 | break; |
| 568 | |
| 569 | case SOCK_DGRAM: |
| 570 | LIST_INSERT_HEAD(&unp_dhead, unp, unp_link); |
| 571 | break; |
| 572 | |
| 573 | case SOCK_SEQPACKET: |
nothing calls this directly
no test coverage detected