summaryrefslogtreecommitdiffstats
path: root/lldb/source/Host/posix/ConnectionFileDescriptorPosix.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Host/posix/ConnectionFileDescriptorPosix.cpp')
-rw-r--r--lldb/source/Host/posix/ConnectionFileDescriptorPosix.cpp87
1 files changed, 44 insertions, 43 deletions
diff --git a/lldb/source/Host/posix/ConnectionFileDescriptorPosix.cpp b/lldb/source/Host/posix/ConnectionFileDescriptorPosix.cpp
index 1e65a1eb333..c1a6284ea62 100644
--- a/lldb/source/Host/posix/ConnectionFileDescriptorPosix.cpp
+++ b/lldb/source/Host/posix/ConnectionFileDescriptorPosix.cpp
@@ -68,12 +68,13 @@ const char *ConnectionFileDescriptor::FILE_SCHEME = "file";
namespace {
-const char *GetURLAddress(const char *url, const char *scheme) {
- const auto prefix = std::string(scheme) + "://";
- if (strstr(url, prefix.c_str()) != url)
- return nullptr;
-
- return url + prefix.size();
+llvm::Optional<llvm::StringRef> GetURLAddress(llvm::StringRef url,
+ llvm::StringRef scheme) {
+ if (!url.consume_front(scheme))
+ return llvm::None;
+ if (!url.consume_front("://"))
+ return llvm::None;
+ return url;
}
}
@@ -153,48 +154,47 @@ bool ConnectionFileDescriptor::IsConnected() const {
(m_write_sp && m_write_sp->IsValid());
}
-ConnectionStatus ConnectionFileDescriptor::Connect(const char *s,
+ConnectionStatus ConnectionFileDescriptor::Connect(llvm::StringRef path,
Error *error_ptr) {
std::lock_guard<std::recursive_mutex> guard(m_mutex);
Log *log(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_CONNECTION));
if (log)
log->Printf("%p ConnectionFileDescriptor::Connect (url = '%s')",
- static_cast<void *>(this), s);
+ static_cast<void *>(this), path.str().c_str());
OpenCommandPipe();
- if (s && s[0]) {
- const char *addr = nullptr;
- if ((addr = GetURLAddress(s, LISTEN_SCHEME))) {
+ if (!path.empty()) {
+ llvm::Optional<llvm::StringRef> addr;
+ if ((addr = GetURLAddress(path, LISTEN_SCHEME))) {
// listen://HOST:PORT
- return SocketListenAndAccept(addr, error_ptr);
- } else if ((addr = GetURLAddress(s, ACCEPT_SCHEME))) {
+ return SocketListenAndAccept(*addr, error_ptr);
+ } else if ((addr = GetURLAddress(path, ACCEPT_SCHEME))) {
// unix://SOCKNAME
- return NamedSocketAccept(addr, error_ptr);
- } else if ((addr = GetURLAddress(s, UNIX_ACCEPT_SCHEME))) {
+ return NamedSocketAccept(*addr, error_ptr);
+ } else if ((addr = GetURLAddress(path, UNIX_ACCEPT_SCHEME))) {
// unix://SOCKNAME
- return NamedSocketAccept(addr, error_ptr);
- } else if ((addr = GetURLAddress(s, CONNECT_SCHEME))) {
- return ConnectTCP(addr, error_ptr);
- } else if ((addr = GetURLAddress(s, TCP_CONNECT_SCHEME))) {
- return ConnectTCP(addr, error_ptr);
- } else if ((addr = GetURLAddress(s, UDP_SCHEME))) {
- return ConnectUDP(addr, error_ptr);
- } else if ((addr = GetURLAddress(s, UNIX_CONNECT_SCHEME))) {
+ return NamedSocketAccept(*addr, error_ptr);
+ } else if ((addr = GetURLAddress(path, CONNECT_SCHEME))) {
+ return ConnectTCP(*addr, error_ptr);
+ } else if ((addr = GetURLAddress(path, TCP_CONNECT_SCHEME))) {
+ return ConnectTCP(*addr, error_ptr);
+ } else if ((addr = GetURLAddress(path, UDP_SCHEME))) {
+ return ConnectUDP(*addr, error_ptr);
+ } else if ((addr = GetURLAddress(path, UNIX_CONNECT_SCHEME))) {
// unix-connect://SOCKNAME
- return NamedSocketConnect(addr, error_ptr);
- } else if ((addr = GetURLAddress(s, UNIX_ABSTRACT_CONNECT_SCHEME))) {
+ return NamedSocketConnect(*addr, error_ptr);
+ } else if ((addr = GetURLAddress(path, UNIX_ABSTRACT_CONNECT_SCHEME))) {
// unix-abstract-connect://SOCKNAME
- return UnixAbstractSocketConnect(addr, error_ptr);
+ return UnixAbstractSocketConnect(*addr, error_ptr);
}
#ifndef LLDB_DISABLE_POSIX
- else if ((addr = GetURLAddress(s, FD_SCHEME))) {
+ else if ((addr = GetURLAddress(path, FD_SCHEME))) {
// Just passing a native file descriptor within this current process
// that is already opened (possibly from a service or other source).
- bool success = false;
- int fd = StringConvert::ToSInt32(addr, -1, 0, &success);
+ int fd = -1;
- if (success) {
+ if (!addr->getAsInteger(0, fd)) {
// We have what looks to be a valid file descriptor, but we
// should make sure it is. We currently are doing this by trying to
// get the flags from the file descriptor and making sure it
@@ -203,7 +203,8 @@ ConnectionStatus ConnectionFileDescriptor::Connect(const char *s,
int flags = ::fcntl(fd, F_GETFL, 0);
if (flags == -1 || errno == EBADF) {
if (error_ptr)
- error_ptr->SetErrorStringWithFormat("stale file descriptor: %s", s);
+ error_ptr->SetErrorStringWithFormat("stale file descriptor: %s",
+ path.str().c_str());
m_read_sp.reset();
m_write_sp.reset();
return eConnectionStatusError;
@@ -232,23 +233,23 @@ ConnectionStatus ConnectionFileDescriptor::Connect(const char *s,
m_read_sp.reset(new File(fd, false));
m_write_sp.reset(new File(fd, false));
}
- m_uri.assign(addr);
+ m_uri = *addr;
return eConnectionStatusSuccess;
}
}
if (error_ptr)
error_ptr->SetErrorStringWithFormat("invalid file descriptor: \"%s\"",
- s);
+ path.str().c_str());
m_read_sp.reset();
m_write_sp.reset();
return eConnectionStatusError;
- } else if ((addr = GetURLAddress(s, FILE_SCHEME))) {
+ } else if ((addr = GetURLAddress(path, FILE_SCHEME))) {
+ std::string addr_str = addr->str();
// file:///PATH
- const char *path = addr;
int fd = -1;
do {
- fd = ::open(path, O_RDWR);
+ fd = ::open(addr_str.c_str(), O_RDWR);
} while (fd == -1 && errno == EINTR);
if (fd == -1) {
@@ -290,7 +291,7 @@ ConnectionStatus ConnectionFileDescriptor::Connect(const char *s,
#endif
if (error_ptr)
error_ptr->SetErrorStringWithFormat("unsupported connection URL: '%s'",
- s);
+ path.str().c_str());
return eConnectionStatusError;
}
if (error_ptr)
@@ -655,7 +656,7 @@ ConnectionStatus ConnectionFileDescriptor::BytesAvailable(uint32_t timeout_usec,
}
ConnectionStatus
-ConnectionFileDescriptor::NamedSocketAccept(const char *socket_name,
+ConnectionFileDescriptor::NamedSocketAccept(llvm::StringRef socket_name,
Error *error_ptr) {
Socket *socket = nullptr;
Error error =
@@ -672,7 +673,7 @@ ConnectionFileDescriptor::NamedSocketAccept(const char *socket_name,
}
ConnectionStatus
-ConnectionFileDescriptor::NamedSocketConnect(const char *socket_name,
+ConnectionFileDescriptor::NamedSocketConnect(llvm::StringRef socket_name,
Error *error_ptr) {
Socket *socket = nullptr;
Error error =
@@ -689,7 +690,7 @@ ConnectionFileDescriptor::NamedSocketConnect(const char *socket_name,
}
lldb::ConnectionStatus
-ConnectionFileDescriptor::UnixAbstractSocketConnect(const char *socket_name,
+ConnectionFileDescriptor::UnixAbstractSocketConnect(llvm::StringRef socket_name,
Error *error_ptr) {
Socket *socket = nullptr;
Error error = Socket::UnixAbstractConnect(socket_name,
@@ -706,7 +707,7 @@ ConnectionFileDescriptor::UnixAbstractSocketConnect(const char *socket_name,
}
ConnectionStatus
-ConnectionFileDescriptor::SocketListenAndAccept(const char *s,
+ConnectionFileDescriptor::SocketListenAndAccept(llvm::StringRef s,
Error *error_ptr) {
m_port_predicate.SetValue(0, eBroadcastNever);
@@ -734,7 +735,7 @@ ConnectionFileDescriptor::SocketListenAndAccept(const char *s,
return eConnectionStatusSuccess;
}
-ConnectionStatus ConnectionFileDescriptor::ConnectTCP(const char *s,
+ConnectionStatus ConnectionFileDescriptor::ConnectTCP(llvm::StringRef s,
Error *error_ptr) {
Socket *socket = nullptr;
Error error = Socket::TcpConnect(s, m_child_processes_inherit, socket);
@@ -749,7 +750,7 @@ ConnectionStatus ConnectionFileDescriptor::ConnectTCP(const char *s,
return eConnectionStatusSuccess;
}
-ConnectionStatus ConnectionFileDescriptor::ConnectUDP(const char *s,
+ConnectionStatus ConnectionFileDescriptor::ConnectUDP(llvm::StringRef s,
Error *error_ptr) {
Socket *send_socket = nullptr;
Socket *recv_socket = nullptr;
OpenPOWER on IntegriCloud