]>
git.proxmox.com Git - mirror_frr.git/blob - lib/hook.c
2 * Copyright (c) 2016 David Lamparter, for NetDEF, Inc.
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
24 DEFINE_MTYPE_STATIC(LIB
, HOOK_ENTRY
, "Hook entry")
26 void _hook_register(struct hook
*hook
, void *funcptr
, void *arg
, bool has_arg
,
27 struct frrmod_runtime
*module
, const char *funcname
,
30 struct hookent
*he
= XCALLOC(MTYPE_HOOK_ENTRY
, sizeof(*he
)), **pos
;
33 he
->has_arg
= has_arg
;
35 he
->fnname
= funcname
;
36 he
->priority
= priority
;
38 for (pos
= &hook
->entries
; *pos
; pos
= &(*pos
)->next
)
39 if (hook
->reverse
? (*pos
)->priority
< priority
40 : (*pos
)->priority
>= priority
)
47 void _hook_unregister(struct hook
*hook
, void *funcptr
, void *arg
, bool has_arg
)
49 struct hookent
*he
, **prev
;
51 for (prev
= &hook
->entries
; (he
= *prev
) != NULL
; prev
= &he
->next
)
52 if (he
->hookfn
== funcptr
&& he
->hookarg
== arg
53 && he
->has_arg
== has_arg
) {
55 XFREE(MTYPE_HOOK_ENTRY
, he
);