# HG changeset patch # User František Kučera # Date 1660855362 -7200 # Node ID 07949ba141b74ee7f900105e3b2dbf604494608a # Parent de58479757e1386e806361421e60fefc72845de9 better error reporting + optional debug mode (print server pid/uid/gid etc.) diff -r de58479757e1 -r 07949ba141b7 src/Socket.cpp --- 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> factories { std::make_shared> (), - std::make_shared> (), // TODO: correct class - std::make_shared> (), - std::make_shared> (), // TODO: correct class - std::make_shared> (), - std::make_shared> (), - std::make_shared> (), // TODO: do we need a stream-mode SCTP? - std::make_shared> (), // TODO: correct class - std::make_shared> (), // TODO: correct class - std::make_shared> (), // TODO: correct class - std::make_shared> (), // TODO: correct class - std::make_shared> (), // TODO: correct class + std::make_shared> (), // TODO: correct class + std::make_shared> (), + std::make_shared> (), // TODO: correct class + std::make_shared> (), + std::make_shared> (), + std::make_shared> (), // TODO: do we need a stream-mode SCTP? + std::make_shared> (), // TODO: correct class + std::make_shared> (), + std::make_shared> (), // TODO: correct class + std::make_shared> (), // TODO: correct class + std::make_shared> (), // TODO: correct class }; std::shared_ptr SocketFactory::find(const SocketOptions& options) {