| 1524 | #endif /* COMPAT_OLDSOCK */ |
| 1525 | |
| 1526 | static int |
| 1527 | sockargs(struct mbuf **mp, char *buf, socklen_t buflen, int type) |
| 1528 | { |
| 1529 | struct sockaddr *sa; |
| 1530 | struct mbuf *m; |
| 1531 | int error; |
| 1532 | |
| 1533 | if (buflen > MLEN) { |
| 1534 | #ifdef COMPAT_OLDSOCK |
| 1535 | if (type == MT_SONAME && buflen <= 112 && |
| 1536 | SV_CURPROC_FLAG(SV_AOUT)) |
| 1537 | buflen = MLEN; /* unix domain compat. hack */ |
| 1538 | else |
| 1539 | #endif |
| 1540 | if (buflen > MCLBYTES) |
| 1541 | return (EINVAL); |
| 1542 | } |
| 1543 | m = m_get2(buflen, M_WAITOK, type, 0); |
| 1544 | m->m_len = buflen; |
| 1545 | error = copyin(buf, mtod(m, void *), buflen); |
| 1546 | if (error != 0) |
| 1547 | (void) m_free(m); |
| 1548 | else { |
| 1549 | *mp = m; |
| 1550 | if (type == MT_SONAME) { |
| 1551 | sa = mtod(m, struct sockaddr *); |
| 1552 | |
| 1553 | #if defined(COMPAT_OLDSOCK) && BYTE_ORDER != BIG_ENDIAN |
| 1554 | if (sa->sa_family == 0 && sa->sa_len < AF_MAX && |
| 1555 | SV_CURPROC_FLAG(SV_AOUT)) |
| 1556 | sa->sa_family = sa->sa_len; |
| 1557 | #endif |
| 1558 | sa->sa_len = buflen; |
| 1559 | } |
| 1560 | } |
| 1561 | return (error); |
| 1562 | } |
| 1563 | |
| 1564 | int |
| 1565 | getsockaddr(struct sockaddr **namp, const struct sockaddr *uaddr, size_t len) |