blob: 2fd69c387d195bfc5fc633698c2185717eaec096 [file] [log] [blame]
// Copyright 2019 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef PATCHPANEL_SOCKET_H_
#define PATCHPANEL_SOCKET_H_
#include <netinet/ip.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <memory>
#include <string>
#include <base/files/scoped_file.h>
#include <base/macros.h>
#include <brillo/brillo_export.h>
namespace patchpanel {
// Wrapper around various syscalls used for socket communications.
class BRILLO_EXPORT Socket {
public:
Socket(int family, int type);
explicit Socket(base::ScopedFD fd);
Socket(const Socket&) = delete;
Socket& operator=(const Socket&) = delete;
virtual ~Socket() = default;
bool Bind(const struct sockaddr* addr, socklen_t addrlen);
bool Connect(const struct sockaddr* addr, socklen_t addrlen);
bool Listen(int backlog) const;
std::unique_ptr<Socket> Accept(struct sockaddr* addr = nullptr,
socklen_t* addrlen = nullptr) const;
ssize_t SendTo(const void* data,
size_t len,
const struct sockaddr* addr = nullptr,
socklen_t addrlen = 0);
ssize_t RecvFrom(void* data,
size_t len,
struct sockaddr* addr = nullptr,
socklen_t addrlen = 0);
int fd() const { return fd_.get(); }
// Releases the underlying fd rendering the Socket instance invalid.
int release() { return fd_.release(); }
private:
base::ScopedFD fd_;
};
BRILLO_EXPORT std::ostream& operator<<(std::ostream& stream,
const Socket& socket);
} // namespace patchpanel
#endif // PATCHPANEL_SOCKET_H_