}
static int
-list_adt(struct ipset_session *session, struct nlattr *nla[])
+list_adt(struct ipset_session *session, struct nlattr *nla[], const bool first_in_list)
{
const struct ipset_data *data = session->data;
const struct ipset_type *type;
const struct ipset_arg *arg;
size_t offset = 0;
int i, found = 0;
- static char last_setname[IPSET_MAXNAMELEN] = "";
D("enter");
/* Check and load type, family */
break;
case IPSET_LIST_JSON:
/* print separator if a member for this set was printed before */
- if (!session->sort && STREQ(ipset_data_setname(data), last_setname))
+ if (!session->sort && !first_in_list)
safe_snprintf(session, ",");
- strcpy(last_setname, ipset_data_setname(data));
+
safe_snprintf(session, "\n {\n \"elem\" : \"");
break;
case IPSET_LIST_PLAIN:
const struct ipset_arg *arg;
uint8_t family;
int i;
- static bool firstipset = true;
for (i = IPSET_ATTR_UNSPEC + 1; i <= IPSET_ATTR_CREATE_MAX; i++)
if (nla[i]) {
break;
case IPSET_LIST_JSON:
ipset_envopt_set(session, IPSET_ENV_QUOTED);
- if (!firstipset)
+ if (session->saved_setname[0] != '\0')
safe_snprintf(session, ",\n");
- firstipset = false;
safe_snprintf(session,
" \{\n"
" \"name\" : \"%s\",\n"
enum ipset_cmd cmd)
{
struct ipset_data *data = session->data;
- static bool firstipset = true;
if (setjmp(printf_failure)) {
session->saved_setname[0] = '\0';
safe_snprintf(session, "<ipset name=\"%s\"/>\n",
ipset_data_setname(data));
else if (session->mode == IPSET_LIST_JSON) {
- if (!firstipset)
+ if (session->saved_setname[0] != '\0')
safe_snprintf(session, ",\n");
- firstipset = false;
safe_snprintf(session, " { \"name\" : \"%s\" }",
ipset_data_setname(data));
} else
safe_snprintf(session, "%s\n",
ipset_data_setname(data));
+ strcpy(session->saved_setname, ipset_data_setname(data));
return call_outfn(session) ? MNL_CB_ERROR : MNL_CB_OK;
}
if (nla[IPSET_ATTR_ADT] != NULL) {
struct nlattr *tb, *adt[IPSET_ATTR_ADT_MAX+1];
+ bool first_in_list = true;
mnl_attr_for_each_nested(tb, nla[IPSET_ATTR_ADT]) {
D("ADT attributes for %s", ipset_data_setname(data));
FAILURE("Broken %s kernel message: "
"cannot validate ADT attributes!",
cmd2name[cmd]);
- if (list_adt(session, adt) != MNL_CB_OK)
+ if (list_adt(session, adt, first_in_list) != MNL_CB_OK)
return MNL_CB_ERROR;
+ first_in_list = false;
}
if (session->sort)
return MNL_CB_OK;