blob: 480c05e4d15327084d07508fe82eaae5181534d2 [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
Paul Stewartf65320c2011-10-13 14:34:52 -07005#include "shill/sockets.h"
6
7#include <errno.h>
8#include <fcntl.h>
9#include <net/if.h>
10#include <stdio.h>
Darin Petkove0a312e2011-07-20 13:45:28 -070011#include <sys/ioctl.h>
Darin Petkov633ac6f2011-07-08 13:56:13 -070012#include <sys/socket.h>
13#include <unistd.h>
14
Christopher Wileyb691efd2012-08-09 13:51:51 -070015#include "shill/logging.h"
Darin Petkov633ac6f2011-07-08 13:56:13 -070016
17namespace shill {
18
19Sockets::~Sockets() {}
20
Paul Stewartf65320c2011-10-13 14:34:52 -070021int Sockets::Accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) {
22 return accept(sockfd, addr, addrlen);
23}
24
Paul Stewartac1328e2012-07-20 11:55:40 -070025int Sockets::AttachFilter(int sockfd, struct sock_fprog *pf) {
26 return setsockopt(sockfd, SOL_SOCKET, SO_ATTACH_FILTER, pf, sizeof(*pf));
27}
28
Darin Petkov633ac6f2011-07-08 13:56:13 -070029int Sockets::Bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen) {
30 return bind(sockfd, addr, addrlen);
31}
32
Paul Stewartf65320c2011-10-13 14:34:52 -070033int Sockets::BindToDevice(int sockfd, const std::string &device) {
34 char dev_name[IFNAMSIZ];
35 CHECK_GT(sizeof(dev_name), device.length());
36 memset(&dev_name, 0, sizeof(dev_name));
37 snprintf(dev_name, sizeof(dev_name), "%s", device.c_str());
38 return setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE, &dev_name,
39 sizeof(dev_name));
40}
41
Darin Petkov633ac6f2011-07-08 13:56:13 -070042int Sockets::Close(int fd) {
43 return close(fd);
44}
45
Paul Stewartf65320c2011-10-13 14:34:52 -070046int Sockets::Connect(int sockfd, const struct sockaddr *addr,
47 socklen_t addrlen) {
48 return connect(sockfd, addr, addrlen);
49}
50
51int Sockets::Error() {
52 return errno;
53}
54
55std::string Sockets::ErrorString() {
56 return std::string(strerror(Error()));
57}
58
59int Sockets::GetSockName(int sockfd,
60 struct sockaddr *addr,
61 socklen_t *addrlen) {
62 return getsockname(sockfd, addr, addrlen);
63}
64
65
66int Sockets::GetSocketError(int sockfd) {
67 int error;
68 socklen_t optlen = sizeof(error);
69 if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &optlen) == 0) {
70 return error;
71 }
72 return -1;
73}
74
75
Darin Petkove0a312e2011-07-20 13:45:28 -070076int Sockets::Ioctl(int d, int request, void *argp) {
77 return ioctl(d, request, argp);
78}
79
Paul Stewartf65320c2011-10-13 14:34:52 -070080int Sockets::Listen(int sockfd, int backlog) {
81 return listen(sockfd, backlog);
82}
83
Paul Stewartac1328e2012-07-20 11:55:40 -070084ssize_t Sockets::RecvFrom(int sockfd, void *buf, size_t len, int flags,
85 struct sockaddr *src_addr, socklen_t *addrlen) {
86 return recvfrom(sockfd, buf, len, flags, src_addr, addrlen);
87}
88
Darin Petkov633ac6f2011-07-08 13:56:13 -070089ssize_t Sockets::Send(int sockfd, const void *buf, size_t len, int flags) {
90 return send(sockfd, buf, len, flags);
91}
92
93ssize_t Sockets::SendTo(int sockfd, const void *buf, size_t len, int flags,
94 const struct sockaddr *dest_addr, socklen_t addrlen) {
95 return sendto(sockfd, buf, len, flags, dest_addr, addrlen);
96}
97
Paul Stewartf65320c2011-10-13 14:34:52 -070098int Sockets::SetNonBlocking(int sockfd) {
99 return fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFL) | O_NONBLOCK);
100}
101
Darin Petkov633ac6f2011-07-08 13:56:13 -0700102int Sockets::Socket(int domain, int type, int protocol) {
103 return socket(domain, type, protocol);
104}
105
Darin Petkove0a312e2011-07-20 13:45:28 -0700106ScopedSocketCloser::ScopedSocketCloser(Sockets *sockets, int fd)
107 : sockets_(sockets),
108 fd_(fd) {}
109
110ScopedSocketCloser::~ScopedSocketCloser() {
111 sockets_->Close(fd_);
112 fd_ = -1;
113}
114
Darin Petkov633ac6f2011-07-08 13:56:13 -0700115} // namespace shill