--- a/src/Socket.cpp Thu Aug 18 22:13:35 2022 +0200
+++ b/src/Socket.cpp Thu Aug 18 22:42:42 2022 +0200
@@ -62,7 +62,7 @@
static void check(int result, std::string message) {
if (result == 0); // OK
- else throw std::logic_error("Got error result: " + std::to_string(result) + " - " + message);
+ else throw std::logic_error("Got error result: " + message + ": " + strerror(errno) + " (result=" + std::to_string(result) + ", errno=" + std::to_string(errno) + ")");
}
class AddressInfos {
@@ -257,31 +257,23 @@
check(::connect(socket->socket.getFD(), (const sockaddr*) &address, sizeof (address)), "connect socket");
- // zjistíme UID, GID a PID klienta, který se připojil na náš unixový soket:
- struct ucred cr;
- socklen_t crLen = sizeof (cr);
- memset(&cr, 0x00, crLen);
- getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &cr, &crLen);
+ if (findOption(options, "debug") == "true") { // TODO: undocumented feature → standardize or remove
+ struct ucred credentials;
+ socklen_t credentialsLength = sizeof (credentials);
+ memset(&credentials, 0x00, credentialsLength);
+ getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &credentials, &credentialsLength);
- // při opakovaném volání vrací stále totéž:
- // memset(&cr, 0x00, sizeof (cr));
- // getsockopt(spojeni, SOL_SOCKET, SO_PEERCRED, &cr, &crLen);
-
- printf("Přijato spojení\n");
- printf(" FD = %d\n", fd);
- printf(" klientská cesta = %s\n", address.sun_path); // tohle je vždy prázdné
- printf(" klientský PID = %d\n", cr.pid);
- printf(" klientský UID = %d\n", cr.uid);
- printf(" klientský GID = %d\n", cr.gid);
+ printf("uds.fd = %d\n", fd);
+ printf("uds.path = %s\n", address.sun_path);
+ printf("uds.server.pid = %d\n", credentials.pid);
+ printf("uds.server.uid = %d\n", credentials.uid);
+ printf("uds.server.gid = %d\n", credentials.gid);
+ }
return socket;
}
- void send(const std::string& message) override {
- sendmsg(message);
- }
-
const std::string receive() override {
// TODO: UDS receive()
return "TODO: receive() a message";
@@ -306,17 +298,17 @@
static std::vector<std::shared_ptr<SocketFactory>> factories
{
std::make_shared<TemplateSocketFactory<PROTOCOL_TCP, ROLE_CLIENT, MODE_STREAM, TCPClientSocket >> (),
- std::make_shared<TemplateSocketFactory<PROTOCOL_TCP, ROLE_SERVER, MODE_STREAM, TCPClientSocket >> (), // TODO: correct class
- std::make_shared<TemplateSocketFactory<PROTOCOL_UDP, ROLE_CLIENT, MODE_DATAGRAM, UDPClientSocket >> (),
- std::make_shared<TemplateSocketFactory<PROTOCOL_UDP, ROLE_SERVER, MODE_DATAGRAM, UDPClientSocket >> (), // TODO: correct class
- std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_CLIENT, MODE_STREAM, SCTPClientSocket >> (),
- std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_CLIENT, MODE_DATAGRAM, SCTPClientSocket >> (),
- std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_SERVER, MODE_STREAM, UDPClientSocket >> (), // TODO: do we need a stream-mode SCTP?
- std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_SERVER, MODE_DATAGRAM, UDPClientSocket >> (), // TODO: correct class
- std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_CLIENT, MODE_STREAM, UDSClientSocket >> (), // TODO: correct class
- std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_CLIENT, MODE_DATAGRAM, UDSClientSocket >> (), // TODO: correct class
- std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_SERVER, MODE_STREAM, UDSClientSocket >> (), // TODO: correct class
- std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_SERVER, MODE_DATAGRAM, UDSClientSocket >> (), // TODO: correct class
+ std::make_shared<TemplateSocketFactory<PROTOCOL_TCP, ROLE_SERVER, MODE_STREAM, TCPClientSocket >> (), // TODO: correct class
+ std::make_shared<TemplateSocketFactory<PROTOCOL_UDP, ROLE_CLIENT, MODE_DATAGRAM, UDPClientSocket >> (),
+ std::make_shared<TemplateSocketFactory<PROTOCOL_UDP, ROLE_SERVER, MODE_DATAGRAM, UDPClientSocket >> (), // TODO: correct class
+ std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_CLIENT, MODE_STREAM, SCTPClientSocket >> (),
+ std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_CLIENT, MODE_DATAGRAM, SCTPClientSocket >> (),
+ std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_SERVER, MODE_STREAM, UDPClientSocket >> (), // TODO: do we need a stream-mode SCTP?
+ std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_SERVER, MODE_DATAGRAM, UDPClientSocket >> (), // TODO: correct class
+ std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_CLIENT, MODE_STREAM, UDSClientSocket >> (),
+ std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_CLIENT, MODE_DATAGRAM, UDSClientSocket >> (), // TODO: correct class
+ std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_SERVER, MODE_STREAM, UDSClientSocket >> (), // TODO: correct class
+ std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_SERVER, MODE_DATAGRAM, UDSClientSocket >> (), // TODO: correct class
};
std::shared_ptr<SocketFactory> SocketFactory::find(const SocketOptions& options) {