From: wessels <> Date: Tue, 23 Jul 1996 10:07:48 +0000 (+0000) Subject: use state variable instead of bitfields X-Git-Tag: SQUID_3_0_PRE1~6006 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=665d36debe80fe4550e5ac714bf063d961cdaa7d;p=thirdparty%2Fsquid.git use state variable instead of bitfields --- diff --git a/src/acl.cc b/src/acl.cc index c25fcaad59..3f36575438 100644 --- a/src/acl.cc +++ b/src/acl.cc @@ -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); diff --git a/src/client_side.cc b/src/client_side.cc index 03eaed347d..454d89953c 100644 --- a/src/client_side.cc +++ b/src/client_side.cc @@ -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;