@@ -30,52 +30,97 @@ const struct fw3_option fw3_include_opts[] = {
30
30
{ }
31
31
};
32
32
33
+ static bool
34
+ check_include (struct fw3_state * state , struct fw3_include * include , struct uci_element * e )
35
+ {
36
+ if (!include -> enabled )
37
+ return false;
38
+
39
+ if (!include -> path )
40
+ {
41
+ warn_section ("include" , include , e , "must specify a path" );
42
+ return false;
43
+ }
44
+
45
+ if (include -> type == FW3_INC_TYPE_RESTORE && !include -> family )
46
+ warn_section ("include" , include , e , "does not specify a family, include will get"
47
+ "loaded with both iptables-restore and ip6tables-restore!" );
48
+
49
+ return true;
50
+ }
51
+
52
+ static struct fw3_include *
53
+ fw3_alloc_include (struct fw3_state * state )
54
+ {
55
+ struct fw3_include * include ;
56
+
57
+ include = calloc (1 , sizeof (* include ));
58
+ if (!include )
59
+ return NULL ;
60
+
61
+ include -> enabled = true;
62
+
63
+ list_add_tail (& include -> list , & state -> includes );
64
+
65
+ return include ;
66
+ }
33
67
34
68
void
35
- fw3_load_includes (struct fw3_state * state , struct uci_package * p )
69
+ fw3_load_includes (struct fw3_state * state , struct uci_package * p ,
70
+ struct blob_attr * a )
36
71
{
37
72
struct uci_section * s ;
38
73
struct uci_element * e ;
39
74
struct fw3_include * include ;
75
+ struct blob_attr * entry ;
76
+ unsigned rem ;
40
77
41
78
INIT_LIST_HEAD (& state -> includes );
42
79
43
- uci_foreach_element ( & p -> sections , e )
80
+ blob_for_each_attr ( entry , a , rem )
44
81
{
45
- s = uci_to_section (e );
82
+ const char * type ;
83
+ const char * name = "ubus include" ;
46
84
47
- if (strcmp ( s -> type , "include" ))
85
+ if (! fw3_attr_parse_name_type ( entry , & name , & type ))
48
86
continue ;
49
87
50
- include = calloc (1 , sizeof (* include ));
51
- if (!include )
88
+ if (strcmp (type , "script" ) && strcmp (type , "restore" ))
52
89
continue ;
53
90
54
- include -> name = e -> name ;
55
- include -> enabled = true;
56
-
57
- if (!fw3_parse_options (include , fw3_include_opts , s ))
58
- warn_elem (e , "has invalid options" );
91
+ include = fw3_alloc_include (state );
92
+ if (!include )
93
+ continue ;
59
94
60
- if (!include -> enabled )
95
+ if (!fw3_parse_blob_options ( include , fw3_include_opts , entry , name ) )
61
96
{
97
+ warn_section ("include" , include , NULL , "skipped due to invalid options" );
62
98
fw3_free_include (include );
63
99
continue ;
64
100
}
65
101
66
- if (!include -> path )
67
- {
68
- warn_elem (e , "must specify a path" );
102
+ if (!check_include (state , include , NULL ))
69
103
fw3_free_include (include );
104
+ }
105
+
106
+ uci_foreach_element (& p -> sections , e )
107
+ {
108
+ s = uci_to_section (e );
109
+
110
+ if (strcmp (s -> type , "include" ))
111
+ continue ;
112
+
113
+ include = fw3_alloc_include (state );
114
+ if (!include )
70
115
continue ;
71
- }
72
116
73
- if (include -> type == FW3_INC_TYPE_RESTORE && !include -> family )
74
- warn_elem (e , "does not specify a family, include will get loaded "
75
- "with both iptables-restore and ip6tables-restore!" );
117
+ include -> name = e -> name ;
76
118
77
- list_add_tail (& include -> list , & state -> includes );
78
- continue ;
119
+ if (!fw3_parse_options (include , fw3_include_opts , s ))
120
+ warn_elem (e , "has invalid options" );
121
+
122
+ if (!check_include (state , include , e ))
123
+ fw3_free_include (include );
79
124
}
80
125
}
81
126
0 commit comments