1/* 2 * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") 3 * Copyright (c) 1996,1999 by Internet Software Consortium. 4 * 5 * Permission to use, copy, modify, and distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 15 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18#if !defined(LINT) && !defined(CODECENTER) 19static const char rcsid[] = "$Id: gen_ng.c,v 1.3 2005/04/27 04:56:23 sra Exp $"; 20#endif 21 22/* Imports */ 23 24#include "port_before.h" 25 26#include <sys/types.h> 27 28#include <netinet/in.h> 29#include <arpa/nameser.h> 30#include <resolv.h> 31 32#include <errno.h> 33#include <stdlib.h> 34#include <string.h> 35 36#include <isc/memcluster.h> 37#include <irs.h> 38 39#include "port_after.h" 40 41#include "irs_p.h" 42#include "gen_p.h" 43 44/* Types */ 45 46struct pvt { 47 struct irs_rule * rules; 48 struct irs_rule * rule; 49 char * curgroup; 50}; 51 52/* Forward */ 53 54static void ng_close(struct irs_ng *); 55static int ng_next(struct irs_ng *, const char **, 56 const char **, const char **); 57static int ng_test(struct irs_ng *, const char *, 58 const char *, const char *, 59 const char *); 60static void ng_rewind(struct irs_ng *, const char *); 61static void ng_minimize(struct irs_ng *); 62 63/* Public */ 64 65struct irs_ng * 66irs_gen_ng(struct irs_acc *this) { 67 struct gen_p *accpvt = (struct gen_p *)this->private; 68 struct irs_ng *ng; 69 struct pvt *pvt; 70 71 if (!(ng = memget(sizeof *ng))) { 72 errno = ENOMEM; 73 return (NULL); 74 } 75 memset(ng, 0x5e, sizeof *ng); 76 if (!(pvt = memget(sizeof *pvt))) { 77 memput(ng, sizeof *ng); 78 errno = ENOMEM; 79 return (NULL); 80 } 81 memset(pvt, 0, sizeof *pvt); 82 pvt->rules = accpvt->map_rules[irs_ng]; 83 pvt->rule = pvt->rules; 84 ng->private = pvt; 85 ng->close = ng_close; 86 ng->next = ng_next; 87 ng->test = ng_test; 88 ng->rewind = ng_rewind; 89 ng->minimize = ng_minimize; 90 return (ng); 91} 92 93/* Methods */ 94 95static void 96ng_close(struct irs_ng *this) { 97 struct pvt *pvt = (struct pvt *)this->private; 98 99 ng_minimize(this); 100 if (pvt->curgroup) 101 free(pvt->curgroup); 102 memput(pvt, sizeof *pvt); 103 memput(this, sizeof *this); 104} 105 106static int 107ng_next(struct irs_ng *this, const char **host, const char **user, 108 const char **domain) 109{ 110 struct pvt *pvt = (struct pvt *)this->private; 111 struct irs_ng *ng; 112 113 while (pvt->rule) { 114 ng = pvt->rule->inst->ng; 115 if ((*ng->next)(ng, host, user, domain) == 1) 116 return (1); 117 if (!(pvt->rule->flags & IRS_CONTINUE)) 118 break; 119 pvt->rule = pvt->rule->next; 120 if (pvt->rule) { 121 ng = pvt->rule->inst->ng; 122 (*ng->rewind)(ng, pvt->curgroup); 123 } 124 } 125 return (0); 126} 127 128static int 129ng_test(struct irs_ng *this, const char *name, 130 const char *user, const char *host, const char *domain) 131{ 132 struct pvt *pvt = (struct pvt *)this->private; 133 struct irs_rule *rule; 134 struct irs_ng *ng; 135 int rval; 136 137 rval = 0; 138 for (rule = pvt->rules; rule; rule = rule->next) { 139 ng = rule->inst->ng; 140 rval = (*ng->test)(ng, name, user, host, domain); 141 if (rval || !(rule->flags & IRS_CONTINUE)) 142 break; 143 } 144 return (rval); 145} 146 147static void 148ng_rewind(struct irs_ng *this, const char *group) { 149 struct pvt *pvt = (struct pvt *)this->private; 150 struct irs_ng *ng; 151 152 pvt->rule = pvt->rules; 153 if (pvt->rule) { 154 if (pvt->curgroup) 155 free(pvt->curgroup); 156 pvt->curgroup = strdup(group); 157 ng = pvt->rule->inst->ng; 158 (*ng->rewind)(ng, pvt->curgroup); 159 } 160} 161 162static void 163ng_minimize(struct irs_ng *this) { 164 struct pvt *pvt = (struct pvt *)this->private; 165 struct irs_rule *rule; 166 167 for (rule = pvt->rules; rule != NULL; rule = rule->next) { 168 struct irs_ng *ng = rule->inst->ng; 169 170 (*ng->minimize)(ng); 171 } 172} 173 174/*! \file */ 175