blob: 3dc6a4f94593aec5679c11992f6ee686d36045f3 [file] [log] [blame]
Paul Stewartac1328e2012-07-20 11:55:40 -07001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Darin Petkov633ac6f2011-07-08 13:56:13 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef SHILL_SOCKETS_H_
6#define SHILL_SOCKETS_H_
7
Paul Stewartf65320c2011-10-13 14:34:52 -07008#include <string>
9
Paul Stewartac1328e2012-07-20 11:55:40 -070010#include <linux/filter.h>
Darin Petkovef34f182011-08-26 14:14:40 -070011#include <sys/socket.h>
Darin Petkov633ac6f2011-07-08 13:56:13 -070012#include <sys/types.h>
13
Darin Petkove0a312e2011-07-20 13:45:28 -070014#include <base/basictypes.h>
15
Darin Petkov633ac6f2011-07-08 13:56:13 -070016namespace shill {
17
18// A "sys/socket.h" abstraction allowing mocking in tests.
19class Sockets {
20 public:
21 virtual ~Sockets();
22
Paul Stewartf65320c2011-10-13 14:34:52 -070023 // accept
24 virtual int Accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
25
Paul Stewartac1328e2012-07-20 11:55:40 -070026 // getsockopt(sockfd, SOL_SOCKET, SO_ATTACH_FILTER, ...)
27 virtual int AttachFilter(int sockfd, struct sock_fprog *pf);
28
Darin Petkov633ac6f2011-07-08 13:56:13 -070029 // bind
30 virtual int Bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
31
Paul Stewartf65320c2011-10-13 14:34:52 -070032 // setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE ...)
33 virtual int BindToDevice(int sockfd, const std::string &device);
34
Darin Petkov633ac6f2011-07-08 13:56:13 -070035 // close
36 virtual int Close(int fd);
37
Paul Stewartf65320c2011-10-13 14:34:52 -070038 // connect
39 virtual int Connect(int sockfd, const struct sockaddr *addr,
40 socklen_t addrlen);
41
42 // errno
43 virtual int Error();
44
45 // errno
46 virtual std::string ErrorString();
47
48 // getsockname
49 virtual int GetSockName(int sockfd, struct sockaddr *addr,
50 socklen_t *addrlen);
51
52 // getsockopt(sockfd, SOL_SOCKET, SO_ERROR, ...)
53 virtual int GetSocketError(int sockfd);
54
Darin Petkove0a312e2011-07-20 13:45:28 -070055 // ioctl
56 virtual int Ioctl(int d, int request, void *argp);
57
Paul Stewartf65320c2011-10-13 14:34:52 -070058 // listen
59 virtual int Listen(int sockfd, int backlog);
60
Paul Stewartac1328e2012-07-20 11:55:40 -070061 // recvfrom
62 virtual ssize_t RecvFrom(int sockfd, void *buf, size_t len, int flags,
63 struct sockaddr *src_addr, socklen_t *addrlen);
64
Darin Petkov633ac6f2011-07-08 13:56:13 -070065 // send
66 virtual ssize_t Send(int sockfd, const void *buf, size_t len, int flags);
67
68 // sendto
69 virtual ssize_t SendTo(int sockfd, const void *buf, size_t len, int flags,
70 const struct sockaddr *dest_addr, socklen_t addrlen);
71
Paul Stewartf65320c2011-10-13 14:34:52 -070072 // fcntl(sk, F_SETFL, fcntl(sk, F_GETFL) | O_NONBLOCK)
73 virtual int SetNonBlocking(int sockfd);
74
Darin Petkov633ac6f2011-07-08 13:56:13 -070075 // socket
76 virtual int Socket(int domain, int type, int protocol);
77};
78
Darin Petkove0a312e2011-07-20 13:45:28 -070079class ScopedSocketCloser {
80 public:
81 ScopedSocketCloser(Sockets *sockets, int fd);
82 ~ScopedSocketCloser();
83
84 private:
85 Sockets *sockets_;
86 int fd_;
87
88 DISALLOW_COPY_AND_ASSIGN(ScopedSocketCloser);
89};
90
Darin Petkov633ac6f2011-07-08 13:56:13 -070091} // namespace shill
92
93#endif // SHILL_SOCKETS_H_