]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - support/misc/tcpwrapper.c
Converted good_client() to correctly use the tcp wrapper
[nfs-utils.git] / support / misc / tcpwrapper.c
index bc7fb4afc37ade8da354a55f197d09ef4a27353d..0ba856f9819d6af0593a0e47fe267120df33fd16 100644 (file)
@@ -46,7 +46,9 @@
 #include <sys/signal.h>
 #include <sys/queue.h>
 #include <sys/stat.h>
-#include <unistd.h>
+#include <tcpd.h>
+
+#include "xlog.h"
 
 #ifdef SYSV40
 #include <netinet/in.h>
@@ -106,8 +108,8 @@ typedef struct _hash_head {
        TAILQ_HEAD(host_list, _haccess_t) h_head;
 } hash_head;
 hash_head haccess_tbl[HASH_TABLE_SIZE];
-static haccess_t *haccess_lookup(struct sockaddr_in *addr, u_long, u_long);
-static void haccess_add(struct sockaddr_in *addr, u_long, u_long, int);
+static haccess_t *haccess_lookup(struct sockaddr_in *addr, u_long);
+static void haccess_add(struct sockaddr_in *addr, u_long, int);
 
 inline unsigned int strtoint(char *str)
 {
@@ -120,15 +122,14 @@ inline unsigned int strtoint(char *str)
 
        return n;
 }
-inline int hashint(unsigned int num)
+static inline int hashint(unsigned int num)
 {
        return num % HASH_TABLE_SIZE;
 }
-#define HASH(_addr, _proc, _prog) \
-       hashint((strtoint((_addr))+(_proc)+(_prog)))
+#define HASH(_addr, _prog) \
+       hashint((strtoint((_addr))+(_prog)))
 
-void haccess_add(struct sockaddr_in *addr, u_long proc, 
-       u_long prog, int access)
+void haccess_add(struct sockaddr_in *addr, u_long prog, int access)
 {
        hash_head *head;
        haccess_t *hptr;
@@ -138,7 +139,7 @@ void haccess_add(struct sockaddr_in *addr, u_long proc,
        if (hptr == NULL)
                return;
 
-       hash = HASH(inet_ntoa(addr->sin_addr), proc, prog);
+       hash = HASH(inet_ntoa(addr->sin_addr), prog);
        head = &(haccess_tbl[hash]);
 
        hptr->access = access;
@@ -149,13 +150,13 @@ void haccess_add(struct sockaddr_in *addr, u_long proc,
        else
                TAILQ_INSERT_TAIL(&head->h_head, hptr, list);
 }
-haccess_t *haccess_lookup(struct sockaddr_in *addr, u_long proc, u_long prog)
+haccess_t *haccess_lookup(struct sockaddr_in *addr, u_long prog)
 {
        hash_head *head;
        haccess_t *hptr;
        int hash;
 
-       hash = HASH(inet_ntoa(addr->sin_addr), proc, prog);
+       hash = HASH(inet_ntoa(addr->sin_addr), prog);
        head = &(haccess_tbl[hash]);
 
        TAILQ_FOREACH(hptr, &head->h_head, list) {
@@ -170,48 +171,15 @@ good_client(daemon, addr)
 char *daemon;
 struct sockaddr_in *addr;
 {
-    struct hostent *hp;
-    char **sp;
-    char *tmpname;
-
-       /* First check the address. */
-       if (hosts_ctl(daemon, "", inet_ntoa(addr->sin_addr), "") == DENY)
-               return DENY;
-
-       /* Now do the hostname lookup */
-       hp = gethostbyaddr ((const char *) &(addr->sin_addr),
-               sizeof (addr->sin_addr), AF_INET);
-       if (!hp)
-               return DENY; /* never heard of it. misconfigured DNS? */
-
-       /* Make sure the hostent is authorative. */
-       tmpname = strdup(hp->h_name);
-       if (!tmpname)
-               return DENY;
-       hp = gethostbyname(tmpname);
-       free(tmpname);
-       if (!hp)
-               return DENY; /* never heard of it. misconfigured DNS? */
-
-       /* Now make sure the address is on the list */
-       for (sp = hp->h_addr_list ; *sp ; sp++) {
-           if (memcmp(*sp, &(addr->sin_addr), hp->h_length) == 0)
-                       break;
-       }
-       if (!*sp)
-           return DENY; /* it was a FAKE. */
+       struct request_info req;
 
-       /* Check the official name and address. */
-       if (hosts_ctl(daemon, hp->h_name, inet_ntoa(addr->sin_addr), "") == DENY)
-               return DENY;
+       request_init(&req, RQ_DAEMON, daemon, RQ_CLIENT_SIN, addr, 0);
+       sock_methods(&req);
 
-       /* Now check aliases. */
-       for (sp = hp->h_aliases; *sp ; sp++) {
-               if (hosts_ctl(daemon, *sp, inet_ntoa(addr->sin_addr), "") == DENY)
-               return DENY;
-       }
+       if (hosts_access(&req)) 
+               return ALLOW;
 
-   return ALLOW;
+       return DENY;
 }
 
 /* check_startup - additional startup code */
@@ -290,7 +258,7 @@ u_long  prog;
        haccess_t *acc = NULL;
        int changed = check_files();
 
-       acc = haccess_lookup(addr, proc, prog);
+       acc = haccess_lookup(addr, prog);
        if (acc && changed == 0)
                return (acc->access);
 
@@ -299,7 +267,7 @@ u_long  prog;
                if (acc)
                        acc->access = FALSE;
                else 
-                       haccess_add(addr, proc, prog, FALSE);
+                       haccess_add(addr, prog, FALSE);
                return (FALSE);
        }
        if (verboselog)
@@ -308,7 +276,7 @@ u_long  prog;
        if (acc)
                acc->access = TRUE;
        else 
-               haccess_add(addr, proc, prog, TRUE);
+               haccess_add(addr, prog, TRUE);
     return (TRUE);
 }