123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- /*
- * lib/handlers.c default netlink message handlers
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation version 2.1
- * of the License.
- *
- * Copyright (c) 2003-2008 Thomas Graf <tgraf@suug.ch>
- */
- /**
- * @ingroup core
- * @defgroup cb Callbacks/Customization
- *
- * @details
- * @par 1) Setting up a callback set
- * @code
- * // Allocate a callback set and initialize it to the verbose default set
- * struct nl_cb *cb = nl_cb_alloc(NL_CB_VERBOSE);
- *
- * // Modify the set to call my_func() for all valid messages
- * nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, my_func, NULL);
- *
- * // Set the error message handler to the verbose default implementation
- * // and direct it to print all errors to the given file descriptor.
- * FILE *file = fopen(...);
- * nl_cb_err(cb, NL_CB_VERBOSE, NULL, file);
- * @endcode
- * @{
- */
- #include <netlink-local.h>
- #include <netlink/netlink.h>
- #include <netlink/utils.h>
- #include <netlink/msg.h>
- #include <netlink/handlers.h>
- /**
- * @name Callback Handle Management
- * @{
- */
- /**
- * Allocate a new callback handle
- * @arg kind callback kind to be used for initialization
- * @return Newly allocated callback handle or NULL
- */
- struct nl_cb *nl_cb_alloc(enum nl_cb_kind kind)
- {
- int i;
- struct nl_cb *cb;
- if (kind < 0 || kind > NL_CB_KIND_MAX)
- return NULL;
- cb = calloc(1, sizeof(*cb));
- if (!cb)
- return NULL;
- cb->cb_refcnt = 1;
- for (i = 0; i <= NL_CB_TYPE_MAX; i++)
- nl_cb_set(cb, i, kind, NULL, NULL);
- nl_cb_err(cb, kind, NULL, NULL);
- return cb;
- }
- /**
- * Clone an existing callback handle
- * @arg orig original callback handle
- * @return Newly allocated callback handle being a duplicate of
- * orig or NULL
- */
- struct nl_cb *nl_cb_clone(struct nl_cb *orig)
- {
- struct nl_cb *cb;
-
- cb = nl_cb_alloc(NL_CB_DEFAULT);
- if (!cb)
- return NULL;
- memcpy(cb, orig, sizeof(*orig));
- cb->cb_refcnt = 1;
- return cb;
- }
- void nl_cb_put(struct nl_cb *cb)
- {
- if (!cb)
- return;
- cb->cb_refcnt--;
- if (cb->cb_refcnt < 0)
- BUG();
- if (cb->cb_refcnt <= 0)
- free(cb);
- }
- /** @} */
- /**
- * @name Callback Setup
- * @{
- */
- /**
- * Set up a callback
- * @arg cb callback set
- * @arg type callback to modify
- * @arg kind kind of implementation
- * @arg func callback function (NL_CB_CUSTOM)
- * @arg arg argument passed to callback
- *
- * @return 0 on success or a negative error code
- */
- int nl_cb_set(struct nl_cb *cb, enum nl_cb_type type, enum nl_cb_kind kind,
- nl_recvmsg_msg_cb_t func, void *arg)
- {
- if (type < 0 || type > NL_CB_TYPE_MAX)
- return -NLE_RANGE;
- if (kind < 0 || kind > NL_CB_KIND_MAX)
- return -NLE_RANGE;
- if (kind == NL_CB_CUSTOM) {
- cb->cb_set[type] = func;
- cb->cb_args[type] = arg;
- }
- return 0;
- }
- /**
- * Set up an error callback
- * @arg cb callback set
- * @arg kind kind of callback
- * @arg func callback function
- * @arg arg argument to be passed to callback function
- */
- int nl_cb_err(struct nl_cb *cb, enum nl_cb_kind kind,
- nl_recvmsg_err_cb_t func, void *arg)
- {
- if (kind < 0 || kind > NL_CB_KIND_MAX)
- return -NLE_RANGE;
- if (kind == NL_CB_CUSTOM) {
- cb->cb_err = func;
- cb->cb_err_arg = arg;
- }
- return 0;
- }
- /** @} */
- /** @} */
|