diff options
author | kevlo <kevlo@FreeBSD.org> | 2012-12-07 02:22:48 +0000 |
---|---|---|
committer | kevlo <kevlo@FreeBSD.org> | 2012-12-07 02:22:48 +0000 |
commit | c71d2848847b4dc9d08aee9ab683b44b1f9a6d19 (patch) | |
tree | 89e9a7026108e164c61a88d1df7cb49389545776 /sys/kern/uipc_socket.c | |
parent | 71dd34a67c96f1199178861ca3bf33b48f8fbaf5 (diff) | |
download | FreeBSD-src-c71d2848847b4dc9d08aee9ab683b44b1f9a6d19.zip FreeBSD-src-c71d2848847b4dc9d08aee9ab683b44b1f9a6d19.tar.gz |
- according to POSIX, make socket(2) return EAFNOSUPPORT rather than
EPROTONOSUPPORT if the address family is not supported.
- introduce pffinddomain() to find a domain by family and use it as
appropriate.
Reviewed by: glebius
Diffstat (limited to 'sys/kern/uipc_socket.c')
-rw-r--r-- | sys/kern/uipc_socket.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c index 2d84afe..432ec80 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -425,7 +425,16 @@ socreate(int dom, struct socket **aso, int type, int proto, else prp = pffindtype(dom, type); - if (prp == NULL || prp->pr_usrreqs->pru_attach == NULL || + if (prp == NULL) { + /* No support for domain. */ + if (pffinddomain(dom) == NULL) + return (EAFNOSUPPORT); + /* No support for socket type. */ + if (proto == 0 && type != 0) + return (EPROTOTYPE); + return (EPROTONOSUPPORT); + } + if (prp->pr_usrreqs->pru_attach == NULL || prp->pr_usrreqs->pru_attach == pru_attach_notsupp) return (EPROTONOSUPPORT); |