| /* vi: set sw=4 ts=4: */ |
| /* |
| * Copyright (C) 2002 by Glenn McGrath |
| * |
| * Licensed under GPLv2 or later, see file LICENSE in this source tree. |
| */ |
| #include <fnmatch.h> |
| #include "libbb.h" |
| #include "bb_archive.h" |
| |
| /* Find a string in a shell pattern list */ |
| const llist_t* FAST_FUNC find_list_entry(const llist_t *list, const char *filename) |
| { |
| while (list) { |
| if (fnmatch(list->data, filename, 0) == 0) { |
| return list; |
| } |
| list = list->link; |
| } |
| return NULL; |
| } |
| |
| /* Same, but compares only path components present in pattern |
| * (extra trailing path components in filename are assumed to match) |
| */ |
| const llist_t* FAST_FUNC find_list_entry2(const llist_t *list, const char *filename) |
| { |
| char buf[PATH_MAX]; |
| int pattern_slash_cnt; |
| const char *c; |
| char *d; |
| |
| while (list) { |
| c = list->data; |
| pattern_slash_cnt = 0; |
| while (*c) |
| if (*c++ == '/') pattern_slash_cnt++; |
| c = filename; |
| d = buf; |
| /* paranoia is better than buffer overflows */ |
| while (*c && d != buf + sizeof(buf)-1) { |
| if (*c == '/' && --pattern_slash_cnt < 0) |
| break; |
| *d++ = *c++; |
| } |
| *d = '\0'; |
| if (fnmatch(list->data, buf, 0) == 0) { |
| return list; |
| } |
| list = list->link; |
| } |
| return NULL; |
| } |