|  | /* Copyright (c) 2015 Google, Inc. | 
|  | * Barret Rhoden <brho@cs.berkeley.edu> | 
|  | * See LICENSE for details. */ | 
|  |  | 
|  | #include <errno.h> | 
|  | #include <sys/socket.h> | 
|  |  | 
|  | #include <sys/plan9_helpers.h> | 
|  |  | 
|  | static int sol_socket_sso(Rock *r, int optname, void *optval, socklen_t optlen) | 
|  | { | 
|  | switch (optname) { | 
|  | #if 0 | 
|  | /* We don't support setting any options yet */ | 
|  | case (SO_FOO): | 
|  | if (optlen < foo_len) { | 
|  | __set_errno(EINVAL); | 
|  | return -1; | 
|  | } | 
|  | r->foo = *optval; | 
|  | break; | 
|  | #endif | 
|  | default: | 
|  | __set_errno(ENOPROTOOPT); | 
|  | return -1; | 
|  | }; | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | int __setsockopt(int sockfd, int level, int optname, const __ptr_t __optval, | 
|  | socklen_t optlen) | 
|  | { | 
|  | Rock *r = _sock_findrock(sockfd, 0); | 
|  | void *optval = (void*)__optval; | 
|  | if (!r) { | 
|  | /* could be EBADF too, we can't tell */ | 
|  | __set_errno(ENOTSOCK); | 
|  | return -1; | 
|  | } | 
|  | switch (level) { | 
|  | case (SOL_SOCKET): | 
|  | return sol_socket_sso(r, optname, optval, optlen); | 
|  | default: | 
|  | __set_errno(ENOPROTOOPT); | 
|  | return -1; | 
|  | }; | 
|  | } | 
|  | weak_alias (__setsockopt, setsockopt) |