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 
12 void 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 
19 int 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 
42 int 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 }