1*c6ec7d31SBrooks Davis /* $NetBSD: excludes.c,v 1.13 2004/06/20 22:20:18 jmc Exp $ */ 2*c6ec7d31SBrooks Davis 3*c6ec7d31SBrooks Davis /* 4*c6ec7d31SBrooks Davis * Copyright 2000 Massachusetts Institute of Technology 5*c6ec7d31SBrooks Davis * 6*c6ec7d31SBrooks Davis * Permission to use, copy, modify, and distribute this software and 7*c6ec7d31SBrooks Davis * its documentation for any purpose and without fee is hereby 8*c6ec7d31SBrooks Davis * granted, provided that both the above copyright notice and this 9*c6ec7d31SBrooks Davis * permission notice appear in all copies, that both the above 10*c6ec7d31SBrooks Davis * copyright notice and this permission notice appear in all 11*c6ec7d31SBrooks Davis * supporting documentation, and that the name of M.I.T. not be used 12*c6ec7d31SBrooks Davis * in advertising or publicity pertaining to distribution of the 13*c6ec7d31SBrooks Davis * software without specific, written prior permission. M.I.T. makes 14*c6ec7d31SBrooks Davis * no representations about the suitability of this software for any 15*c6ec7d31SBrooks Davis * purpose. It is provided "as is" without express or implied 16*c6ec7d31SBrooks Davis * warranty. 17*c6ec7d31SBrooks Davis * 18*c6ec7d31SBrooks Davis * THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''. M.I.T. DISCLAIMS 19*c6ec7d31SBrooks Davis * ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE, 20*c6ec7d31SBrooks Davis * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 21*c6ec7d31SBrooks Davis * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT 22*c6ec7d31SBrooks Davis * SHALL M.I.T. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23*c6ec7d31SBrooks Davis * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24*c6ec7d31SBrooks Davis * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 25*c6ec7d31SBrooks Davis * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 26*c6ec7d31SBrooks Davis * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 27*c6ec7d31SBrooks Davis * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 28*c6ec7d31SBrooks Davis * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29*c6ec7d31SBrooks Davis * SUCH DAMAGE. 30*c6ec7d31SBrooks Davis */ 31*c6ec7d31SBrooks Davis 32*c6ec7d31SBrooks Davis #if HAVE_NBTOOL_CONFIG_H 33*c6ec7d31SBrooks Davis #include "nbtool_config.h" 34*c6ec7d31SBrooks Davis #endif 35*c6ec7d31SBrooks Davis 36*c6ec7d31SBrooks Davis #include <sys/cdefs.h> 37*c6ec7d31SBrooks Davis 38*c6ec7d31SBrooks Davis #if defined(__RCSID) && !defined(lint) 39*c6ec7d31SBrooks Davis __RCSID("$NetBSD: excludes.c,v 1.13 2004/06/20 22:20:18 jmc Exp $"); 40*c6ec7d31SBrooks Davis #endif 41*c6ec7d31SBrooks Davis 42*c6ec7d31SBrooks Davis #include <sys/types.h> 43*c6ec7d31SBrooks Davis #include <sys/queue.h> 44*c6ec7d31SBrooks Davis 45*c6ec7d31SBrooks Davis #include <fnmatch.h> 46*c6ec7d31SBrooks Davis #include <stdio.h> 47*c6ec7d31SBrooks Davis #include <stdlib.h> 48*c6ec7d31SBrooks Davis #include <string.h> 49*c6ec7d31SBrooks Davis #include <time.h> 50*c6ec7d31SBrooks Davis #include <util.h> 51*c6ec7d31SBrooks Davis 52*c6ec7d31SBrooks Davis #include "extern.h" 53*c6ec7d31SBrooks Davis 54*c6ec7d31SBrooks Davis 55*c6ec7d31SBrooks Davis /* 56*c6ec7d31SBrooks Davis * We're assuming that there won't be a whole lot of excludes, 57*c6ec7d31SBrooks Davis * so it's OK to use a stupid algorithm. 58*c6ec7d31SBrooks Davis */ 59*c6ec7d31SBrooks Davis struct exclude { 60*c6ec7d31SBrooks Davis LIST_ENTRY(exclude) link; 61*c6ec7d31SBrooks Davis const char *glob; 62*c6ec7d31SBrooks Davis int pathname; 63*c6ec7d31SBrooks Davis }; 64*c6ec7d31SBrooks Davis static LIST_HEAD(, exclude) excludes; 65*c6ec7d31SBrooks Davis 66*c6ec7d31SBrooks Davis 67*c6ec7d31SBrooks Davis void 68*c6ec7d31SBrooks Davis init_excludes(void) 69*c6ec7d31SBrooks Davis { 70*c6ec7d31SBrooks Davis 71*c6ec7d31SBrooks Davis LIST_INIT(&excludes); 72*c6ec7d31SBrooks Davis } 73*c6ec7d31SBrooks Davis 74*c6ec7d31SBrooks Davis void 75*c6ec7d31SBrooks Davis read_excludes_file(const char *name) 76*c6ec7d31SBrooks Davis { 77*c6ec7d31SBrooks Davis FILE *fp; 78*c6ec7d31SBrooks Davis char *line; 79*c6ec7d31SBrooks Davis struct exclude *e; 80*c6ec7d31SBrooks Davis 81*c6ec7d31SBrooks Davis fp = fopen(name, "r"); 82*c6ec7d31SBrooks Davis if (fp == 0) 83*c6ec7d31SBrooks Davis err(1, "%s", name); 84*c6ec7d31SBrooks Davis 85*c6ec7d31SBrooks Davis while ((line = fparseln(fp, NULL, NULL, NULL, 86*c6ec7d31SBrooks Davis FPARSELN_UNESCCOMM | FPARSELN_UNESCCONT | FPARSELN_UNESCESC)) 87*c6ec7d31SBrooks Davis != NULL) { 88*c6ec7d31SBrooks Davis if (line[0] == '\0') 89*c6ec7d31SBrooks Davis continue; 90*c6ec7d31SBrooks Davis 91*c6ec7d31SBrooks Davis if ((e = malloc(sizeof *e)) == NULL) 92*c6ec7d31SBrooks Davis mtree_err("memory allocation error"); 93*c6ec7d31SBrooks Davis 94*c6ec7d31SBrooks Davis e->glob = line; 95*c6ec7d31SBrooks Davis if (strchr(e->glob, '/') != NULL) 96*c6ec7d31SBrooks Davis e->pathname = 1; 97*c6ec7d31SBrooks Davis else 98*c6ec7d31SBrooks Davis e->pathname = 0; 99*c6ec7d31SBrooks Davis LIST_INSERT_HEAD(&excludes, e, link); 100*c6ec7d31SBrooks Davis } 101*c6ec7d31SBrooks Davis fclose(fp); 102*c6ec7d31SBrooks Davis } 103*c6ec7d31SBrooks Davis 104*c6ec7d31SBrooks Davis int 105*c6ec7d31SBrooks Davis check_excludes(const char *fname, const char *path) 106*c6ec7d31SBrooks Davis { 107*c6ec7d31SBrooks Davis struct exclude *e; 108*c6ec7d31SBrooks Davis 109*c6ec7d31SBrooks Davis /* fnmatch(3) has a funny return value convention... */ 110*c6ec7d31SBrooks Davis #define MATCH(g, n) (fnmatch((g), (n), FNM_PATHNAME) == 0) 111*c6ec7d31SBrooks Davis 112*c6ec7d31SBrooks Davis e = LIST_FIRST(&excludes); 113*c6ec7d31SBrooks Davis while (e) { 114*c6ec7d31SBrooks Davis if ((e->pathname && MATCH(e->glob, path)) 115*c6ec7d31SBrooks Davis || MATCH(e->glob, fname)) { 116*c6ec7d31SBrooks Davis return (1); 117*c6ec7d31SBrooks Davis } 118*c6ec7d31SBrooks Davis e = LIST_NEXT(e, link); 119*c6ec7d31SBrooks Davis } 120*c6ec7d31SBrooks Davis return (0); 121*c6ec7d31SBrooks Davis } 122