#include <string>
#include <memory>
#include <atomic>
+#include <vector>
#include <klay/klay.h>
#include <klay/serialize.h>
device.write(&header, sizeof(header));
device.write(buffer.begin(), header.length);
- int i = 0, fds[fileDescriptors.size()];
+ std::vector<int> fds;
for (const klay::FileDescriptor& fd : fileDescriptors) {
- fds[i++] = fd.fileDescriptor;
+ fds.push_back(fd.fileDescriptor);
}
device.sendFileDescriptors(fds, fileDescriptors.size());
buffer.reserve(header.length);
device.read(buffer.begin(), header.length);
- int fds[header.ancillary];
-
+ std::vector<int> fds;
device.receiveFileDescriptors(fds, header.ancillary);
- for (unsigned int i = 0; i < header.ancillary; i++) {
- fileDescriptors.emplace_back(klay::FileDescriptor(fds[i]));
- }
+ for (const auto& fd : fds)
+ fileDescriptors.emplace_back(klay::FileDescriptor(fd));
disclose(signature);
}
#include <klay/klay.h>
#include <klay/exception.h>
+#include <vector>
+
namespace klay {
namespace rmi {
void write(const void* buffer, const size_t size) const;
void read(void* buffer, const size_t size) const;
- void sendFileDescriptors(const int* fds, const size_t nr) const;
- void receiveFileDescriptors(int* fds, const size_t nr) const;
+ void sendFileDescriptors(const std::vector<int>& fds, const size_t nr) const;
+ void receiveFileDescriptors(std::vector<int>& fds, const size_t nr) const;
static Socket create(const std::string& path, bool activation = false);
static Socket connect(const std::string& path);
}
}
-void Socket::sendFileDescriptors(const int* fds, const size_t nr) const
+void Socket::sendFileDescriptors(const std::vector<int>& fds, const size_t nr) const
{
if (nr == 0) return;
msgh.msg_control = buffer;
msgh.msg_controllen = sizeof(buffer);
- struct cmsghdr *cmhp;
- cmhp = CMSG_FIRSTHDR(&msgh);
+ struct cmsghdr *cmhp = CMSG_FIRSTHDR(&msgh);
+ if (cmhp == nullptr)
+ throw SocketException("There isn't enough space for a cmsghdr.");
cmhp->cmsg_level = SOL_SOCKET;
cmhp->cmsg_type = SCM_RIGHTS;
cmhp->cmsg_len = CMSG_LEN(sizeof(int) * nr);
- ::memcpy(CMSG_DATA(cmhp), fds, sizeof(int) * nr);
+ ::memcpy(CMSG_DATA(cmhp), fds.data(), sizeof(int) * nr);
int written = 0;
while (written < 1) {
}
}
-void Socket::receiveFileDescriptors(int* fds, const size_t nr) const
+void Socket::receiveFileDescriptors(std::vector<int>& fds, const size_t nr) const
{
if (nr == 0) return;
}
}
- int i = 0;
for (struct cmsghdr *cmhp = CMSG_FIRSTHDR(&msgh); cmhp != NULL; cmhp = CMSG_NXTHDR(&msgh, cmhp)) {
if ((cmhp->cmsg_level == SOL_SOCKET) && (cmhp->cmsg_type == SCM_RIGHTS)) {
if (cmhp->cmsg_len != CMSG_LEN(sizeof(int) * nr)) {
std::cout << "Invalid File Descriptor Table" << std::endl;
}
- fds[i++] = *(reinterpret_cast<int*>(CMSG_DATA(cmhp)));
+ fds.push_back(*(reinterpret_cast<int*>(CMSG_DATA(cmhp))));
}
}
}