/* Copyright 2016 Alex 'AdUser' Z (ad_user@runbox.com) * * 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. */ typedef struct cfg_id_t { struct cfg_id_t *next; char name[ID_MAX + 1]; size_t count; } cfg_id_t; /* this list needed for tracking backend usage with `shared = yes` */ cfg_id_t *ids_usage = NULL; static size_t usage_inc(const char *id) { cfg_id_t *e = NULL; assert(id != NULL); for (e = ids_usage; e != NULL; e = e->next) { if (strcmp(e->name, id) != 0) continue; /* found */ e->count++; return e->count; } /* not found or list is empty */ e = calloc(1, sizeof(cfg_id_t)); strlcpy(e->name, id, sizeof(e->name)); e->count++; e->next = ids_usage; ids_usage = e; return e->count; } static size_t usage_dec(const char *id) { cfg_id_t *e = NULL; assert(id != NULL); for (e = ids_usage; e != NULL; e = e->next) { if (strcmp(e->name, id) != 0) continue; /* found */ if (e->count > 0) e->count--; return e->count; } /* not found or list is empty */ return 0; } static void logcb_stub(enum loglevel lvl, const char *str) { assert(str != NULL); (void)(lvl); (void)(str); } __attribute__ ((format (printf, 3, 4))) static void log_msg(const cfg_t *cfg, enum loglevel lvl, const char *format, ...) { char buf[4096] = ""; va_list args; size_t len; len = snprintf(buf, sizeof(buf), "backend/%s: ", MODNAME); va_start(args, format); vsnprintf(buf + len, sizeof(buf) - len, format, args); va_end(args); cfg->logcb(lvl, buf); } void logcb(cfg_t *cfg, void (*cb)(enum loglevel lvl, const char *msg)) { assert(cfg != NULL); assert(cb != NULL); cfg->logcb = cb; } int state(cfg_t *cfg) { assert(cfg != NULL); return cfg->flags; }