1 /* 2 * Copyright (c) 2015-16 David Lamparter, for NetDEF, Inc. 3 * 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. 7 * 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. 15 */ 16 17 #ifndef _FRR_MODULE_H 18 #define _FRR_MODULE_H 19 20 #include <stdint.h> 21 #include <stdbool.h> 22 23 #ifdef __cplusplus 24 extern "C" { 25 #endif 26 27 struct frrmod_runtime; 28 29 struct frrmod_info { 30 /* single-line few-word title */ 31 const char *name; 32 /* human-readable version number, should not contain spaces */ 33 const char *version; 34 /* one-paragraph description */ 35 const char *description; 36 37 int (*init)(void); 38 }; 39 40 /* primary entry point structure to be present in loadable module under 41 * "_frrmod_this_module" dlsym() name 42 * 43 * note space for future extensions is reserved below, so other modules 44 * (e.g. memory management, hooks) can add fields 45 * 46 * const members/info are in frrmod_info. 47 */ 48 struct frrmod_runtime { 49 struct frrmod_runtime *next; 50 51 const struct frrmod_info *info; 52 void *dl_handle; 53 bool finished_loading; 54 55 char *load_name; 56 char *load_args; 57 }; 58 59 /* space-reserving foo */ 60 struct _frrmod_runtime_size { 61 struct frrmod_runtime r; 62 /* this will barf if frrmod_runtime exceeds 1024 bytes ... */ 63 uint8_t space[1024 - sizeof(struct frrmod_runtime)]; 64 }; 65 union _frrmod_runtime_u { 66 struct frrmod_runtime r; 67 struct _frrmod_runtime_size s; 68 }; 69 70 extern union _frrmod_runtime_u _frrmod_this_module; 71 #define THIS_MODULE (&_frrmod_this_module.r) 72 73 #define FRR_COREMOD_SETUP(...) \ 74 static const struct frrmod_info _frrmod_info = {__VA_ARGS__}; \ 75 DSO_LOCAL union _frrmod_runtime_u _frrmod_this_module = {{ \ 76 NULL, \ 77 &_frrmod_info, \ 78 }}; 79 #define FRR_MODULE_SETUP(...) \ 80 FRR_COREMOD_SETUP(__VA_ARGS__) \ 81 DSO_SELF struct frrmod_runtime *frr_module = &_frrmod_this_module.r; 82 83 extern struct frrmod_runtime *frrmod_list; 84 85 extern void frrmod_init(struct frrmod_runtime *modinfo); 86 extern struct frrmod_runtime *frrmod_load(const char *spec, const char *dir, 87 char *err, size_t err_len); 88 #if 0 89 /* not implemented yet */ 90 extern void frrmod_unload(struct frrmod_runtime *module); 91 #endif 92 93 #ifdef __cplusplus 94 } 95 #endif 96 97 #endif /* _FRR_MODULE_H */ 98