allowing build with only specific transports
[radsecproxy.git] / tcp.c
diff --git a/tcp.c b/tcp.c
index ac10d48..cddd554 100644 (file)
--- a/tcp.c
+++ b/tcp.c
@@ -6,6 +6,7 @@
  * copyright notice and this permission notice appear in all copies.
  */
 
+#ifdef RADPROT_TCP
 #include <signal.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include "list.h"
 #include "util.h"
 #include "radsecproxy.h"
-#include "tcp.h"
 
+static void setprotoopts(struct commonprotoopts *opts);
+static char **getlistenerargs();
+void *tcplistener(void *arg);
+int tcpconnect(struct server *server, struct timeval *when, int timeout, char * text);
+void *tcpclientrd(void *arg);
+int clientradputtcp(struct server *server, unsigned char *rad);
+void tcpsetsrcres();
+
+static const struct protodefs protodefs = {
+    "tcp",
+    NULL, /* secretdefault */
+    SOCK_STREAM, /* socktype */
+    "1812", /* portdefault */
+    0, /* retrycountdefault */
+    0, /* retrycountmax */
+    REQUEST_RETRY_INTERVAL * REQUEST_RETRY_COUNT, /* retryintervaldefault */
+    60, /* retryintervalmax */
+    DUPLICATE_INTERVAL, /* duplicateintervaldefault */
+    setprotoopts, /* setprotoopts */
+    getlistenerargs, /* getlistenerargs */
+    tcplistener, /* listener */
+    tcpconnect, /* connecter */
+    tcpclientrd, /* clientconnreader */
+    clientradputtcp, /* clientradput */
+    NULL, /* addclient */
+    NULL, /* addserverextra */
+    tcpsetsrcres, /* setsrcres */
+    NULL /* initextra */
+};
+
+static struct addrinfo *srcres = NULL;
+static uint8_t handle;
+static struct commonprotoopts *protoopts = NULL;
+const struct protodefs *tcpinit(uint8_t h) {
+    handle = h;
+    return &protodefs;
+}
+
+static void setprotoopts(struct commonprotoopts *opts) {
+    protoopts = opts;
+}
+
+static char **getlistenerargs() {
+    return protoopts ? protoopts->listenargs : NULL;
+}
+
+void tcpsetsrcres() {
+    if (!srcres)
+       srcres = resolve_hostport_addrinfo(handle, protoopts ? protoopts->sourcearg : NULL);
+}
+    
 int tcpconnect(struct server *server, struct timeval *when, int timeout, char *text) {
     struct timeval now;
     time_t elapsed;
@@ -70,7 +121,7 @@ int tcpconnect(struct server *server, struct timeval *when, int timeout, char *t
        debug(DBG_WARN, "tcpconnect: trying to open TCP connection to %s port %s", server->conf->host, server->conf->port);
        if (server->sock >= 0)
            close(server->sock);
-       if ((server->sock = connecttcp(server->conf->addrinfo, getsrcprotores(RAD_TCP))) >= 0)
+       if ((server->sock = connecttcp(server->conf->addrinfo, srcres)) >= 0)
            break;
        debug(DBG_ERR, "tcpconnect: connecttcp failed");
     }
@@ -274,7 +325,7 @@ void *tcpservernew(void *arg) {
     }
     debug(DBG_WARN, "tcpservernew: incoming TCP connection from %s", addr2string((struct sockaddr *)&from));
 
-    conf = find_clconf(RAD_TCP, (struct sockaddr *)&from, NULL);
+    conf = find_clconf(handle, (struct sockaddr *)&from, NULL);
     if (conf) {
        client = addclient(conf, 1);
        if (client) {
@@ -318,3 +369,8 @@ void *tcplistener(void *arg) {
     free(sp);
     return NULL;
 }
+#else
+const struct protodefs *tcpinit(uint8_t h) {
+    return NULL;
+}
+#endif