| // |
| // Copyright (C) 2012 The Android Open Source Project |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| // |
| |
| #ifndef SHILL_NET_SOCKETS_H_ |
| #define SHILL_NET_SOCKETS_H_ |
| |
| #include <linux/filter.h> |
| #include <netinet/in.h> |
| #include <sys/socket.h> |
| #include <sys/types.h> |
| |
| #include <string> |
| |
| #include <base/compiler_specific.h> |
| #include <base/macros.h> |
| |
| #include "shill/net/shill_export.h" |
| |
| namespace shill { |
| |
| // A "sys/socket.h" abstraction allowing mocking in tests. |
| class SHILL_EXPORT Sockets { |
| public: |
| Sockets(); |
| virtual ~Sockets(); |
| |
| static const int kInvalidFileDescriptor = -1; |
| |
| // accept |
| virtual int Accept(int sockfd, |
| struct sockaddr* addr, |
| socklen_t* addrlen) const; |
| |
| // getsockopt(sockfd, SOL_SOCKET, SO_ATTACH_FILTER, ...) |
| virtual int AttachFilter(int sockfd, struct sock_fprog* pf) const; |
| |
| // bind |
| virtual int Bind(int sockfd, |
| const struct sockaddr* addr, |
| socklen_t addrlen) const; |
| |
| // setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE ...) |
| virtual int BindToDevice(int sockfd, const std::string& device) const; |
| |
| // setsockopt(s, SOL_SOCKET, SO_REUSEADDR, ...) |
| virtual int ReuseAddress(int sockfd) const; |
| |
| // setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, ...) |
| virtual int AddMulticastMembership(int sockfd, in_addr_t addr) const; |
| |
| // close |
| virtual int Close(int fd) const; |
| |
| // connect |
| virtual int Connect(int sockfd, |
| const struct sockaddr* addr, |
| socklen_t addrlen) const; |
| |
| // errno |
| virtual int Error() const; |
| |
| // errno |
| virtual std::string ErrorString() const; |
| |
| // getsockname |
| virtual int GetSockName(int sockfd, |
| struct sockaddr* addr, |
| socklen_t* addrlen) const; |
| |
| // getsockopt(sockfd, SOL_SOCKET, SO_ERROR, ...) |
| virtual int GetSocketError(int sockfd) const; |
| |
| // ioctl |
| virtual int Ioctl(int d, int request, void* argp) const; |
| |
| // listen |
| virtual int Listen(int sockfd, int backlog) const; |
| |
| // recvfrom |
| virtual ssize_t RecvFrom(int sockfd, void* buf, size_t len, int flags, |
| struct sockaddr* src_addr, socklen_t* addrlen) const; |
| |
| // select |
| virtual int Select(int nfds, |
| fd_set* readfds, |
| fd_set* writefds, |
| fd_set* exceptfds, |
| struct timeval* timeout) const; |
| |
| // send |
| virtual ssize_t Send(int sockfd, |
| const void* buf, |
| size_t len, |
| int flags) const; |
| |
| // sendto |
| virtual ssize_t SendTo(int sockfd, |
| const void* buf, |
| size_t len, |
| int flags, |
| const struct sockaddr* dest_addr, |
| socklen_t addrlen) const; |
| |
| // fcntl(sk, F_SETFL, fcntl(sk, F_GETFL) | O_NONBLOCK) |
| virtual int SetNonBlocking(int sockfd) const; |
| |
| // setsockopt(SO_RCVBUFFORCE) |
| virtual int SetReceiveBuffer(int sockfd, int size) const; |
| |
| // shutdown |
| virtual int ShutDown(int sockfd, int how) const; |
| |
| // socket |
| virtual int Socket(int domain, int type, int protocol) const; |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(Sockets); |
| }; |
| |
| class SHILL_EXPORT ScopedSocketCloser { |
| public: |
| ScopedSocketCloser(Sockets* sockets, int fd); |
| ~ScopedSocketCloser(); |
| |
| // Release and return the socket file descriptor, allowing the socket to |
| // remain open as the ScopedSocketCloser is destroyed. |
| int Release() WARN_UNUSED_RESULT; |
| |
| private: |
| Sockets* sockets_; |
| int fd_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ScopedSocketCloser); |
| }; |
| |
| } // namespace shill |
| |
| #endif // SHILL_NET_SOCKETS_H_ |