/* SPDX-License-Identifier: LGPL-2.1+ */

#include "bpf-dlopen.h"
#include "bpf-link.h"
#include "serialize.h"

bool bpf_can_link_program(struct bpf_program *prog) {
        _cleanup_(bpf_link_freep) struct bpf_link *link = NULL;

        assert(prog);

        if (dlopen_bpf() < 0)
                return false;

        /* Pass invalid cgroup fd intentionally. */
        link = sym_bpf_program__attach_cgroup(prog, /*cgroup_fd=*/-1);

        /* EBADF indicates that bpf_link is supported by kernel. */
        return sym_libbpf_get_error(link) == -EBADF;
}

int bpf_serialize_link(FILE *f, FDSet *fds, const char *key, struct bpf_link *link) {
        assert(key);

        if (!link)
                return -ENOENT;

        if (sym_libbpf_get_error(link) != 0)
                return -EINVAL;

        return serialize_fd(f, fds, key, sym_bpf_link__fd(link));
}

struct bpf_link *bpf_link_free(struct bpf_link *link) {

        /* Avoid a useless dlopen() if link == NULL */
        if (!link)
                return NULL;

        (void) sym_bpf_link__destroy(link);

        return NULL;
}
