]> git.proxmox.com Git - mirror_frr.git/blob - lib/hook.c
Merge pull request #12798 from donaldsharp/rib_match_multicast
[mirror_frr.git] / lib / hook.c
1 // SPDX-License-Identifier: ISC
2 /*
3 * Copyright (c) 2016 David Lamparter, for NetDEF, Inc.
4 */
5
6 #ifdef HAVE_CONFIG_H
7 #include "config.h"
8 #endif
9
10 #include <string.h>
11
12 #include "memory.h"
13 #include "hook.h"
14
15 DEFINE_MTYPE_STATIC(LIB, HOOK_ENTRY, "Hook entry");
16
17 void _hook_register(struct hook *hook, struct hookent *stackent, void *funcptr,
18 void *arg, bool has_arg, struct frrmod_runtime *module,
19 const char *funcname, int priority)
20 {
21 struct hookent *he, **pos;
22
23 if (!stackent->ent_used)
24 he = stackent;
25 else {
26 he = XCALLOC(MTYPE_HOOK_ENTRY, sizeof(*he));
27 he->ent_on_heap = true;
28 }
29 he->ent_used = true;
30 he->hookfn = funcptr;
31 he->hookarg = arg;
32 he->has_arg = has_arg;
33 he->module = module;
34 he->fnname = funcname;
35 he->priority = priority;
36
37 for (pos = &hook->entries; *pos; pos = &(*pos)->next)
38 if (hook->reverse ? (*pos)->priority < priority
39 : (*pos)->priority >= priority)
40 break;
41
42 he->next = *pos;
43 *pos = he;
44 }
45
46 void _hook_unregister(struct hook *hook, void *funcptr, void *arg, bool has_arg)
47 {
48 struct hookent *he, **prev;
49
50 for (prev = &hook->entries; (he = *prev) != NULL; prev = &he->next)
51 if (he->hookfn == funcptr && he->hookarg == arg
52 && he->has_arg == has_arg) {
53 *prev = he->next;
54 if (he->ent_on_heap)
55 XFREE(MTYPE_HOOK_ENTRY, he);
56 else
57 memset(he, 0, sizeof(*he));
58 break;
59 }
60 }