]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
use state variable instead of bitfields
authorwessels <>
Tue, 23 Jul 1996 10:07:48 +0000 (10:07 +0000)
committerwessels <>
Tue, 23 Jul 1996 10:07:48 +0000 (10:07 +0000)
src/acl.cc
src/client_side.cc

index c25fcaad592af5bf485cbb2f917e93e0a670284e..3f36575438ee5ce410b6fb7200057a70828234a0 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: acl.cc,v 1.24 1996/07/23 02:39:49 wessels Exp $
+ * $Id: acl.cc,v 1.25 1996/07/23 04:07:48 wessels Exp $
  *
  * DEBUG: section 28    Access Control
  * AUTHOR: Duane Wessels
@@ -679,36 +679,40 @@ int aclMatchAcl(acl, checklist)
        return aclMatchIp(acl->data, checklist->src_addr);
        /* NOTREACHED */
     case ACL_DST_IP:
-       if ((hp = ipcache_gethostbyname(r->host, IP_LOOKUP_IF_MISS)) == NULL) {
-           /* if lookup previously failed, s_addr == INADDR_NONE */
-           if (checklist->dst_addr.s_addr != INADDR_ANY)
-               return aclMatchIp(acl->data, checklist->dst_addr);
+       hp = ipcache_gethostbyname(r->host, IP_LOOKUP_IF_MISS);
+       if (hp) {
+           for (k = 0; *(hp->h_addr_list + k); k++) {
+               xmemcpy(&checklist->dst_addr.s_addr,
+                   *(hp->h_addr_list + k),
+                   hp->h_length);
+               if (aclMatchIp(acl->data, checklist->dst_addr))
+                   return 1;
+           }
+           return 0;
+       } else if (checklist->state[ACL_DST_IP] == ACL_LOOKUP_NONE) {
            debug(28, 3, "aclMatchAcl: Can't yet compare '%s' ACL for '%s'\n",
                acl->name, r->host);
-           checklist->need |= (1 << ACL_DST_IP);
+           checklist->state[ACL_DST_IP] = ACL_LOOKUP_NEED;
            return 0;
+       } else {
+           return aclMatchIp(acl->data, no_addr);
        }
-       for (k = 0; *(hp->h_addr_list + k); k++) {
-           xmemcpy(&checklist->dst_addr.s_addr,
-               *(hp->h_addr_list + k),
-               hp->h_length);
-           if (aclMatchIp(acl->data, checklist->dst_addr))
-               return 1;
-       }
-       return 0;
        /* NOTREACHED */
     case ACL_DST_DOMAIN:
        return aclMatchDomainList(acl->data, r->host);
        /* NOTREACHED */
     case ACL_SRC_DOMAIN:
        fqdn = fqdncache_gethostbyaddr(checklist->src_addr, FQDN_LOOKUP_IF_MISS);
-       if (fqdn == NULL) {
+       if (fqdn) {
+           return aclMatchDomainList(acl->data, fqdn);
+       } else if (checklist->state[ACL_SRC_DOMAIN] == ACL_LOOKUP_NONE) {
            debug(28, 3, "aclMatchAcl: Can't yet compare '%s' ACL for '%s'\n",
                acl->name, inet_ntoa(checklist->src_addr));
-           checklist->need |= (1 << ACL_SRC_DOMAIN);
+           checklist->state[ACL_SRC_DOMAIN] = ACL_LOOKUP_NEED;
            return 0;
+       } else {
+           return aclMatchDomainList(acl->data, "NONE");
        }
-       return aclMatchDomainList(acl->data, fqdn);
        /* NOTREACHED */
     case ACL_TIME:
        return aclMatchTime(acl->data, squid_curtime);
index 03eaed347d28f848164eba40eea96ae41fc80a44..454d89953c3f00ae00c2abddf3fc758d82bc66c0 100644 (file)
@@ -12,13 +12,8 @@ static int clientLookupDstIPDone(fd, hp, data)
     debug(33, 5, "clientLookupDstIPDone: FD %d, '%s'\n",
        fd,
        icpState->url);
-    icpState->aclChecklist->need &= ~(1 << ACL_DST_IP);
-    icpState->aclChecklist->pend &= ~(1 << ACL_DST_IP);
-    if (hp == NULL) {
-       debug(33, 5, "clientLookupDstIPDone: Unknown host %s\n",
-           icpState->request->host);
-       icpState->aclChecklist->dst_addr.s_addr = INADDR_NONE;
-    } else {
+    icpState->aclChecklist->state[ACL_DST_IP] = ACL_LOOKUP_DONE;
+    if (hp) {
        xmemcpy(&icpState->aclChecklist->dst_addr.s_addr,
            *(hp->h_addr_list),
            hp->h_length);
@@ -40,8 +35,7 @@ static void clientLookupSrcFQDNDone(fd, fqdn, data)
        fd,
        icpState->url,
        fqdn ? fqdn : "NULL");
-    icpState->aclChecklist->need &= ~(1 << ACL_SRC_DOMAIN);
-    icpState->aclChecklist->pend &= ~(1 << ACL_SRC_DOMAIN);
+    icpState->aclChecklist->state[ACL_SRC_DOMAIN] = ACL_LOOKUP_DONE;
     clientAccessCheck(icpState, icpState->aclHandler);
 }
 
@@ -57,6 +51,7 @@ void clientAccessCheck(icpState, handler)
     int answer = 1;
     request_t *r = icpState->request;
     aclCheck_t *ch = NULL;
+    acl_lookup_state i;
     if (icpState->aclChecklist == NULL) {
        icpState->aclChecklist = xcalloc(1, sizeof(aclCheck_t));
        icpState->aclChecklist->src_addr = icpState->peer.sin_addr;
@@ -64,34 +59,29 @@ void clientAccessCheck(icpState, handler)
     }
     ch = icpState->aclChecklist;
     icpState->aclHandler = handler;
-    if (ch->pend) {
-       debug(33, 1, "clientAccessCheck: ACL's still pending: %x\n",
-           ch->pend);
-       return;
-    }
     if (httpd_accel_mode && !getAccelWithProxy() && r->protocol != PROTO_CACHEOBJ) {
        /* this cache is an httpd accelerator ONLY */
        if (!BIT_TEST(icpState->flags, REQ_ACCEL))
            answer = 0;
     } else {
        answer = aclCheck(HTTPAccessList, ch);
-       if (ch->need) {
-           if (ch->need & (1 << ACL_DST_IP)) {
-               ipcache_nbgethostbyname(icpState->request->host,
-                   icpState->fd,
-                   clientLookupDstIPDone,
-                   icpState);
-               ch->pend |= (1 << ACL_DST_IP);
-           } else if (ch->need & (1 << ACL_SRC_DOMAIN)) {
-               fqdncache_nbgethostbyaddr(icpState->peer.sin_addr,
-                   icpState->fd,
-                   clientLookupSrcFQDNDone,
-                   icpState);
-               ch->pend |= (1 << ACL_SRC_DOMAIN);
-           }
-           return;
+       if (ch->state[ACL_DST_IP] == ACL_LOOKUP_NEED) {
+           ipcache_nbgethostbyname(icpState->request->host,
+               icpState->fd,
+               clientLookupDstIPDone,
+               icpState);
+           ch->state[ACL_DST_IP] = ACL_LOOKUP_PENDING;
+       } else if (ch->state[ACL_SRC_DOMAIN] == ACL_LOOKUP_NEED) {
+           fqdncache_nbgethostbyaddr(icpState->peer.sin_addr,
+               icpState->fd,
+               clientLookupSrcFQDNDone,
+               icpState);
+           ch->state[ACL_SRC_DOMAIN] = ACL_LOOKUP_PENDING;
        }
     }
+    for (i = ACL_NONE + 1; i < ACL_ENUM_MAX; i++)
+       if (ch->state[i] == ACL_LOOKUP_PENDING)
+           return;
     requestUnlink(icpState->aclChecklist->request);
     safe_free(icpState->aclChecklist);
     icpState->aclHandler = NULL;