#define TARGET_ACCEPT "ACCEPT"
#define TARGET_DROP "DROP"
+#define TARGET_RETURN "RETURN"
#define RULE_CHAIN "chain"
#define RULE_TYPE "type"
static char g_rule_nfacct[MENU_DATA_SIZE] = "";
static char g_rule_target[MENU_DATA_SIZE] = "0";
-static __thread GSList *g_rule_list = NULL;
+static ipt_rule_s *g_rule = NULL;
static void __test_print_rule(ipt_rule_s *rule)
{
msg(HR_SINGLE);
}
-static int __test_append_rule_to_list(void)
+static void __test_rule_free(ipt_rule_s *rule)
{
- ipt_rule_s *rule;
+ FREE(rule->chain);
+ FREE(rule->ifname);
+ FREE(rule->nfacct_name);
+ FREE(rule->target);
+
+ FREE(rule);
+ rule = NULL;
+}
+static int __test_set_rule(void)
+{
int type = (int)strtol(g_rule_type, NULL, 10);
int classid = (int)strtol(g_rule_cgroup, NULL, 10);
int target = (int)strtol(g_rule_target, NULL, 10);
if (g_rule_chain[0] == '\0' ||
- g_rule_ifname[0] == '\0' ||
- g_rule_nfacct[0] == '\0' ||
type < IPTABLES_RULE_IN ||
type > IPTABLES_RULE_OUT ||
- classid < 0 ||
target < IPTABLES_ACTION_NONE ||
target > IPTABLES_ACTION_DROP) {
msg(LOG_RED "Invalid parameter" LOG_END);
return STC_ERROR_INVALID_PARAMETER;
}
- rule = g_try_new0(ipt_rule_s, 1);
- if (rule == NULL) {
+ if (g_rule)
+ __test_rule_free(g_rule);
+
+ g_rule = g_try_new0(ipt_rule_s, 1);
+ if (g_rule == NULL) {
msg(LOG_RED "Out of memory" LOG_END);
return STC_ERROR_OUT_OF_MEMORY;
}
- memset(rule, 0, sizeof(ipt_rule_s));
- rule->chain = g_strdup(g_rule_chain);
- rule->type = type;
- rule->ifname = g_strdup(g_rule_ifname);
- rule->classid = classid;
- rule->nfacct_name = g_strdup(g_rule_nfacct);
+ memset(g_rule, 0, sizeof(ipt_rule_s));
+ g_rule->chain = g_strdup(g_rule_chain);
+ g_rule->type = type;
+ if (g_rule_ifname[0] != '\0')
+ g_rule->ifname = g_strdup(g_rule_ifname);
+ if (classid > 0)
+ g_rule->classid = classid;
+ if (g_rule_nfacct[0] != '\0')
+ g_rule->nfacct_name = g_strdup(g_rule_nfacct);
switch (target) {
case IPTABLES_ACTION_ACCEPT:
- rule->target = g_strdup(TARGET_ACCEPT);
+ g_rule->target = g_strdup(TARGET_ACCEPT);
break;
case IPTABLES_ACTION_DROP:
- rule->target = g_strdup(TARGET_DROP);
+ g_rule->target = g_strdup(TARGET_DROP);
break;
default:
- rule->target = NULL;
+ g_rule->target = g_strdup(TARGET_RETURN);;
break;
}
- g_rule_list = g_slist_append(g_rule_list, rule);
- __test_print_rule(rule);
-
return STC_ERROR_NONE;
}
-static void __test_get_rule_list(void)
-{
- GSList *list;
-
- for (list = g_rule_list; list; list = list->next) {
- ipt_rule_s *rule = (ipt_rule_s *)list->data;
- __test_print_rule(rule);
- }
-}
-
-static void __test_list_free_func(gpointer data)
-{
- ipt_rule_s *rule = (ipt_rule_s *)data;
-
- FREE(rule->chain);
- FREE(rule->ifname);
- FREE(rule->nfacct_name);
- FREE(rule->target);
- FREE(rule);
-}
-
-static void __test_remove_rule_list(void)
-{
- if (g_rule_list != NULL)
- g_slist_free_full(g_rule_list, __test_list_free_func);
-
- g_rule_list = NULL;
-}
-
-static int test_stc_ipt_add_rule(MManager *mm, struct menu_data *menu)
+static int test_stc_ipt_set_rule(MManager *mm, struct menu_data *menu)
{
int ret = STC_ERROR_NONE;
- ret = __test_append_rule_to_list();
+ ret = __test_set_rule();
if (ret != STC_ERROR_NONE) {
msg(LOG_RED "Failed to add rule to list" LOG_END);
return ret;
}
- msg(LOG_GREEN "Successfully add rule" LOG_END);
-
- return ret;
-}
-
-static int test_stc_ipt_get_rules(MManager *mm, struct menu_data *menu)
-{
- int ret = STC_ERROR_NONE;
-
- __test_get_rule_list();
- msg(LOG_GREEN "Successfully get rule" LOG_END);
-
- return ret;
-}
-
-static int test_stc_ipt_reset_rules(MManager *mm, struct menu_data *menu)
-{
- int ret = STC_ERROR_NONE;
-
- __test_remove_rule_list();
- msg(LOG_GREEN "Successfully reset rule" LOG_END);
+ __test_print_rule(g_rule);
+ msg(LOG_GREEN "Successfully add rule" LOG_END);
return ret;
}
g_variant_builder_add(builder, "{sv}", RULE_TYPE,
g_variant_new_uint32(rule->type));
- g_variant_builder_add(builder, "{sv}", RULE_IFNAME,
+ if (rule->ifname)
+ g_variant_builder_add(builder, "{sv}", RULE_IFNAME,
g_variant_new_string(rule->ifname));
- g_variant_builder_add(builder, "{sv}", RULE_CGROUP,
+ if (rule->classid > 0)
+ g_variant_builder_add(builder, "{sv}", RULE_CGROUP,
g_variant_new_uint32(rule->classid));
- g_variant_builder_add(builder, "{sv}", RULE_NFACCT,
+ if (rule->nfacct_name)
+ g_variant_builder_add(builder, "{sv}", RULE_NFACCT,
g_variant_new_string(rule->nfacct_name));
if (rule->target)
}
-static int __test_make_rule_params(GVariantBuilder *builder,
- ipt_rule_s *rule)
-{
- GVariantBuilder sub_builder;
-
- if (builder == NULL || rule == NULL)
- return STC_ERROR_INVALID_PARAMETER;
-
- g_variant_builder_init(&sub_builder, G_VARIANT_TYPE("a{sv}"));
- __test_add_rule_info_to_builder(&sub_builder, rule);
- __test_print_rule(rule);
- g_variant_builder_add_value(builder, g_variant_builder_end(&sub_builder));
-
- return STC_ERROR_NONE;
-}
-
-static int __stc_ipt_add_rules(void)
+static int __stc_ipt_add_rule(void)
{
int err = STC_ERROR_NONE;
- int len = 0;
int result = 0;
GVariantBuilder *builder = NULL;
GVariant *params = NULL;
GVariant *message = NULL;
- GSList *list;
-
- len = g_slist_length(g_rule_list);
- if (len == 0) {
- msg(LOG_RED "There are no rules" LOG_END);
- return STC_ERROR_INVALID_OPERATION;
- }
-
- builder = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
-
- for (list = g_rule_list; list; list = list->next) {
- ipt_rule_s *rule = (ipt_rule_s *)list->data;
- err = __test_make_rule_params(builder, rule);
- if (err != STC_ERROR_NONE) {
- g_variant_builder_unref(builder);
- return err;
- }
- }
- params = g_variant_new("(aa{sv})", builder);
+ builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+ __test_add_rule_info_to_builder(builder, g_rule);
+ params = g_variant_new("(a{sv})", builder);
g_variant_builder_unref(builder);
- err = STC_ERROR_NONE;
message = stc_ipt_dbus_invoke_method(
STC_IPT_DBUS_SERVICE,
STC_IPT_DBUS_RULE_PATH,
return STC_ERROR_NONE;
}
-static int __stc_ip6t_add_rules(void)
+static int __stc_ip6t_add_rule(void)
{
int err = STC_ERROR_NONE;
- int len = 0;
int result = 0;
GVariantBuilder *builder = NULL;
GVariant *params = NULL;
GVariant *message = NULL;
- GSList *list;
-
- len = g_slist_length(g_rule_list);
- if (len == 0) {
- msg(LOG_RED "There are no rules" LOG_END);
- return STC_ERROR_INVALID_OPERATION;
- }
-
- builder = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
-
- for (list = g_rule_list; list; list = list->next) {
- ipt_rule_s *rule = (ipt_rule_s *)list->data;
- err = __test_make_rule_params(builder, rule);
- if (err != STC_ERROR_NONE) {
- g_variant_builder_unref(builder);
- return err;
- }
- }
- params = g_variant_new("(aa{sv})", builder);
+ builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+ __test_add_rule_info_to_builder(builder, g_rule);
+ params = g_variant_new("(a{sv})", builder);
g_variant_builder_unref(builder);
- err = STC_ERROR_NONE;
message = stc_ipt_dbus_invoke_method(
STC_IPT_DBUS_SERVICE,
STC_IPT_DBUS_RULE_PATH,
}
-static int __stc_ipt_remove_rules(void)
+static int __stc_ipt_remove_rule(void)
{
int err = STC_ERROR_NONE;
- int len = 0;
int result = 0;
GVariantBuilder *builder = NULL;
GVariant *params = NULL;
GVariant *message = NULL;
- GSList *list;
-
- len = g_slist_length(g_rule_list);
- if (len == 0) {
- msg(LOG_RED "There are no rules" LOG_END);
- return STC_ERROR_INVALID_OPERATION;
- }
-
- builder = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
- for (list = g_rule_list; list; list = list->next) {
- ipt_rule_s *rule = (ipt_rule_s *)list->data;
- err = __test_make_rule_params(builder, rule);
- if (err != STC_ERROR_NONE) {
- g_variant_builder_unref(builder);
- return err;
- }
- }
-
- params = g_variant_new("(aa{sv})", builder);
+ builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+ __test_add_rule_info_to_builder(builder, g_rule);
+ params = g_variant_new("(a{sv})", builder);
g_variant_builder_unref(builder);
- err = STC_ERROR_NONE;
message = stc_ipt_dbus_invoke_method(
STC_IPT_DBUS_SERVICE,
STC_IPT_DBUS_RULE_PATH,
return STC_ERROR_NONE;
}
-static int __stc_ip6t_remove_rules(void)
+static int __stc_ip6t_remove_rule(void)
{
int err = STC_ERROR_NONE;
- int len = 0;
int result = 0;
GVariantBuilder *builder = NULL;
GVariant *params = NULL;
GVariant *message = NULL;
- GSList *list;
-
- len = g_slist_length(g_rule_list);
- if (len == 0) {
- msg(LOG_RED "There are no rules" LOG_END);
- return STC_ERROR_INVALID_OPERATION;
- }
- builder = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
-
- for (list = g_rule_list; list; list = list->next) {
- ipt_rule_s *rule = (ipt_rule_s *)list->data;
- err = __test_make_rule_params(builder, rule);
- if (err != STC_ERROR_NONE) {
- g_variant_builder_unref(builder);
- return err;
- }
- }
-
- params = g_variant_new("(aa{sv})", builder);
+ builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+ __test_add_rule_info_to_builder(builder, g_rule);
+ params = g_variant_new("(a{sv})", builder);
g_variant_builder_unref(builder);
err = STC_ERROR_NONE;
return STC_ERROR_NONE;
}
-static int test_stc_ipt_add_rules(MManager *mm, struct menu_data *menu)
+static int test_stc_ipt_add_rule(MManager *mm, struct menu_data *menu)
{
int err = STC_ERROR_NONE;
- err = __stc_ipt_add_rules();
+ err = __stc_ipt_add_rule();
if (err != STC_ERROR_NONE)
- msg(LOG_RED "Failed to add rules" LOG_END);
+ msg(LOG_RED "Failed to add rule" LOG_END);
- err = __stc_ip6t_add_rules();
+ err = __stc_ip6t_add_rule();
if (err != STC_ERROR_NONE)
- msg(LOG_RED "Failed to add 6 rules" LOG_END);
+ msg(LOG_RED "Failed to add 6 rule" LOG_END);
return err;
}
-static int test_stc_ipt_remove_rules(MManager *mm, struct menu_data *menu)
+static int test_stc_ipt_remove_rule(MManager *mm, struct menu_data *menu)
{
int err = STC_ERROR_NONE;
- err = __stc_ipt_remove_rules();
+ err = __stc_ipt_remove_rule();
if (err != STC_ERROR_NONE)
- msg(LOG_RED "Failed to remove rules" LOG_END);
+ msg(LOG_RED "Failed to remove rule" LOG_END);
- err = __stc_ip6t_remove_rules();
+ err = __stc_ip6t_remove_rule();
if (err != STC_ERROR_NONE)
- msg(LOG_RED "Failed to remove 6 rules" LOG_END);
+ msg(LOG_RED "Failed to remove 6 rule" LOG_END);
return err;
}
-int test_stc_ipt_clear_rule_list(void)
+int test_stc_ipt_clear_rule(void)
{
- __test_remove_rule_list();
+ if (g_rule)
+ __test_rule_free(g_rule);
}
static struct menu_data menu_set[] = {
{ "4", "cgroup classid", NULL, NULL, g_rule_cgroup},
{ "5", "nfacct name", NULL, NULL, g_rule_nfacct},
{ "6", "target (0.NONE/1.ACCEPT/2.DROP)", NULL, NULL, g_rule_target},
- { "a", LOG_LIGHTBLUE "[Add]" LOG_END " rule to list", NULL, test_stc_ipt_add_rule, NULL},
+ { "s", LOG_LIGHTBLUE "[Set]" LOG_END " rule", NULL, test_stc_ipt_set_rule, NULL},
{ NULL, NULL, },
};
struct menu_data menu_rule[] = {
- { "1", LOG_LIGHTBLUE "[Set]" LOG_END " rule list", menu_set, NULL, NULL},
- { "2", LOG_LIGHTBLUE "[Get]" LOG_END " rule list", NULL, test_stc_ipt_get_rules, NULL},
- { "3", LOG_LIGHTBLUE "[Reset]" LOG_END " rule list", NULL, test_stc_ipt_reset_rules, NULL},
- { "a", LOG_LIGHTMAGENTA "[Add]" LOG_END " rules", NULL, test_stc_ipt_add_rules, NULL},
- { "r", LOG_LIGHTMAGENTA "[Remove]" LOG_END " rules", NULL, test_stc_ipt_remove_rules, NULL},
+ { "1", LOG_LIGHTMAGENTA "[Set]" LOG_END " rule info", menu_set, NULL, NULL},
+ { "a", LOG_LIGHTBLUE "[Add]" LOG_END " rule", NULL, test_stc_ipt_add_rule, NULL},
+ { "r", LOG_LIGHTMAGENTA "[Remove]" LOG_END " rule", NULL, test_stc_ipt_remove_rule, NULL},
{ NULL, NULL, },
};