blob: 6605b3bd1b6d7aed6e3a7e8e4e0b24c39a354caf [file] [log] [blame]
Garrick Evans3cbac7c2019-04-18 15:31:31 +09001// Copyright 2019 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Garrick Evans3388a032020-03-24 11:25:55 +09005#ifndef PATCHPANEL_SOCKET_H_
6#define PATCHPANEL_SOCKET_H_
Garrick Evans3cbac7c2019-04-18 15:31:31 +09007
8#include <netinet/ip.h>
9#include <sys/socket.h>
10#include <sys/types.h>
11
12#include <memory>
13#include <string>
14
15#include <base/files/scoped_file.h>
Andreea Costinas74f45d22020-03-13 10:29:31 +010016#include <brillo/brillo_export.h>
Garrick Evans3cbac7c2019-04-18 15:31:31 +090017
Garrick Evans3388a032020-03-24 11:25:55 +090018namespace patchpanel {
Garrick Evans3cbac7c2019-04-18 15:31:31 +090019
20// Wrapper around various syscalls used for socket communications.
Andreea Costinas74f45d22020-03-13 10:29:31 +010021class BRILLO_EXPORT Socket {
Garrick Evans3cbac7c2019-04-18 15:31:31 +090022 public:
23 Socket(int family, int type);
24 explicit Socket(base::ScopedFD fd);
Qijiang Fan6bc59e12020-11-11 02:51:06 +090025 Socket(const Socket&) = delete;
26 Socket& operator=(const Socket&) = delete;
27
Garrick Evans3cbac7c2019-04-18 15:31:31 +090028 virtual ~Socket() = default;
29
Garrick Evansfa872f62019-05-28 16:49:25 +090030 bool Bind(const struct sockaddr* addr, socklen_t addrlen);
31 bool Connect(const struct sockaddr* addr, socklen_t addrlen);
Garrick Evans3cbac7c2019-04-18 15:31:31 +090032 bool Listen(int backlog) const;
33 std::unique_ptr<Socket> Accept(struct sockaddr* addr = nullptr,
34 socklen_t* addrlen = nullptr) const;
35
Garrick Evans1cce71a2019-06-21 10:43:14 +090036 ssize_t SendTo(const void* data,
37 size_t len,
38 const struct sockaddr* addr = nullptr,
39 socklen_t addrlen = 0);
Garrick Evans3cbac7c2019-04-18 15:31:31 +090040 ssize_t RecvFrom(void* data,
41 size_t len,
42 struct sockaddr* addr = nullptr,
43 socklen_t addrlen = 0);
44
Hugo Benichida86b2b2021-08-19 14:08:05 +090045 bool is_valid() const { return fd_.is_valid(); }
46
Garrick Evans3cbac7c2019-04-18 15:31:31 +090047 int fd() const { return fd_.get(); }
48
Andreea Costinasfd7f66b2020-04-12 21:38:37 +020049 // Releases the underlying fd rendering the Socket instance invalid.
50 int release() { return fd_.release(); }
51
Garrick Evans3cbac7c2019-04-18 15:31:31 +090052 private:
53 base::ScopedFD fd_;
Garrick Evans3cbac7c2019-04-18 15:31:31 +090054};
55
Andreea Costinas29080492020-03-23 09:22:09 +010056BRILLO_EXPORT std::ostream& operator<<(std::ostream& stream,
57 const Socket& socket);
Garrick Evans3cbac7c2019-04-18 15:31:31 +090058
Garrick Evans3388a032020-03-24 11:25:55 +090059} // namespace patchpanel
Garrick Evans3cbac7c2019-04-18 15:31:31 +090060
Garrick Evans3388a032020-03-24 11:25:55 +090061#endif // PATCHPANEL_SOCKET_H_