diff options
author | Kevin Lo <kevlo@FreeBSD.org> | 2012-12-07 02:22:48 +0000 |
---|---|---|
committer | Kevin Lo <kevlo@FreeBSD.org> | 2012-12-07 02:22:48 +0000 |
commit | b08d12d9be996ead667e99f782b307631c5c666a (patch) | |
tree | 89e9a7026108e164c61a88d1df7cb49389545776 /sys/kern/uipc_socket.c | |
parent | c2654dc8fa912273267620e941ac7a5f1474fabf (diff) | |
download | src-b08d12d9be996ead667e99f782b307631c5c666a.tar.gz src-b08d12d9be996ead667e99f782b307631c5c666a.zip |
- 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
Notes
Notes:
svn path=/head/; revision=243965
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 2d84afedeecd..432ec8007361 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); |