diff options
Diffstat (limited to 'src/nlapi.c')
-rw-r--r-- | src/nlapi.c | 130 |
1 files changed, 0 insertions, 130 deletions
diff --git a/src/nlapi.c b/src/nlapi.c deleted file mode 100644 index 318199f..0000000 --- a/src/nlapi.c +++ /dev/null @@ -1,130 +0,0 @@ -/* $Id$ */ - -/* - * This file is part of waproamd. - * - * waproamd is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * waproamd is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with waproamd; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. - */ - -#include <stdio.h> -#include <string.h> -#include <unistd.h> -#include <errno.h> -#include <assert.h> -#include <stdlib.h> - -#include <libdaemon/dlog.h> - -#include "nlapi.h" - -int nlapi_fd = -1; - -struct callback_info { - nlapi_callback_t callback; - void *userdata; - struct callback_info * next; -}; - -struct callback_info *callbacks = NULL; - -int nlapi_open(uint32_t groups) { - struct sockaddr_nl addr; - - if ((nlapi_fd = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE)) < 0) { - daemon_log(LOG_ERR, "socket(PF_NETLINK): %s\n", strerror(errno)); - return -1; - } - - memset(&addr, 0, sizeof(addr)); - addr.nl_family = AF_NETLINK; - addr.nl_groups = groups; - addr.nl_pid = getpid(); - - if (bind(nlapi_fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) { - close(nlapi_fd); - daemon_log(LOG_ERR, "bind(): %s\n", strerror(errno)); - return -1; - } - - return 0; -} - -int nlapi_work(int block) { - - assert(nlapi_fd >= 0); - - for (;;) { - int bytes; - char replybuf[1024]; - struct nlmsghdr *p = (struct nlmsghdr *) replybuf; - - if ((bytes = recv(nlapi_fd, &replybuf, sizeof(replybuf), block ? 0 : MSG_DONTWAIT)) < 0) { - - if (errno == EAGAIN || errno == EINTR) - return 0; - - daemon_log(LOG_ERR, "NLAPI: recv(): %s\n", strerror(errno)); - return -1; - } - - for (; bytes > 0; p = NLMSG_NEXT(p, bytes)) { - struct callback_info *c; - - if (!NLMSG_OK(p, bytes) || bytes < sizeof(struct nlmsghdr) || bytes < p->nlmsg_len) { - daemon_log(LOG_ERR, "NLAPI: Packet too small or truncated!\n"); - return -1; - } - - for (c = callbacks; c; c = c->next) - if (c->callback(p, c->userdata) < 0) - return -1; - } - - if (block) - break; - } - - return 0; -} - -void nlapi_close(void) { - if (nlapi_fd >= 0) - close(nlapi_fd); - nlapi_fd = -1; - - while (callbacks) { - struct callback_info *c = callbacks; - callbacks = callbacks->next; - free(c); - } -} - -int nlapi_register(int (*callback) (struct nlmsghdr *n, void *u), void *u) { - struct callback_info *c; - - assert(callback); - - if (!(c = malloc(sizeof(struct callback_info)))) { - daemon_log(LOG_ERR, "NLAPI: Not enough memory.\n"); - return -1; - } - - c->callback = callback; - c->userdata = u; - - c->next = callbacks; - callbacks = c; - return 0; -} |