forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
1.5 KiB
80 lines
1.5 KiB
// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) |
|
/* Copyright (C) 2020 Facebook, Inc. */ |
|
#include <stdlib.h> |
|
#include <errno.h> |
|
#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; |
|
}
|
|
|