/*
 * -------------------------------------------------------
 * Copyright (C) 2002-2007 Tommi Saviranta <wnd@iki.fi>
 *	(C) 1998-2002 Sebastian Kienzl <zap@riot.org>
 * -------------------------------------------------------
 * This program 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.
 *
 * This program 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.
 */

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif /* ifdef HAVE_CONFIG_H */

#include "perm.h"
#include "common.h"
#include "miau.h"
#include "match.h"

#include <stdlib.h>
#include <string.h>



/*
 * Add entry to permlist.
 *
 * Skip adding if parameters are invalid.
 */
void
add_perm(permlist_type *list, char *name, const int allowed)
{
	perm_type	*perm;
	llist_node	*node;

	/* Don't allow permissions without name (identifier). */
	if (name == NULL) {
		return;
	}

	perm = (perm_type *) xmalloc(sizeof(perm_type));
	perm->name = name;
	perm->allowed = allowed;
	node = llist_create(perm);
	llist_add_tail(node, &list->list);
} /* void add_perm(permlist_type *list, char *name, const int allowed) */



void
empty_perm(permlist_type *list)
{
	llist_node	*node;
	llist_node	*next;

	node = list->list.head;
	while (node != NULL) {
		next = node->next;
		xfree(((perm_type *) node->data)->name);
		xfree(node->data);
		llist_delete(node, &list->list);
		node = next;
	}
} /* void empty_perm(permlist_type *list) */



/*
 * Is given mask permitted to ?
 */
int
is_perm(permlist_type *list, const char *name)
{
	llist_node	*node;
	int		allowed = 0;
	char		*host;

	/* Set hostname if it is known. */
	if (status.goodhostname != 0) {
		host = status.idhostname + status.goodhostname;
	} else {
		host = NULL;
	}

	for (node = list->list.head; node != NULL; node = node->next) {
		if (match_replace(name, ((perm_type *) node->data)->name,
					"@@", 2, host) == 1) {
			allowed = ((perm_type *) node->data)->allowed;
		}
	}

	return allowed;
} /* int is_perm(permlist_type *list, const char *name) */



#ifdef DUMPSTATUS
char *
perm_dump(permlist_type *list)
{
#define BUFSIZE	65536
	static char buf[BUFSIZE];
	int len, t;
	llist_node	*node;

	buf[0] = '\0';
	strcat(buf, "    ");
	len = (int) strlen(buf);
	for (node = list->list.head; node != NULL; node = node->next) {
		const char *name;
		/* paranoid */
		name = ((perm_type *) node->data)->name;
		t = (int) strlen(name);
		if (len + t + 10 < BUFSIZE) {
			len += t + 3;
			strncat(buf, name, t);
			strcat(buf, "=  ");
			buf[len - 2] = '0' + ((perm_type *)
					node->data)->allowed;
			buf[len] = '\0';
		} else {
			return buf;
		}
	}

	return buf;
} /* char *perm_dump(permlist_type *list) */
#endif /* DUMPSTATUS */


syntax highlighted by Code2HTML, v. 0.9.1