libnftnl 1.2.9
str_array.c
1/* SPDX-License-Identifier: GPL-2.0-or-later */
2/*
3 * (C) 2024 Red Hat GmbH
4 * Author: Phil Sutter <phil@nwl.cc>
5 */
6#include <libmnl/libmnl.h>
7#include <linux/netfilter/nf_tables.h>
8
9#include "str_array.h"
10#include "utils.h"
11
12void nftnl_str_array_clear(struct nftnl_str_array *sa)
13{
14 while (sa->len > 0)
15 free(sa->array[--sa->len]);
16 free(sa->array);
17}
18
19int nftnl_str_array_set(struct nftnl_str_array *sa, const char * const *array)
20{
21 int len = 0;
22
23 while (array[len])
24 len++;
25
26 nftnl_str_array_clear(sa);
27 sa->array = calloc(len + 1, sizeof(char *));
28 if (!sa->array)
29 return -1;
30
31 while (sa->len < len) {
32 sa->array[sa->len] = strdup(array[sa->len]);
33 if (!sa->array[sa->len]) {
34 nftnl_str_array_clear(sa);
35 return -1;
36 }
37 sa->len++;
38 }
39 return 0;
40}
41
42int nftnl_parse_devs(struct nftnl_str_array *sa, const struct nlattr *nest)
43{
44 struct nlattr *attr;
45 int len = 0;
46
47 mnl_attr_for_each_nested(attr, nest) {
48 if (mnl_attr_get_type(attr) != NFTA_DEVICE_NAME)
49 return -1;
50 len++;
51 }
52
53 nftnl_str_array_clear(sa);
54 sa->array = calloc(len + 1, sizeof(char *));
55 if (!sa->array)
56 return -1;
57
58 mnl_attr_for_each_nested(attr, nest) {
59 sa->array[sa->len] = strdup(mnl_attr_get_str(attr));
60 if (!sa->array[sa->len]) {
61 nftnl_str_array_clear(sa);
62 return -1;
63 }
64 sa->len++;
65 }
66 return 0;
67}