The patches for 3.0.0pre7.
[rsync/rsync-patches.git] / daemon-forward-lookup.diff
1 This patch adds a forward lookup of any hostnames listed in the
2 "hosts allow" or "hosts deny" daemon config options.  Based on
3 a patch by Paul Williamson.
4
5 To 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
11 diff --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                 }