From 9b394bc887695da6db74f4b9796b4823e553f8cc Mon Sep 17 00:00:00 2001
From: Guus Sliepen <guus@tinc-vpn.org>
Date: Tue, 8 Sep 2009 21:45:24 +0200
Subject: [PATCH] Ensure tinc compiles with gcc -std=c99.

We use a lot of C99 features already, but also some extensions which are not in
the standard.
---
 configure.in     |  2 +-
 src/connection.c |  4 ++--
 src/connection.h | 25 +++++++++++--------------
 src/net.c        |  2 +-
 src/node.h       | 19 ++++++++-----------
 5 files changed, 23 insertions(+), 29 deletions(-)

diff --git a/configure.in b/configure.in
index 3cb6a4de..964dd27a 100644
--- a/configure.in
+++ b/configure.in
@@ -21,7 +21,7 @@ AC_DEFINE([__USE_BSD], 1, [Enable BSD extensions])
 ALL_LINGUAS="nl"
 
 dnl Checks for programs.
-AC_PROG_CC
+AC_PROG_CC_C99
 AC_PROG_CPP
 AC_PROG_INSTALL
 AC_PROG_LN_S
diff --git a/src/connection.c b/src/connection.c
index a2a188a6..430e1c14 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -37,7 +37,7 @@ connection_t *broadcast;
 
 static int connection_compare(const connection_t *a, const connection_t *b)
 {
-	return (void *)a - (void *)b;
+	return a - b;
 }
 
 void init_connections(void)
@@ -144,7 +144,7 @@ void dump_connections(void)
 	for(node = connection_tree->head; node; node = node->next) {
 		c = node->data;
 		logger(LOG_DEBUG, _(" %s at %s options %lx socket %d status %04x outbuf %d/%d/%d"),
-			   c->name, c->hostname, c->options, c->socket, c->status.value,
+			   c->name, c->hostname, c->options, c->socket, *(uint32_t *)&c->status,
 			   c->outbufsize, c->outbufstart, c->outbuflen);
 	}
 
diff --git a/src/connection.h b/src/connection.h
index 087d8f00..8948d4fa 100644
--- a/src/connection.h
+++ b/src/connection.h
@@ -32,20 +32,17 @@
 #define OPTION_TCPONLY		0x0002
 #define OPTION_PMTU_DISCOVERY	0x0004
 
-typedef union connection_status_t {
-	struct {
-		int pinged:1;				/* sent ping */
-		int active:1;				/* 1 if active.. */
-		int connecting:1;			/* 1 if we are waiting for a non-blocking connect() to finish */
-		int termreq:1;				/* the termination of this connection was requested */
-		int remove:1;				/* Set to 1 if you want this connection removed */
-		int timeout:1;				/* 1 if gotten timeout */
-		int encryptout:1;			/* 1 if we can encrypt outgoing traffic */
-		int decryptin:1;			/* 1 if we have to decrypt incoming traffic */
-		int mst:1;				/* 1 if this connection is part of a minimum spanning tree */
-		int unused:23;
-	};
-	uint32_t value;
+typedef struct connection_status_t {
+	int pinged:1;				/* sent ping */
+	int active:1;				/* 1 if active.. */
+	int connecting:1;			/* 1 if we are waiting for a non-blocking connect() to finish */
+	int termreq:1;				/* the termination of this connection was requested */
+	int remove:1;				/* Set to 1 if you want this connection removed */
+	int timeout:1;				/* 1 if gotten timeout */
+	int encryptout:1;			/* 1 if we can encrypt outgoing traffic */
+	int decryptin:1;			/* 1 if we have to decrypt incoming traffic */
+	int mst:1;				/* 1 if this connection is part of a minimum spanning tree */
+	int unused:23;
 } connection_status_t;
 
 #include "edge.h"
diff --git a/src/net.c b/src/net.c
index 4a2af954..910e86dd 100644
--- a/src/net.c
+++ b/src/net.c
@@ -251,7 +251,7 @@ static void check_dead_connections(void)
 			} else {
 				if(c->status.remove) {
 					logger(LOG_WARNING, _("Old connection_t for %s (%s) status %04x still lingering, deleting..."),
-						   c->name, c->hostname, c->status.value);
+						   c->name, c->hostname, *(uint32_t *)&c->status);
 					connection_del(c);
 					continue;
 				}
diff --git a/src/node.h b/src/node.h
index 4321c008..528716de 100644
--- a/src/node.h
+++ b/src/node.h
@@ -29,17 +29,14 @@
 #include "list.h"
 #include "subnet.h"
 
-typedef union node_status_t {
-	struct {
-		int unused_active:1;			/* 1 if active (not used for nodes) */
-		int validkey:1;				/* 1 if we currently have a valid key for him */
-		int waitingforkey:1;			/* 1 if we already sent out a request */
-		int visited:1;				/* 1 if this node has been visited by one of the graph algorithms */
-		int reachable:1;			/* 1 if this node is reachable in the graph */
-		int indirect:1;				/* 1 if this node is not directly reachable by us */
-		int unused:26;
-	};
-	uint32_t value;
+typedef struct node_status_t {
+	int unused_active:1;			/* 1 if active (not used for nodes) */
+	int validkey:1;				/* 1 if we currently have a valid key for him */
+	int waitingforkey:1;			/* 1 if we already sent out a request */
+	int visited:1;				/* 1 if this node has been visited by one of the graph algorithms */
+	int reachable:1;			/* 1 if this node is reachable in the graph */
+	int indirect:1;				/* 1 if this node is not directly reachable by us */
+	int unused:26;
 } node_status_t;
 
 typedef struct node_t {
-- 
2.39.5