// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) /* Copyright (C) 2020 Facebook, Inc. */ #include #include #include "testing_helpers.h" int parse_num_list(const char *s, bool **num_set, int *num_set_len) { int i, set_len = 0, new_len, num, start = 0, end = -1; bool *set = NULL, *tmp, parsing_end = false; char *next; while (s[0]) { errno = 0; num = strtol(s, &next, 10); if (errno) return -errno; if (parsing_end) end = num; else start = num; if (!parsing_end && *next == '-') { s = next + 1; parsing_end = true; continue; } else if (*next == ',') { parsing_end = false; s = next + 1; end = num; } else if (*next == '\0') { parsing_end = false; s = next; end = num; } else { return -EINVAL; } if (start > end) return -EINVAL; if (end + 1 > set_len) { new_len = end + 1; tmp = realloc(set, new_len); if (!tmp) { free(set); return -ENOMEM; } for (i = set_len; i < start; i++) tmp[i] = false; set = tmp; set_len = new_len; } for (i = start; i <= end; i++) set[i] = true; } if (!set) return -EINVAL; *num_set = set; *num_set_len = set_len; return 0; } __u32 link_info_prog_id(const struct bpf_link *link, struct bpf_link_info *info) { __u32 info_len = sizeof(*info); int err; memset(info, 0, sizeof(*info)); err = bpf_obj_get_info_by_fd(bpf_link__fd(link), info, &info_len); if (err) { printf("failed to get link info: %d\n", -errno); return 0; } return info->prog_id; }