/* * libdect public API functions * * Copyright (c) 2009 Patrick McHardy * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ #include #include #include #include #include #include #include #include static void __fmtstring(1, 0) (*debug_hook)(const char *fmt, va_list ap); void dect_set_debug_hook(void (*fn)(const char *fmt, va_list ap)) { debug_hook = fn; } void __fmtstring(1, 2) dect_debug(const char *fmt, ...) { va_list ap; va_start(ap, fmt); if (debug_hook != NULL) debug_hook(fmt, ap); else vprintf(fmt, ap); va_end(ap); } struct dect_handle *dect_alloc_handle(struct dect_ops *ops) { struct dect_handle *dh; if (ops->malloc == NULL) ops->malloc = malloc; if (ops->free == NULL) ops->free = free; dh = ops->malloc(sizeof(*dh)); if (dh == NULL) return NULL; dh->ops = ops; init_list_head(&dh->links); return dh; } int dect_init(struct dect_handle *dh) { int err; err = dect_netlink_init(dh); if (err < 0) goto err1; err = dect_lce_init(dh); if (err < 0) goto err2; return 0; err2: dect_netlink_exit(dh); err1: return err; } void dect_close_handle(struct dect_handle *dh) { dect_lce_exit(dh); dect_netlink_exit(dh); dect_free(dh, dh); }