Blame lib/nsswitch.c

Packit Service a4b2a9
/* ----------------------------------------------------------------------- *
Packit Service a4b2a9
 *   
Packit Service a4b2a9
 *  nsswitch.c - module to call parser for nsswitch config and store
Packit Service a4b2a9
 *		result into a struct.
Packit Service a4b2a9
 *
Packit Service a4b2a9
 *   Copyright 2006 Ian Kent <raven@themaw.net>
Packit Service a4b2a9
 *
Packit Service a4b2a9
 *   This program is free software; you can redistribute it and/or modify
Packit Service a4b2a9
 *   it under the terms of the GNU General Public License as published by
Packit Service a4b2a9
 *   the Free Software Foundation, Inc., 675 Mass Ave, Cambridge MA 02139,
Packit Service a4b2a9
 *   USA; either version 2 of the License, or (at your option) any later
Packit Service a4b2a9
 *   version.
Packit Service a4b2a9
 *   
Packit Service a4b2a9
 *   This program is distributed in the hope that it will be useful,
Packit Service a4b2a9
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service a4b2a9
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service a4b2a9
 *   GNU General Public License for more details.
Packit Service a4b2a9
 *
Packit Service a4b2a9
 * ----------------------------------------------------------------------- */
Packit Service a4b2a9
Packit Service a4b2a9
#include <stdio.h>
Packit Service a4b2a9
#include <stdlib.h>
Packit Service a4b2a9
#include <string.h>
Packit Service a4b2a9
#include <memory.h>
Packit Service a4b2a9
#include <limits.h>
Packit Service a4b2a9
#include "automount.h"
Packit Service a4b2a9
#include "nsswitch.h"
Packit Service a4b2a9
Packit Service a4b2a9
int set_action(struct nss_action *act, char *status, char *action, int negated)
Packit Service a4b2a9
{
Packit Service a4b2a9
	enum nsswitch_action a;
Packit Service a4b2a9
Packit Service a4b2a9
	if (!strcasecmp(action, "continue"))
Packit Service a4b2a9
		a = NSS_ACTION_CONTINUE;
Packit Service a4b2a9
	else if (!strcasecmp(action, "return"))
Packit Service a4b2a9
		a = NSS_ACTION_RETURN;
Packit Service a4b2a9
	else
Packit Service a4b2a9
		return 0;
Packit Service a4b2a9
Packit Service a4b2a9
	if (!strcasecmp(status, "SUCCESS")) {
Packit Service a4b2a9
		act[NSS_STATUS_SUCCESS].action = a;
Packit Service a4b2a9
		act[NSS_STATUS_SUCCESS].negated = negated;
Packit Service a4b2a9
	} else if (!strcasecmp(status, "NOTFOUND")) {
Packit Service a4b2a9
		act[NSS_STATUS_NOTFOUND].action = a;
Packit Service a4b2a9
		act[NSS_STATUS_NOTFOUND].negated = negated;
Packit Service a4b2a9
	} else if (!strcasecmp(status, "UNAVAIL")) {
Packit Service a4b2a9
		act[NSS_STATUS_UNAVAIL].action = a;
Packit Service a4b2a9
		act[NSS_STATUS_UNAVAIL].negated = negated;
Packit Service a4b2a9
	} else if (!strcasecmp(status, "TRYAGAIN")) {
Packit Service a4b2a9
		act[NSS_STATUS_TRYAGAIN].action = a;
Packit Service a4b2a9
		act[NSS_STATUS_TRYAGAIN].negated = negated;
Packit Service a4b2a9
	} else
Packit Service a4b2a9
		return 0;
Packit Service a4b2a9
Packit Service a4b2a9
	return 1;
Packit Service a4b2a9
}
Packit Service a4b2a9
Packit Service a4b2a9
int check_nss_result(struct nss_source *this, enum nsswitch_status result)
Packit Service a4b2a9
{
Packit Service a4b2a9
	enum nsswitch_status status;
Packit Service a4b2a9
	struct nss_action a;
Packit Service a4b2a9
Packit Service a4b2a9
	/* Check if we have negated actions */
Packit Service a4b2a9
	for (status = 0; status < NSS_STATUS_MAX; status++) {
Packit Service a4b2a9
		a = this->action[status];
Packit Service a4b2a9
		if (a.action == NSS_ACTION_UNKNOWN)
Packit Service a4b2a9
			continue;
Packit Service a4b2a9
Packit Service a4b2a9
		if (a.negated && result != status) {
Packit Service a4b2a9
			if (a.action == NSS_ACTION_RETURN) {
Packit Service a4b2a9
				if (result == NSS_STATUS_SUCCESS)
Packit Service a4b2a9
					return 1;
Packit Service a4b2a9
				else
Packit Service a4b2a9
					return 0;
Packit Service a4b2a9
			}
Packit Service a4b2a9
		}
Packit Service a4b2a9
	}
Packit Service a4b2a9
Packit Service a4b2a9
	a = this->action[result];
Packit Service a4b2a9
Packit Service a4b2a9
	/* Check if we have other actions for this status */
Packit Service a4b2a9
	switch (result) {
Packit Service a4b2a9
	case NSS_STATUS_SUCCESS:
Packit Service a4b2a9
		if (a.action == NSS_ACTION_CONTINUE)
Packit Service a4b2a9
			break;
Packit Service a4b2a9
		return 1;
Packit Service a4b2a9
Packit Service a4b2a9
	case NSS_STATUS_NOTFOUND:
Packit Service a4b2a9
	case NSS_STATUS_UNAVAIL:
Packit Service a4b2a9
	case NSS_STATUS_TRYAGAIN:
Packit Service a4b2a9
		if (a.action == NSS_ACTION_RETURN) {
Packit Service a4b2a9
			return 0;
Packit Service a4b2a9
		}
Packit Service a4b2a9
		break;
Packit Service a4b2a9
Packit Service a4b2a9
	default:
Packit Service a4b2a9
		break;
Packit Service a4b2a9
	}
Packit Service a4b2a9
Packit Service a4b2a9
	return -1;
Packit Service a4b2a9
}
Packit Service a4b2a9
Packit Service a4b2a9
struct nss_source *add_source(struct list_head *head, char *source)
Packit Service a4b2a9
{
Packit Service a4b2a9
	struct nss_source *s;
Packit Service a4b2a9
	char *tmp;
Packit Service a4b2a9
	enum nsswitch_status status;
Packit Service a4b2a9
Packit Service a4b2a9
	s = malloc(sizeof(struct nss_source));
Packit Service a4b2a9
	if (!s)
Packit Service a4b2a9
		return NULL;
Packit Service a4b2a9
Packit Service a4b2a9
	memset(s, 0, sizeof(struct nss_source));
Packit Service a4b2a9
	INIT_LIST_HEAD(&s->list);
Packit Service a4b2a9
Packit Service a4b2a9
	tmp = strdup(source);
Packit Service a4b2a9
	if (!tmp) {
Packit Service a4b2a9
		free(s);
Packit Service a4b2a9
		return NULL;
Packit Service a4b2a9
	}
Packit Service a4b2a9
	s->source = tmp;
Packit Service a4b2a9
Packit Service a4b2a9
	for (status = 0; status < NSS_STATUS_MAX; status++)
Packit Service a4b2a9
		s->action[status].action = NSS_ACTION_UNKNOWN;
Packit Service a4b2a9
Packit Service a4b2a9
	list_add_tail(&s->list, head);
Packit Service a4b2a9
Packit Service a4b2a9
	return s;
Packit Service a4b2a9
}
Packit Service a4b2a9
Packit Service a4b2a9
int free_sources(struct list_head *list)
Packit Service a4b2a9
{
Packit Service a4b2a9
	struct nss_source *this;
Packit Service a4b2a9
	struct list_head *head, *next;
Packit Service a4b2a9
Packit Service a4b2a9
	if (list_empty(list))
Packit Service a4b2a9
		return 0;
Packit Service a4b2a9
Packit Service a4b2a9
	head = list;
Packit Service a4b2a9
	next = list->next;
Packit Service a4b2a9
	while (next != head) {
Packit Service a4b2a9
		this = list_entry(next, struct nss_source, list);
Packit Service a4b2a9
		next = next->next;
Packit Service a4b2a9
Packit Service a4b2a9
		list_del(&this->list);
Packit Service a4b2a9
		if (this->source)
Packit Service a4b2a9
			free(this->source);
Packit Service a4b2a9
		free(this);
Packit Service a4b2a9
	}
Packit Service a4b2a9
	return 1;
Packit Service a4b2a9
}
Packit Service a4b2a9
Packit Service a4b2a9
/*
Packit Service a4b2a9
int main(void)
Packit Service a4b2a9
{
Packit Service a4b2a9
	struct nss_source *this;
Packit Service a4b2a9
	struct list_head list;
Packit Service a4b2a9
	struct list_head *head, *next;
Packit Service a4b2a9
	int status;
Packit Service a4b2a9
Packit Service a4b2a9
Packit Service a4b2a9
	status = nsswitch_parse(&list);
Packit Service a4b2a9
	if (status) {
Packit Service a4b2a9
		printf("error exit from nss_parse\n");
Packit Service a4b2a9
		free_sources(&list);
Packit Service a4b2a9
		exit(1);
Packit Service a4b2a9
	}
Packit Service a4b2a9
Packit Service a4b2a9
	head = &list;
Packit Service a4b2a9
	next = head->next;
Packit Service a4b2a9
	while (next != head) {
Packit Service a4b2a9
		this = list_entry(next, struct nss_source, list);
Packit Service a4b2a9
		next = next->next;
Packit Service a4b2a9
Packit Service a4b2a9
		printf("list->source = %s", this->source);
Packit Service a4b2a9
		for (status = 0; status < NSS_STATUS_MAX; status++) {
Packit Service a4b2a9
			if (this->action[status].action != NSS_ACTION_UNKNOWN)
Packit Service a4b2a9
				printf(" .");
Packit Service a4b2a9
		}
Packit Service a4b2a9
		printf("\n");
Packit Service a4b2a9
	}
Packit Service a4b2a9
	free_sources(&list);
Packit Service a4b2a9
Packit Service a4b2a9
	exit(0);
Packit Service a4b2a9
}
Packit Service a4b2a9
*/