The patches for 3.0.0pre9.
[rsync/rsync-patches.git] / daemon-forward-lookup.diff
CommitLineData
f2863bc0
WD
1This patch adds a forward lookup of any hostnames listed in the
2"hosts allow" or "hosts deny" daemon config options. Based on
3a patch by Paul Williamson.
4
5To use this patch, run these commands for a successful build:
6
7 patch -p1 <patches/daemon-forward-lookup.diff
8 ./configure (optional if already run)
9 make
10
11diff --git a/access.c b/access.c
12--- a/access.c
13+++ b/access.c
14@@ -210,6 +210,43 @@ static int match_address(char *addr, char *tok)
15 return ret;
16 }
17
18+static int match_hostlookup(char *addr, char *tok)
19+{
20+ struct hostent *hp;
21+ unsigned int i, len;
22+ int failed;
23+ char *p;
24+
25+ if ((p = strchr(tok,'/')) != NULL) {
26+ *p = '\0';
27+ len = p - tok;
28+ } else
29+ len = strlen(tok);
30+
31+ /* Fail quietly if tok is an address (not a hostname) */
32+ failed = strspn(tok, ".0123456789") == len;
33+#ifdef INET6
34+ failed ||= strchr(tok, ':') != NULL;
35+#endif
36+
37+ if (!failed && (hp = gethostbyname(tok)) == NULL)
38+ failed = 1;
39+
40+ if (p)
41+ *p = '/';
42+
43+ if (failed)
44+ return 0;
45+
46+ for (i = 0; hp->h_addr_list[i] != NULL; i++) {
47+ tok = inet_ntoa(*(struct in_addr*)(hp->h_addr_list[i]));
48+ if (match_address(addr, tok))
49+ return 1;
50+ }
51+
52+ return 0;
53+}
54+
55 static int access_match(char *list, char *addr, char *host)
56 {
57 char *tok;
58@@ -223,7 +260,7 @@ static int access_match(char *list, char *addr, char *host)
59 strlower(host);
60
61 for (tok = strtok(list2, " ,\t"); tok; tok = strtok(NULL, " ,\t")) {
62- if (match_hostname(host, tok) || match_address(addr, tok)) {
63+ if (match_hostname(host, tok) || match_address(addr, tok) || match_hostlookup(addr, tok)) {
64 free(list2);
65 return 1;
66 }