00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef XCCDF_HELPERS_H_
00024 #define XCCDF_HELPERS_H_
00025
00026
00027 #define MACRO_BLOCK(code) do { code } while(false)
00028 #define ASSERT_TYPE(item,t) assert((item)->type & t)
00029 #define ASSERT_BENCHMARK(item) ASSERT_TYPE(item, XCCDF_BENCHMARK)
00030 #define XBENCHMARK(item) ((struct xccdf_benchmark*)item)
00031 #define XPROFILE(item) ((struct xccdf_profile*)item)
00032 #define XGROUP(item) ((struct xccdf_group*)item)
00033 #define XRULE(item) ((struct xccdf_rule*)item)
00034 #define XITEM(item) ((struct xccdf_item*)item)
00035 #define XVALUE(item) ((struct xccdf_value*)item)
00036 #define XRESULT(item) ((struct xccdf_result*)item)
00037
00038 #define XCCDF_STATUS_CURRENT(TYPE) \
00039 xccdf_status_type_t xccdf_##TYPE##_get_status_current(const struct xccdf_##TYPE* item) {\
00040 return xccdf_item_get_current_status(XITEM(item)); }
00041
00042 #define XCCDF_TEXT_IGETTER(SNAME,MNAME,MEXP) \
00043 struct oscap_text_iterator* xccdf_##SNAME##_get_##MNAME(const struct xccdf_##SNAME* item) \
00044 { return oscap_iterator_new(XITEM(item)->MEXP); }
00045 #define XCCDF_GENERIC_GETTER(RTYPE,TNAME,MEMBER) \
00046 RTYPE xccdf_##TNAME##_get_##MEMBER(const struct xccdf_##TNAME* item) { return (RTYPE)((item)->MEMBER); }
00047 #define XCCDF_GENERIC_IGETTER(ITYPE,TNAME,MNAME) \
00048 struct xccdf_##ITYPE##_iterator* xccdf_##TNAME##_get_##MNAME(const struct xccdf_##TNAME* item) \
00049 { return oscap_iterator_new(item->MNAME); }
00050 #define XCCDF_ABSTRACT_GETTER(RTYPE,TNAME,MNAME,MEMBER) \
00051 RTYPE xccdf_##TNAME##_get_##MNAME(const struct xccdf_##TNAME* item) { return (RTYPE)(XITEM(item)->MEMBER); }
00052 #define XCCDF_ITERATOR_GETTER(ITYPE,TNAME,MNAME,MEMBER) \
00053 struct xccdf_##ITYPE##_iterator* xccdf_##TNAME##_get_##MNAME(const struct xccdf_##TNAME* item) \
00054 { return oscap_iterator_new(XITEM(item)->MEMBER); }
00055 #define XCCDF_SITERATOR_GETTER(TNAME,MNAME,MEMBER) \
00056 struct oscap_string_iterator* xccdf_##TNAME##_get_##MNAME(const struct xccdf_##TNAME* item) \
00057 { return oscap_iterator_new(XITEM(item)->MEMBER); }
00058 #define XCCDF_TITERATOR_GETTER(TNAME,MNAME,MEMBER) \
00059 struct oscap_text_iterator* xccdf_##TNAME##_get_##MNAME(const struct xccdf_##TNAME* item) \
00060 { return oscap_iterator_new(XITEM(item)->MEMBER); }
00061 #define XCCDF_HTABLE_GETTER(RTYPE,TNAME,MNAME,MEMBER) \
00062 RTYPE xccdf_##TNAME##_get_##MNAME(const struct xccdf_##TNAME* item, const char* key) \
00063 { return (RTYPE)oscap_htable_get(XITEM(item)->MEMBER, key); }
00064 #define XCCDF_SIGETTER(TNAME,MNAME) \
00065 struct oscap_string_iterator* xccdf_##TNAME##_get_##MNAME(const struct xccdf_##TNAME* item) \
00066 { return oscap_iterator_new(XITEM(item)->sub.TNAME.MNAME); }
00067
00068 #define XCCDF_BENCHMARK_GETTER_A(RTYPE,MNAME,MEMBER) XCCDF_ABSTRACT_GETTER(RTYPE,benchmark,MNAME,MEMBER)
00069 #define XCCDF_BENCHMARK_GETTER_I(RTYPE,MNAME) XCCDF_BENCHMARK_GETTER_A(RTYPE,MNAME,item.MNAME)
00070 #define XCCDF_BENCHMARK_IGETTER_I(ITYPE,MNAME) XCCDF_ITERATOR_GETTER(ITYPE,benchmark,MNAME,item.MNAME)
00071 #define XCCDF_BENCHMARK_GETTER(RTYPE,MNAME) XCCDF_BENCHMARK_GETTER_A(RTYPE,MNAME,sub.bench.MNAME)
00072 #define XCCDF_BENCHMARK_IGETTER(ITYPE,MNAME) XCCDF_ITERATOR_GETTER(ITYPE,benchmark,MNAME,sub.bench.MNAME)
00073
00074 #define XCCDF_PROFILE_GETTER_A(RTYPE,MNAME,MEMBER) XCCDF_ABSTRACT_GETTER(RTYPE,profile,MNAME,MEMBER)
00075 #define XCCDF_PROFILE_GETTER_I(RTYPE,MNAME) XCCDF_PROFILE_GETTER_A(RTYPE,MNAME,item.MNAME)
00076 #define XCCDF_PROFILE_IGETTER_I(ITYPE,MNAME) XCCDF_ITERATOR_GETTER(ITYPE,profile,MNAME,item.MNAME)
00077 #define XCCDF_PROFILE_GETTER(RTYPE,MNAME) XCCDF_PROFILE_GETTER_A(RTYPE,MNAME,sub.profile.MNAME)
00078 #define XCCDF_PROFILE_IGETTER(ITYPE,MNAME) XCCDF_ITERATOR_GETTER(ITYPE,profile,MNAME,sub.profile.MNAME)
00079
00080 #define XCCDF_RULE_GETTER_A(RTYPE,MNAME,MEMBER) XCCDF_ABSTRACT_GETTER(RTYPE,rule,MNAME,MEMBER)
00081 #define XCCDF_RULE_GETTER_I(RTYPE,MNAME) XCCDF_RULE_GETTER_A(RTYPE,MNAME,item.MNAME)
00082 #define XCCDF_RULE_IGETTER_I(ITYPE,MNAME) XCCDF_ITERATOR_GETTER(ITYPE,rule,MNAME,item.MNAME)
00083 #define XCCDF_RULE_GETTER(RTYPE,MNAME) XCCDF_RULE_GETTER_A(RTYPE,MNAME,sub.rule.MNAME)
00084 #define XCCDF_RULE_IGETTER(ITYPE,MNAME) XCCDF_ITERATOR_GETTER(ITYPE,rule,MNAME,sub.rule.MNAME)
00085
00086 #define XCCDF_GROUP_GETTER_A(RTYPE,MNAME,MEMBER) XCCDF_ABSTRACT_GETTER(RTYPE,group,MNAME,MEMBER)
00087 #define XCCDF_GROUP_GETTER_I(RTYPE,MNAME) XCCDF_GROUP_GETTER_A(RTYPE,MNAME,item.MNAME)
00088 #define XCCDF_GROUP_IGETTER_I(ITYPE,MNAME) XCCDF_ITERATOR_GETTER(ITYPE,group,MNAME,item.MNAME)
00089 #define XCCDF_GROUP_GETTER(RTYPE,MNAME) XCCDF_GROUP_GETTER_A(RTYPE,MNAME,sub.group.MNAME)
00090 #define XCCDF_GROUP_IGETTER(ITYPE,MNAME) XCCDF_ITERATOR_GETTER(ITYPE,group,MNAME,sub.group.MNAME)
00091
00092 #define XCCDF_VALUE_GETTER_A(RTYPE,MNAME,MEMBER) XCCDF_ABSTRACT_GETTER(RTYPE,value,MNAME,MEMBER)
00093 #define XCCDF_VALUE_GETTER_I(RTYPE,MNAME) XCCDF_VALUE_GETTER_A(RTYPE,MNAME,item.MNAME)
00094 #define XCCDF_VALUE_IGETTER_I(ITYPE,MNAME) XCCDF_ITERATOR_GETTER(ITYPE,value,MNAME,item.MNAME)
00095 #define XCCDF_VALUE_GETTER(RTYPE,MNAME) XCCDF_VALUE_GETTER_A(RTYPE,MNAME,sub.value.MNAME)
00096 #define XCCDF_VALUE_IGETTER(ITYPE,MNAME) XCCDF_ITERATOR_GETTER(ITYPE,value,MNAME,sub.value.MNAME)
00097
00098 #define XCCDF_RESULT_GETTER_A(RTYPE,MNAME,MEMBER) XCCDF_ABSTRACT_GETTER(RTYPE,result,MNAME,MEMBER)
00099 #define XCCDF_RESULT_GETTER_I(RTYPE,MNAME) XCCDF_RESULT_GETTER_A(RTYPE,MNAME,item.MNAME)
00100 #define XCCDF_RESULT_IGETTER_I(ITYPE,MNAME) XCCDF_ITERATOR_GETTER(ITYPE,result,MNAME,item.MNAME)
00101 #define XCCDF_RESULT_GETTER(RTYPE,MNAME) XCCDF_RESULT_GETTER_A(RTYPE,MNAME,sub.result.MNAME)
00102 #define XCCDF_RESULT_IGETTER(ITYPE,MNAME) XCCDF_ITERATOR_GETTER(ITYPE,result,MNAME,sub.result.MNAME)
00103
00104 #define XCCDF_SETTER_GENERIC(STYPE,MNAME,MTYPE,FREE,DUP) \
00105 bool xccdf_##STYPE##_set_##MNAME(struct xccdf_##STYPE* item, MTYPE newval) \
00106 { FREE(XITEM(item)->sub.STYPE.MNAME); XITEM(item)->sub.STYPE.MNAME = DUP(newval); return true; }
00107 #define XCCDF_SETTER_STRING(STYPE,MNAME) \
00108 XCCDF_SETTER_GENERIC(STYPE, MNAME, const char*, oscap_free, oscap_strdup)
00109 #define XCCDF_ACCESSOR_STRING(STYPE,MNAME) \
00110 XCCDF_SETTER_STRING(STYPE, MNAME) XCCDF_ABSTRACT_GETTER(const char*, STYPE, MNAME, sub.STYPE.MNAME)
00111 #define XCCDF_IGETTER(TNAME,ITYPE,MNAME) \
00112 XCCDF_ITERATOR_GETTER(ITYPE, TNAME, MNAME, sub.TNAME.MNAME)
00113 #define XCCDF_ADDER(STYPE,MNAME,SINGNAME,MTYPE,DUP) \
00114 bool xccdf_##STYPE##_add_##SINGNAME(struct xccdf_##STYPE* item, MTYPE newval) \
00115 { return oscap_list_add(XITEM(item)->sub.STYPE.MNAME, DUP(newval)); }
00116 #define XCCDF_LISTMANIP(TNAME,ITYPE,MNAME) \
00117 XCCDF_IGETTER(TNAME,ITYPE,MNAME) XCCDF_ADDER(TNAME,MNAME,ITYPE,struct xccdf_##ITYPE*,)
00118 #define XCCDF_LISTMANIP_STRING(TNAME,SNAME,MNAME) \
00119 struct oscap_string_iterator* xccdf_##TNAME##_get_##MNAME(const struct xccdf_##TNAME* item) \
00120 { return oscap_iterator_new(XITEM(item)->sub.TNAME.MNAME); } \
00121 XCCDF_ADDER(TNAME,MNAME,SNAME,const char *,oscap_strdup)
00122 #define XCCDF_LISTMANIP_TEXT(TNAME,SNAME,MNAME) \
00123 struct oscap_text_iterator* xccdf_##TNAME##_get_##MNAME(const struct xccdf_##TNAME* item) \
00124 { return oscap_iterator_new(XITEM(item)->sub.TNAME.MNAME); } \
00125 XCCDF_ADDER(TNAME,MNAME,SNAME,struct oscap_text *,)
00126
00127 #define XCCDF_ITEM_GETTER(RTYPE,MNAME) \
00128 XCCDF_ABSTRACT_GETTER(RTYPE,item,MNAME,item.MNAME) \
00129 XCCDF_BENCHMARK_GETTER_A(RTYPE,MNAME,item.MNAME) \
00130 XCCDF_PROFILE_GETTER_A(RTYPE,MNAME,item.MNAME) \
00131 XCCDF_RULE_GETTER_A(RTYPE,MNAME,item.MNAME) \
00132 XCCDF_VALUE_GETTER_A(RTYPE,MNAME,item.MNAME) \
00133 XCCDF_GROUP_GETTER_A(RTYPE,MNAME,item.MNAME) \
00134 XCCDF_RESULT_GETTER_A(RTYPE,MNAME,item.MNAME)
00135 #define XCCDF_ITEM_IGETTER(RTYPE,MNAME) \
00136 XCCDF_ITERATOR_GETTER(RTYPE,item,MNAME,item.MNAME) \
00137 XCCDF_ITERATOR_GETTER(RTYPE,benchmark,MNAME,item.MNAME) \
00138 XCCDF_ITERATOR_GETTER(RTYPE,profile,MNAME,item.MNAME) \
00139 XCCDF_ITERATOR_GETTER(RTYPE,rule,MNAME,item.MNAME) \
00140 XCCDF_ITERATOR_GETTER(RTYPE,value,MNAME,item.MNAME) \
00141 XCCDF_ITERATOR_GETTER(RTYPE,group,MNAME,item.MNAME) \
00142 XCCDF_ITERATOR_GETTER(RTYPE,result,MNAME,item.MNAME)
00143 #define XCCDF_ITEM_SIGETTER(MNAME) \
00144 XCCDF_SITERATOR_GETTER(item,MNAME,item.MNAME) \
00145 XCCDF_SITERATOR_GETTER(benchmark,MNAME,item.MNAME) \
00146 XCCDF_SITERATOR_GETTER(profile,MNAME,item.MNAME) \
00147 XCCDF_SITERATOR_GETTER(rule,MNAME,item.MNAME) \
00148 XCCDF_SITERATOR_GETTER(value,MNAME,item.MNAME) \
00149 XCCDF_SITERATOR_GETTER(group,MNAME,item.MNAME) \
00150 XCCDF_SITERATOR_GETTER(result,MNAME,item.MNAME)
00151 #define XCCDF_ITEM_TIGETTER(MNAME) \
00152 XCCDF_TITERATOR_GETTER(item,MNAME,item.MNAME) \
00153 XCCDF_TITERATOR_GETTER(benchmark,MNAME,item.MNAME) \
00154 XCCDF_TITERATOR_GETTER(profile,MNAME,item.MNAME) \
00155 XCCDF_TITERATOR_GETTER(rule,MNAME,item.MNAME) \
00156 XCCDF_TITERATOR_GETTER(value,MNAME,item.MNAME) \
00157 XCCDF_TITERATOR_GETTER(group,MNAME,item.MNAME) \
00158 XCCDF_TITERATOR_GETTER(result,MNAME,item.MNAME)
00159 #define XCCDF_FLAG_GETTER(MNAME) \
00160 XCCDF_ABSTRACT_GETTER(bool,item,MNAME,item.flags.MNAME) \
00161 XCCDF_BENCHMARK_GETTER_A(bool,MNAME,item.flags.MNAME) \
00162 XCCDF_PROFILE_GETTER_A(bool,MNAME,item.flags.MNAME) \
00163 XCCDF_RULE_GETTER_A(bool,MNAME,item.flags.MNAME) \
00164 XCCDF_VALUE_GETTER_A(bool,MNAME,item.flags.MNAME) \
00165 XCCDF_GROUP_GETTER_A(bool,MNAME,item.flags.MNAME) \
00166 XCCDF_RESULT_GETTER_A(bool,MNAME,item.flags.MNAME)
00167
00168 #define XCCDF_ITEM_SETTER_ONE(STYPE,MNAME,MTYPE,DUP) \
00169 bool xccdf_##STYPE##_set_##MNAME(struct xccdf_##STYPE* item, MTYPE newval) \
00170 { XITEM(item)->item.MNAME = DUP(newval); return true; }
00171 #define XCCDF_ITEM_SETTER_ONEF(STYPE,MNAME,MTYPE,FREE,DUP) \
00172 bool xccdf_##STYPE##_set_##MNAME(struct xccdf_##STYPE* item, MTYPE newval) \
00173 { FREE(XITEM(item)->item.MNAME); XITEM(item)->item.MNAME = DUP(newval); return true; }
00174 #define XCCDF_ITEM_SETTER_ONES(STYPE,MNAME) XCCDF_ITEM_SETTER_ONEF(STYPE,MNAME,const char*,oscap_free,oscap_strdup)
00175 #define XCCDF_ITEM_SETTER_SIMPLE(MTYPE,MNAME) XCCDF_ITEM_SETTER_ONE(item,MNAME,MTYPE,) \
00176 XCCDF_ITEM_SETTER_ONE(benchmark,MNAME,MTYPE,) XCCDF_ITEM_SETTER_ONE(profile,MNAME,MTYPE,) \
00177 XCCDF_ITEM_SETTER_ONE(rule,MNAME,MTYPE,) XCCDF_ITEM_SETTER_ONE(value,MNAME,MTYPE,) \
00178 XCCDF_ITEM_SETTER_ONE(group,MNAME,MTYPE,) XCCDF_ITEM_SETTER_ONE(result,MNAME,MTYPE,)
00179 #define XCCDF_ITEM_SETTER_STRING(MNAME) XCCDF_ITEM_SETTER_ONES(item,MNAME) \
00180 XCCDF_ITEM_SETTER_ONES(benchmark,MNAME) XCCDF_ITEM_SETTER_ONES(profile,MNAME) \
00181 XCCDF_ITEM_SETTER_ONES(rule,MNAME) XCCDF_ITEM_SETTER_ONES(value,MNAME) \
00182 XCCDF_ITEM_SETTER_ONES(group,MNAME) XCCDF_ITEM_SETTER_ONES(result,MNAME)
00183
00184 #define XCCDF_ITEM_ADDER_ONE(STYPE,MNAME,SINGNAME,MTYPE,DUP) \
00185 bool xccdf_##STYPE##_add_##SINGNAME(struct xccdf_##STYPE* item, MTYPE newval) \
00186 { return oscap_list_add(XITEM(item)->item.MNAME, DUP(newval)); }
00187 #define XCCDF_ITEM_ADDER_ONES(STYPE,MNAME,SINGNAME) XCCDF_ITEM_ADDER_ONE(STYPE,MNAME,SINGNAME,const char*,oscap_strdup)
00188 #define XCCDF_ITEM_ADDER_STRING(MNAMES,MNAME) XCCDF_ITEM_ADDER_ONES(item,MNAME,MNAMES) \
00189 XCCDF_ITEM_ADDER_ONES(benchmark,MNAME,MNAMES) XCCDF_ITEM_ADDER_ONES(profile,MNAME,MNAMES) \
00190 XCCDF_ITEM_ADDER_ONES(group,MNAME,MNAMES) XCCDF_ITEM_ADDER_ONES(rule,MNAME,MNAMES) \
00191 XCCDF_ITEM_ADDER_ONES(value,MNAME,MNAMES) XCCDF_ITEM_ADDER_ONES(result,MNAME,MNAMES)
00192 #define XCCDF_ITEM_ADDER(MTYPE,MNAMES,MNAME) XCCDF_ITEM_ADDER_ONE(item,MNAME,MNAMES,MTYPE,) \
00193 XCCDF_ITEM_ADDER_ONE(benchmark,MNAME,MNAMES,MTYPE,) XCCDF_ITEM_ADDER_ONE(profile,MNAME,MNAMES,MTYPE,) \
00194 XCCDF_ITEM_ADDER_ONE(group,MNAME,MNAMES,MTYPE,) XCCDF_ITEM_ADDER_ONE(rule,MNAME,MNAMES,MTYPE,) \
00195 XCCDF_ITEM_ADDER_ONE(value,MNAME,MNAMES,MTYPE,) XCCDF_ITEM_ADDER_ONE(result,MNAME,MNAMES,MTYPE,)
00196
00197 #define XITERATOR(x) ((struct oscap_iterator*)(x))
00198 #define XCCDF_ITERATOR(n) struct xccdf_##n##_iterator*
00199 #define XCCDF_ITERATOR_FWD(n) struct xccdf_##n##_iterator;
00200 #define XCCDF_ITERATOR_HAS_MORE(n) bool xccdf_##n##_iterator_has_more(XCCDF_ITERATOR(n) it) { return oscap_iterator_has_more(XITERATOR(it)); }
00201 #define XCCDF_ITERATOR_NEXT(t,n) t xccdf_##n##_iterator_next(XCCDF_ITERATOR(n) it) { return oscap_iterator_next(XITERATOR(it)); }
00202 #define XCCDF_ITERATOR_FREE(n) void xccdf_##n##_iterator_free(XCCDF_ITERATOR(n) it) { oscap_iterator_free(XITERATOR(it)); }
00203 #define XCCDF_ITERATOR_GEN_T(t,n) XCCDF_ITERATOR_FWD(n) XCCDF_ITERATOR_HAS_MORE(n) XCCDF_ITERATOR_NEXT(t,n) XCCDF_ITERATOR_FREE(n)
00204 #define XCCDF_ITERATOR_GEN_S(n) XCCDF_ITERATOR_GEN_T(struct xccdf_##n*,n)
00205 #define XCCDF_ITERATOR_GEN_TEXT(n) XCCDF_ITERATOR_GEN_T(struct oscap_text *,n)
00206
00207 #define XCCDF_FREE_GEN(TYPE) void xccdf_##TYPE##_free(struct xccdf_##TYPE* item) { xccdf_##TYPE##_free_impl((struct xccdf_item *)item); }
00208
00209 #endif