better error reporting + optional debug mode (print server pid/uid/gid etc.) v_0
authorFrantišek Kučera <franta-hg@frantovo.cz>
Thu, 18 Aug 2022 22:42:42 +0200
branchv_0
changeset 26 07949ba141b7
parent 25 de58479757e1
child 27 e6e5780339bd
better error reporting + optional debug mode (print server pid/uid/gid etc.)
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<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) {