1 /* vi: set sw=4 ts=4: */
2 /*
3 * Copyright (C) 2002 by Glenn McGrath
4 *
5 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
6 */
7 #include <fnmatch.h>
8 #include "libbb.h"
9 #include "bb_archive.h"
10
11 /* Find a string in a shell pattern list */
find_list_entry(const llist_t * list,const char * filename)12 const llist_t* FAST_FUNC find_list_entry(const llist_t *list, const char *filename)
13 {
14 while (list) {
15 if (fnmatch(list->data, filename, 0) == 0) {
16 return list;
17 }
18 list = list->link;
19 }
20 return NULL;
21 }
22
23 /* Same, but compares only path components present in pattern
24 * (extra trailing path components in filename are assumed to match)
25 */
find_list_entry2(const llist_t * list,const char * filename)26 const llist_t* FAST_FUNC find_list_entry2(const llist_t *list, const char *filename)
27 {
28 char buf[PATH_MAX];
29 int pattern_slash_cnt;
30 const char *c;
31 char *d;
32
33 while (list) {
34 c = list->data;
35 pattern_slash_cnt = 0;
36 while (*c)
37 if (*c++ == '/') pattern_slash_cnt++;
38 c = filename;
39 d = buf;
40 /* paranoia is better than buffer overflows */
41 while (*c && d != buf + sizeof(buf)-1) {
42 if (*c == '/' && --pattern_slash_cnt < 0)
43 break;
44 *d++ = *c++;
45 }
46 *d = '\0';
47 if (fnmatch(list->data, buf, 0) == 0) {
48 return list;
49 }
50 list = list->link;
51 }
52 return NULL;
53 }
54