Introduce generic host config and related helpers

Add generic host config struct and related helpers for TCP-based probes
and use them for ctrl probe.

This will be used in follow-up patch for OpenVPN probe as well.

Change-Id: Ie321655a92cdbefbfaa056ac0d583397c83beccb
diff --git a/src/simple_ctrl.c b/src/simple_ctrl.c
index b56fc83..883e92f 100644
--- a/src/simple_ctrl.c
+++ b/src/simple_ctrl.c
@@ -35,10 +35,11 @@
 #include <osmocom/gsm/ipa.h>
 #include <osmocom/gsm/protocol/ipaccess.h>
 
+#include "client.h"
 #include "simple_ctrl.h"
 
-#define CTRL_ERR(cfg, fmt, args...) \
-	fprintf(stderr, "CTRL %s:%u error: " fmt, cfg.remote_host, cfg.remote_port, ##args)
+#define CTRL_ERR(sch, fmt, args...) \
+	fprintf(stderr, "CTRL %s error: " fmt, make_authority(sch, &sch->cfg), ##args)
 
 /***********************************************************************
  * blocking I/O with timeout helpers
@@ -101,7 +102,7 @@
 	int fd;
 	uint32_t next_id;
 	uint32_t tout_msec;
-	struct ctrl_cfg cfg;
+	struct host_cfg cfg;
 };
 
 struct simple_ctrl_handle *simple_ctrl_open(void *ctx, const char *host, uint16_t dport,
@@ -122,7 +123,7 @@
 	fd = osmo_sock_init(AF_INET, SOCK_STREAM, IPPROTO_TCP, host, dport,
 			    OSMO_SOCK_F_CONNECT | OSMO_SOCK_F_NONBLOCK);
 	if (fd < 0) {
-		CTRL_ERR(sch->cfg, "connecting socket: %s\n", strerror(errno));
+		CTRL_ERR(sch, "connecting socket: %s\n", strerror(errno));
 		return NULL;
 	}
 
@@ -131,17 +132,17 @@
 	FD_SET(fd, &writeset);
 	rc = select(fd+1, NULL, &writeset, NULL, timeval_from_msec(tout_msec));
 	if (rc == 0) {
-		CTRL_ERR(sch->cfg, "timeout during connect\n");
+		CTRL_ERR(sch, "timeout during connect\n");
 		goto out_close;
 	}
 	if (rc < 0) {
-		CTRL_ERR(sch->cfg, "error connecting socket: %s\n", strerror(errno));
+		CTRL_ERR(sch, "error connecting socket: %s\n", strerror(errno));
 		goto out_close;
 	}
 
 	/* set FD blocking again */
 	if (ioctl(fd, FIONBIO, (unsigned char *)&off) < 0) {
-		CTRL_ERR(sch->cfg, "cannot set socket blocking: %s\n", strerror(errno));
+		CTRL_ERR(sch, "cannot set socket blocking: %s\n", strerror(errno));
 		goto out_close;
 	}
 
@@ -173,10 +174,10 @@
 
 	rc = read_timeout(sch->fd, (uint8_t *) &hh, sizeof(hh), sch->tout_msec);
 	if (rc < 0) {
-		CTRL_ERR(sch->cfg, "read(): %d\n", rc);
+		CTRL_ERR(sch, "read(): %d\n", rc);
 		return NULL;
 	} else if (rc < sizeof(hh)) {
-		CTRL_ERR(sch->cfg, "short read (header)\n");
+		CTRL_ERR(sch, "short read (header)\n");
 		return NULL;
 	}
 	len = ntohs(hh.len);
@@ -190,7 +191,7 @@
 	resp->l2h = resp->tail;
 	rc = read(sch->fd, resp->l2h, len);
 	if (rc < len) {
-		CTRL_ERR(sch->cfg, "short read (payload)\n");
+		CTRL_ERR(sch, "short read (payload)\n");
 		msgb_free(resp);
 		return NULL;
 	}
@@ -222,7 +223,7 @@
 			*tmp = '\0';
 			return resp;
 		} else {
-			CTRL_ERR(sch->cfg, "unknown IPA message %s\n", msgb_hexdump(resp));
+			CTRL_ERR(sch, "unknown IPA message %s\n", msgb_hexdump(resp));
 			msgb_free(resp);
 		}
 	}
@@ -237,10 +238,10 @@
 
 	rc = write_timeout(sch->fd, msg->data, msg->len, sch->tout_msec);
 	if (rc < 0) {
-		CTRL_ERR(sch->cfg, "write(): %d\n", rc);
+		CTRL_ERR(sch, "write(): %d\n", rc);
 		return rc;
 	} else if (rc < msg->len) {
-		CTRL_ERR(sch->cfg, "short write\n");
+		CTRL_ERR(sch, "short write\n");
 		msgb_free(msg);
 		return -1;
 	} else {
@@ -291,7 +292,7 @@
 		free(rx_var);
 		free(rx_val);
 	} else {
-		CTRL_ERR(sch->cfg, "GET(%s) results in '%s'\n", var, (char *)msgb_l2(resp));
+		CTRL_ERR(sch, "GET(%s) results in '%s'\n", var, (char *)msgb_l2(resp));
 	}
 
 	msgb_free(resp);
@@ -329,7 +330,7 @@
 			free(rx_var);
 		}
 	} else {
-		CTRL_ERR(sch->cfg, "SET(%s=%s) results in '%s'\n", var, val, (char *) msgb_l2(resp));
+		CTRL_ERR(sch, "SET(%s=%s) results in '%s'\n", var, val, (char *) msgb_l2(resp));
 	}
 
 	msgb_free(resp);