libnftnl  1.3.1
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  switch(mnl_attr_get_type(attr)) {
49  default:
50  return -1;
51  case NFTA_DEVICE_NAME:
52  case NFTA_DEVICE_PREFIX:
53  len++;
54  }
55  }
56 
57  nftnl_str_array_clear(sa);
58  sa->array = calloc(len + 1, sizeof(char *));
59  if (!sa->array)
60  return -1;
61 
62  mnl_attr_for_each_nested(attr, nest) {
63  sa->array[sa->len] = nftnl_attr_get_ifname(attr);
64  if (!sa->array[sa->len]) {
65  nftnl_str_array_clear(sa);
66  return -1;
67  }
68  sa->len++;
69  }
70  return 0;
71 }