summaryrefslogtreecommitdiff
path: root/security/oidentd/files/patch-oidentd-multiple-ip
blob: 2d54a184922dedfc08f41136f2555e685b93b9c1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
diff -ur doc/oidentd.8 doc/oidentd.8.orig
--- doc/oidentd.8.orig	2003-07-13 20:27:52.000000000 +0200
+++ doc/oidentd.8	2008-04-14 15:04:26.000000000 +0200
@@ -50,7 +50,7 @@
 
 .TP
 .B "\-a or \-\-address=<address|hostname>"
-Listen for connections on the specified address. The default is to listen for connections on all configured IP addresses.
+Listen for connections on the specified address, this option can be specified multiple times. The default is to listen for connections on all configured IP addresses.
 
 .TP
 .B "\-c or \-\-charset=<charset>"
diff -ur src/oidentd.c src/oidentd.c.orig
--- src/oidentd.c.orig	2006-05-22 02:43:26.000000000 +0200
+++ src/oidentd.c	2008-04-14 14:55:07.000000000 +0200
@@ -73,7 +73,7 @@
 char *config_file;
 
 in_port_t listen_port;
-struct sockaddr_storage *addr;
+struct sockaddr_storage **addr;
 
 int main(int argc, char **argv) {
 	int *listen_fds = NULL;
diff -ur src/oidentd_inet_util.c src/oidentd_inet_util.c.orig
--- src/oidentd_inet_util.c.orig	2006-05-22 02:31:19.000000000 +0200
+++ src/oidentd_inet_util.c	2008-04-14 15:00:37.000000000 +0200
@@ -92,16 +92,18 @@
 ** Setup the listening socket(s).
 */
 
-int *setup_listen(struct sockaddr_storage *listen_addr, in_port_t listen_port) {
+int *setup_listen(struct sockaddr_storage **listen_addr, in_port_t listen_port) {
 	int ret;
-	int *bound_fds;
+	int *bound_fds = NULL;
 	u_char listen_port_str[64];
 	struct addrinfo hints, *res, *cur;
+	int naddr = 0;
 
 	if (listen_addr != NULL) {
+	    do {
 		cur = xcalloc(1, sizeof(struct addrinfo));
 
-		cur->ai_family = listen_addr->ss_family;
+		cur->ai_family = listen_addr[naddr]->ss_family;
 
 		switch (cur->ai_family) {
 #ifdef WANT_IPV6
@@ -115,20 +117,22 @@
 		}
 
 		cur->ai_addr = xmalloc(cur->ai_addrlen);
-		memcpy(cur->ai_addr, listen_addr, cur->ai_addrlen);
+		memcpy(cur->ai_addr, listen_addr[naddr], cur->ai_addrlen);
 
 		ret = setup_bind(cur, listen_port);
 		free(cur->ai_addr);
 		free(cur);
-		free(listen_addr);
+		free(listen_addr[naddr]);
 
 		if (ret == -1)
 			return (NULL);
 
-		bound_fds = xmalloc(2 * sizeof(int));
-		bound_fds[0] = ret;
-		bound_fds[1] = -1;
-
+		bound_fds = xrealloc(bound_fds, (naddr + 2) * sizeof(int));
+		bound_fds[naddr] = ret;
+		bound_fds[naddr+1] = -1;
+		naddr++;
+	    } while (listen_addr[naddr] != NULL);
+		free(listen_addr);
 		return (bound_fds);
 	}
 
diff -ur src/oidentd_inet_util.h src/oidentd_inet_util.h.orig
--- src/oidentd_inet_util.h.orig	2006-05-22 00:52:24.000000000 +0200
+++ src/oidentd_inet_util.h	2008-04-14 15:00:26.000000000 +0200
@@ -22,7 +22,7 @@
 #define SIN4(x) ((struct sockaddr_in *) (x))
 #define SIN6(x) ((struct sockaddr_in6 *) (x))
 
-int *setup_listen(struct sockaddr_storage *listen_addr, in_port_t listen_port);
+int *setup_listen(struct sockaddr_storage **listen_addr, in_port_t listen_port);
 
 int get_port(const char *name, in_port_t *port);
 int get_addr(const char *const hostname, struct sockaddr_storage *g_addr);
diff -ur src/oidentd_options.c src/oidentd_options.c.orig
--- src/oidentd_options.c.orig	2006-05-22 02:31:19.000000000 +0200
+++ src/oidentd_options.c	2008-04-14 15:00:49.000000000 +0200
@@ -53,7 +53,7 @@
 extern u_int32_t timeout;
 extern u_int32_t connection_limit;
 extern in_port_t listen_port;
-extern struct sockaddr_storage *addr;
+extern struct sockaddr_storage **addr;
 extern uid_t uid;
 extern gid_t gid;
 
@@ -126,6 +126,7 @@
 	int opt;
 	char *temp_os;
 	char *charset = NULL;
+	int naddrs = 0;
 
 #ifdef MASQ_SUPPORT
 	if (get_port(DEFAULT_FPORT, &fwdport) == -1) {
@@ -151,13 +152,16 @@
 				struct sockaddr_storage *temp_ss =
 					xmalloc(sizeof(struct sockaddr_storage));
 
+				if (naddrs % 16 == 0)
+					addr = xrealloc(addr, sizeof(struct sockaddr_storage *)*(naddrs+16));
+
 				if (get_addr(optarg, temp_ss) == -1) {
 					o_log(NORMAL, "Fatal: Unknown host: \"%s\"", optarg);
 					free(temp_ss);
 					return (-1);
 				}
 
-				addr = temp_ss;
+				addr[naddrs++] = temp_ss;
 				break;
 			}
 
@@ -327,6 +331,8 @@
 				return (-1);
 		}
 	}
+	if (addr != NULL)
+		addr[naddrs] = NULL;
 
 	if (charset != NULL) {
 		size_t len = strlen(temp_os) + strlen(charset) + 4;