]> git.ipfire.org Git - people/ms/network.git/blob - src/networkd/util.c
0381ea866f62655d0b8cd0e926fe417a95da0e7c
[people/ms/network.git] / src / networkd / util.c
1 /*#############################################################################
2 # #
3 # IPFire.org - A linux based firewall #
4 # Copyright (C) 2023 IPFire Network Development Team #
5 # #
6 # This program is free software: you can redistribute it and/or modify #
7 # it under the terms of the GNU General Public License as published by #
8 # the Free Software Foundation, either version 3 of the License, or #
9 # (at your option) any later version. #
10 # #
11 # This program is distributed in the hope that it will be useful, #
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of #
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
14 # GNU General Public License for more details. #
15 # #
16 # You should have received a copy of the GNU General Public License #
17 # along with this program. If not, see <http://www.gnu.org/licenses/>. #
18 # #
19 #############################################################################*/
20
21 #include <errno.h>
22 #include <fnmatch.h>
23 #include <ftw.h>
24 #include <stddef.h>
25 #include <stdio.h>
26
27 #include "util.h"
28
29 int nw_ftw(const char* path, const char* filter,
30 int (*callback)(const char* path, const struct stat* s, void* data), void* data) {
31 /*
32 This is a nested function which allows us to pass some custom pointer to
33 the callback function as that isn't possible with nftw().
34 */
35 int __callback(const char* p, const struct stat* s, int type, struct FTW* ftw) {
36 int r;
37
38 // Filter out anything we don't want
39 if (filter) {
40 r = fnmatch(filter, p, FNM_PATHNAME);
41
42 switch (r) {
43 // Pattern didn't match
44 case FNM_NOMATCH:
45 return 0;
46
47 // Pattern matched
48 case 0:
49 break;
50
51 // Error
52 default:
53 return 1;
54 }
55 }
56
57 return callback(p, s, data);
58 }
59
60 return nftw(path, __callback, 0, 0);
61 }