19#ifndef CUTTLEFISH_COMMON_COMMON_LIBS_FS_SHARED_FD_H_
20#define CUTTLEFISH_COMMON_COMMON_LIBS_FS_SHARED_FD_H_
24#include <sys/eventfd.h>
26#include <sys/inotify.h>
29#include <sys/select.h>
30#include <sys/socket.h>
54#include <linux/vm_sockets.h>
83struct VhostUserVsockCid;
146 static SharedFD Open(
const char* pathname,
int flags, mode_t mode = 0);
147 static SharedFD Open(
const std::string& pathname,
int flags, mode_t mode = 0);
149 static SharedFD Creat(
const std::string& pathname, mode_t mode);
155 static SharedFD ShmOpen(
const std::string& name,
int oflag,
int mode);
161 std::string_view path,
int flags = O_CLOEXEC);
163 static int Poll(std::vector<PollSharedFd>& fds,
int timeout);
168 static SharedFD Socket(
int domain,
int socket_type,
int protocol);
172 int in_type,
int timeout_seconds);
175 int type, std::chrono::seconds timeout = std::chrono::seconds(0));
177 int type, std::chrono::seconds timeout = std::chrono::seconds(0));
179 int in_type, mode_t mode);
197 static SharedFD VsockServer(
unsigned int port,
int type,
198 std::optional<int> vhost_user_vsock_listening_cid,
201 int type, std::optional<int> vhost_user_vsock_listening_cid);
202 static SharedFD VsockClient(
unsigned int cid,
unsigned int port,
int type,
204 static std::string GetVhostUserVsockServerAddr(
205 unsigned int port,
int vhost_user_vsock_listening_cid);
206 static std::string GetVhostUserVsockClientAddr(
int cid);
267 operator bool()
const {
return ptr_ != MAP_FAILED; }
273 return offset <
len_ &&
len_ - offset >= length;
305 int Bind(
const struct sockaddr* addr, socklen_t addrlen);
306 int Connect(
const struct sockaddr* addr, socklen_t addrlen);
308 struct timeval* timeout);
311 bool Chmod(mode_t mode);
324 int Fcntl(
int command,
int value);
330 int GetSockName(
struct sockaddr* addr, socklen_t* addrlen);
333 unsigned int VsockServerPort();
336 int Ioctl(
int request,
void* val =
nullptr);
340 bool IsSet(fd_set* in)
const;
356 static void Log(
const char* message);
357 off_t
LSeek(off_t offset,
int whence);
358 ssize_t
Recv(
void* buf,
size_t len,
int flags);
359 ssize_t
RecvMsg(
struct msghdr* msg,
int flags);
360 ssize_t
Read(
void* buf,
size_t count);
362 int EventfdRead(eventfd_t* value);
364 ssize_t
Send(
const void* buf,
size_t len,
int flags);
365 ssize_t
SendMsg(
const struct msghdr* msg,
int flags);
367 template <
typename...
Args>
369 std::vector<int> fds;
378 void Set(fd_set* dest,
int* max_index)
const;
379 int SetSockOpt(
int level,
int optname,
const void* optval, socklen_t optlen);
380 int GetSockOpt(
int level,
int optname,
void* optval, socklen_t* optlen);
383 ScopedMMap MMap(
void* addr,
size_t length,
int prot,
int flags, off_t offset);
393 ssize_t
Write(
const void* buf,
size_t count);
395 int EventfdWrite(eventfd_t value);
399 int Futimens(
const struct timespec times[2]);
Definition: expected.h:86
Definition: shared_fd.h:294
off_t LSeek(off_t offset, int whence)
Definition: shared_fd.cpp:909
Result< void > Flock(int operation)
Definition: shared_fd.cpp:866
int Bind(const struct sockaddr *addr, socklen_t addrlen)
Definition: shared_fd.cpp:830
int ConnectWithTimeout(const struct sockaddr *addr, socklen_t addrlen, struct timeval *timeout)
Definition: shared_fd.cpp:203
ssize_t SendMsg(const struct msghdr *msg, int flags)
Definition: shared_fd.cpp:947
ssize_t Truncate(off_t length)
Definition: shared_fd.cpp:1011
void Set(fd_set *dest, int *max_index) const
Definition: shared_fd.cpp:282
ssize_t SendFileDescriptors(const void *buf, size_t len, Args &&... sent_fds)
Definition: shared_fd.h:368
virtual ~FileInstance()
Definition: shared_fd.h:300
int Futimens(const struct timespec times[2])
Definition: shared_fd.cpp:1041
static std::shared_ptr< FileInstance > ClosedInstance()
Definition: shared_fd.cpp:826
int Ioctl(int request, void *val=nullptr)
Definition: shared_fd.cpp:888
int Shutdown(int how)
Definition: shared_fd.cpp:953
bool IsSet(fd_set *in) const
Definition: shared_fd.cpp:267
bool CopyAllFrom(FileInstance &in, FileInstance *stop=nullptr)
Definition: shared_fd.cpp:165
std::string StrError() const
Definition: shared_fd.cpp:998
Result< std::string > ProcFdLinkTarget() const
bool IsRegular() const
Definition: shared_fd.h:343
void InotifyRmWatch(int watch)
Definition: shared_fd.cpp:1065
void Close()
Definition: shared_fd.cpp:176
ssize_t Send(const void *buf, size_t len, int flags)
Definition: shared_fd.cpp:941
int SetTerminalRaw()
Definition: shared_fd.cpp:973
int fd_
Definition: shared_fd.h:413
int Fcntl(int command, int value)
Definition: shared_fd.cpp:854
ssize_t RecvMsg(struct msghdr *msg, int flags)
Definition: shared_fd.cpp:921
int GetErrno() const
Definition: shared_fd.h:329
FileInstance(int fd, int in_errno)
Definition: shared_fd.cpp:1069
bool Chmod(mode_t mode)
Definition: shared_fd.cpp:197
int Connect(const struct sockaddr *addr, socklen_t addrlen)
Definition: shared_fd.cpp:836
static void Log(const char *message)
Definition: shared_fd.cpp:279
int Fsync()
Definition: shared_fd.cpp:860
ssize_t Write(const void *buf, size_t count)
Definition: shared_fd.cpp:1017
bool is_regular_file_
Definition: shared_fd.h:416
FileInstance * Accept(struct sockaddr *addr, socklen_t *addrlen) const
Definition: shared_fd.cpp:1079
int LinkAtCwd(const std::string &path)
Definition: shared_fd.cpp:894
ssize_t Read(void *buf, size_t count)
Definition: shared_fd.cpp:927
int UNMANAGED_Dup2(int newfd)
Definition: shared_fd.cpp:848
bool IsOpen() const
Definition: shared_fd.h:337
int UNMANAGED_Dup()
Definition: shared_fd.cpp:842
int GetSockOpt(int level, int optname, void *optval, socklen_t *optlen)
Definition: shared_fd.cpp:966
std::string identity_
Definition: shared_fd.h:415
int SetSockOpt(int level, int optname, const void *optval, socklen_t optlen)
Definition: shared_fd.cpp:959
ScopedMMap MMap(void *addr, size_t length, int prot, int flags, off_t offset)
Definition: shared_fd.cpp:1003
int errno_
Definition: shared_fd.h:414
int InotifyAddWatch(const std::string &pathname, uint32_t mask)
Definition: shared_fd.cpp:1061
int Listen(int backlog)
Definition: shared_fd.cpp:903
ssize_t Recv(void *buf, size_t len, int flags)
Definition: shared_fd.cpp:915
bool IsATTY()
Definition: shared_fd.cpp:1035
bool CopyFrom(FileInstance &in, size_t length, FileInstance *stop=nullptr)
Definition: shared_fd.cpp:111
int GetSockName(struct sockaddr *addr, socklen_t *addrlen)
Definition: shared_fd.cpp:873
Definition: shared_fd.h:253
bool WithinBounds(size_t offset, size_t length) const
Definition: shared_fd.h:271
void * get()
Definition: shared_fd.h:263
ScopedMMap & operator=(const ScopedMMap &other)=delete
const void * get() const
Definition: shared_fd.h:264
ScopedMMap()
Definition: shared_fd.cpp:812
ScopedMMap(const ScopedMMap &other)=delete
size_t len() const
Definition: shared_fd.h:265
~ScopedMMap()
Definition: shared_fd.cpp:820
size_t len_
Definition: shared_fd.h:278
void * ptr_
Definition: shared_fd.h:277
Definition: shared_fd.h:129
SharedFD & operator=(SharedFD const &)=default
static SharedFD ErrorFD(int error)
Definition: shared_fd.cpp:538
static SharedFD Open(const char *pathname, int flags, mode_t mode=0)
Definition: shared_fd.cpp:465
bool operator>=(const SharedFD &rhs) const
Definition: shared_fd.h:219
static int Fchdir(SharedFD)
Definition: shared_fd.cpp:484
bool operator<(const SharedFD &rhs) const
Definition: shared_fd.h:213
std::shared_ptr< FileInstance > value_
Definition: shared_fd.h:230
static SharedFD Socket(int domain, int socket_type, int protocol)
Definition: shared_fd.cpp:508
SharedFD()
Definition: shared_fd.h:428
FileInstance & operator*()
Definition: shared_fd.h:225
static Result< std::pair< SharedFD, std::string > > Mkostemp(std::string_view path, int flags=O_CLOEXEC)
Definition: shared_fd.cpp:526
static SharedFD MemfdCreate(const std::string &name, unsigned int flags=0)
Definition: shared_fd.cpp:420
SharedFD(const std::shared_ptr< FileInstance > &in)
Definition: shared_fd.h:134
static SharedFD MemfdCreateWithData(const std::string &name, const std::string &data, unsigned int flags=0)
Definition: shared_fd.cpp:426
static SharedFD Mkstemp(std::string *path)
Definition: shared_fd.cpp:517
static SharedFD Dup(int unmanaged_fd)
Definition: shared_fd.cpp:385
static SharedFD Accept(const FileInstance &listener, struct sockaddr *addr, socklen_t *addrlen)
Definition: shared_fd.cpp:375
static SharedFD Creat(const std::string &pathname, mode_t mode)
Definition: shared_fd.cpp:480
static int Poll(PollSharedFd *fds, size_t num_fds, int timeout)
Definition: shared_fd.cpp:335
bool operator<=(const SharedFD &rhs) const
Definition: shared_fd.h:215
static bool Pipe(SharedFD *fd0, SharedFD *fd1)
Definition: shared_fd.cpp:391
static Result< SharedFD > Fifo(const std::string &pathname, mode_t mode)
Definition: shared_fd.cpp:493
static bool SocketPair(int domain, int type, int protocol, SharedFD *fd0, SharedFD *fd1)
Definition: shared_fd.cpp:440
const FileInstance & operator*() const
Definition: shared_fd.h:223
std::shared_ptr< FileInstance > operator->() const
Definition: shared_fd.h:221
static SharedFD SocketLocalClient(const std::string &name, bool is_abstract, int in_type)
Definition: shared_fd.cpp:542
static SharedFD SocketClient(const std::string &host, int port, int type, std::chrono::seconds timeout=std::chrono::seconds(0))
Definition: shared_fd.cpp:579
bool operator!=(const SharedFD &rhs) const
Definition: shared_fd.h:211
bool operator>(const SharedFD &rhs) const
Definition: shared_fd.h:217
static SharedFD Socket6Client(const std::string &host, const std::string &interface, int port, int type, std::chrono::seconds timeout=std::chrono::seconds(0))
Definition: shared_fd.cpp:597
bool operator==(const SharedFD &rhs) const
Definition: shared_fd.h:209
static SharedFD InotifyFd()
Definition: shared_fd.cpp:474
static SharedFD SocketLocalServer(const std::string &name, bool is_abstract, int in_type, mode_t mode)
Definition: shared_fd.cpp:662
SharedFD(SharedFD const &)=default
Definition: shared_fd.h:238
WeakFD(SharedFD shared_fd)
Definition: shared_fd.h:240
std::weak_ptr< FileInstance > value_
Definition: shared_fd.h:247
SharedFD lock() const
Definition: shared_fd.cpp:802
#define error(format, args...)
Definition: fec_private.h:201
char data[Size]
Definition: incremental_server.cpp:1
ssize_t SendFileDescriptorVector(borrowed_fd sockfd, const void *data, size_t len, const std::vector< int > &fds)
Definition: cmsg.cpp:32
void Append(CollectionType &collection, T &&arg)
Definition: collections.h:36
Event
Definition: kernel_log_server.h:31
Definition: alloc_utils.cpp:23
std::vector< std::string_view > Args
Definition: incremental.h:28
__u32 mask
Definition: nl80211.h:0
uint8_t type
Definition: pairing_connection.h:0
Definition: shared_fd.h:419
short revents
Definition: shared_fd.h:422
short events
Definition: shared_fd.h:421
SharedFD fd
Definition: shared_fd.h:420
#define VMADDR_CID_ANY
Definition: vm_sockets.h:24