* Copy a byte string from userland into an sbuf. */
| 493 | * Copy a byte string from userland into an sbuf. |
| 494 | */ |
| 495 | int |
| 496 | sbuf_bcopyin(struct sbuf *s, const void *uaddr, size_t len) |
| 497 | { |
| 498 | |
| 499 | assert_sbuf_integrity(s); |
| 500 | assert_sbuf_state(s, 0); |
| 501 | KASSERT(s->s_drain_func == NULL, |
| 502 | ("Nonsensical copyin to sbuf %p with a drain", s)); |
| 503 | |
| 504 | if (s->s_error != 0) |
| 505 | return (-1); |
| 506 | if (len == 0) |
| 507 | return (0); |
| 508 | if (len > SBUF_FREESPACE(s)) { |
| 509 | sbuf_extend(s, len - SBUF_FREESPACE(s)); |
| 510 | if (SBUF_FREESPACE(s) < len) |
| 511 | len = SBUF_FREESPACE(s); |
| 512 | } |
| 513 | if (copyin(uaddr, s->s_buf + s->s_len, len) != 0) |
| 514 | return (-1); |
| 515 | s->s_len += len; |
| 516 | |
| 517 | return (0); |
| 518 | } |
| 519 | #endif |
| 520 | |
| 521 | /* |
nothing calls this directly
no test coverage detected