handlers.c revision ed6b39cc7746fabdd0d01c96afcf60b9544913d3
1ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker/*
2ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker * Copyright (C) 2011 The Android Open Source Project
3ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker *
4ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker * Licensed under the Apache License, Version 2.0 (the "License");
5ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker * you may not use this file except in compliance with the License.
6ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker * You may obtain a copy of the License at
7ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker *
8ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker *	http://www.apache.org/licenses/LICENSE-2.0
9ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker *
10ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker * Unless required by applicable law or agreed to in writing, software
11ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker * distributed under the License is distributed on an "AS IS" BASIS,
12ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker * See the License for the specific language governing permissions and
14ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker * limitations under the License.
15ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker */
16ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker
17ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker/* NOTICE: This is a clean room re-implementation of libnl */
18ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker
19ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker#include <malloc.h>
20ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker#include "netlink-types.h"
21ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker#include "netlink/handlers.h"
22ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker
23ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker/* Allocate a new callback handle. */
24ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Makerstruct nl_cb *nl_cb_alloc(enum nl_cb_kind kind)
25ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker{
26ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker	struct nl_cb *cb;
27ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker
28ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker	cb = (struct nl_cb *) malloc(sizeof(struct nl_cb));
29ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker	if (cb == NULL)
30ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker		goto fail;
31ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker	memset(cb, 0, sizeof(*cb));
32ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker
33ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker	return nl_cb_get(cb);
34ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Makerfail:
35ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker	return NULL;
36ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker}
37ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker
38ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker/* Clone an existing callback handle */
39ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Makerstruct nl_cb *nl_cb_clone(struct nl_cb *orig)
40ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker{
41ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker	struct nl_cb *new_cb;
42ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker	int new_refcnt;
43ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker
44ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker	new_cb = nl_cb_alloc(NL_CB_DEFAULT);
45ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker	if (new_cb == NULL)
46ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker		goto fail;
47ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker
48ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker	/* Preserve reference count and copy original */
49ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker	new_refcnt = new_cb->cb_refcnt;
50ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker	memcpy(new_cb, orig, sizeof(*orig));
51ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker	new_cb->cb_refcnt = new_refcnt;
52ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker
53ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker	return new_cb;
54ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Makerfail:
55ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker	return NULL;
56ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker}
57ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker
58ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker/* Set up a callback. */
59ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Makerint nl_cb_set(struct nl_cb *cb, enum nl_cb_type type, enum nl_cb_kind kind, \
60ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker	nl_recvmsg_msg_cb_t func, void *arg)
61ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker{
62ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker	cb->cb_set[type] = func;
63ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker	cb->cb_args[type] = arg;
64ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker	return 0;
65ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker}
66ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker
67ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker
68ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker
69ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker/* Set up an error callback. */
70ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Makerint nl_cb_err(struct nl_cb *cb, enum nl_cb_kind kind, \
71ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker	nl_recvmsg_err_cb_t func, void *arg)
72ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker{
73ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker	cb->cb_err = func;
74ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker	cb->cb_err_arg = arg;
75ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker	return 0;
76ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker
77ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker}
78ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker
79ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Makerstruct nl_cb *nl_cb_get(struct nl_cb *cb)
80ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker{
81ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker	cb->cb_refcnt++;
82ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker	return cb;
83ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker}
84ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker
85ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Makervoid nl_cb_put(struct nl_cb *cb)
86ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker{
87ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker	cb->cb_refcnt--;
88ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker	if (cb->cb_refcnt <= 0)
89ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker		free(cb);
90ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker
91ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker}
92ed6b39cc7746fabdd0d01c96afcf60b9544913d3Frank Maker
93