/* Copyright (C) 2005 Red Hat, Inc. */

struct semanage_user;
struct semanage_user_key;
typedef struct semanage_user_key record_key_t;
typedef struct semanage_user record_t;
#define DBASE_RECORD_DEFINED

#include <string.h>
#include <stdlib.h>
#include "user_internal.h"
#include "seuser_internal.h"
#include "handle.h"
#include "database.h"
#include "errno.h"
#include "debug.h"

int semanage_user_modify_local(semanage_handle_t * handle,
			       const semanage_user_key_t * key,
			       const semanage_user_t * data)
{

	dbase_config_t *dconfig = semanage_user_dbase_local(handle);
	return dbase_modify(handle, dconfig, key, data);
}

static int lookup_seuser(semanage_handle_t * handle, const semanage_user_key_t *k) {
	semanage_user_t *user;
	semanage_seuser_t **records;
	const char *name;
	const char *sename;
	unsigned int count;
	size_t i;
	int rc = 0;
	if (semanage_user_query(handle, k, &user) < 0)
		return 0;
	name = semanage_user_get_name(user);
	semanage_seuser_list_local(handle,
				   &records,
				   &count);
	for(i=0; i<count; i++) {
		sename = semanage_seuser_get_sename(records[i]);
		if (strcmp(name, sename) == 0) {
			errno = EINVAL;
			ERR(handle, "%s is being used by %s login record",
			    sename, semanage_seuser_get_name(records[i]));
			rc = -1;
		}
	}
	for(i=0; i<count; i++)
		semanage_seuser_free(records[i]);
	free(records);
	semanage_user_free(user);
	if (rc)
		errno = EINVAL;
	return rc;
}

int semanage_user_del_local(semanage_handle_t * handle,
			    const semanage_user_key_t * key)
{
	if (lookup_seuser(handle, key))
		return -1;

	dbase_config_t *dconfig = semanage_user_dbase_local(handle);
	return dbase_del(handle, dconfig, key);
}

int semanage_user_query_local(semanage_handle_t * handle,
			      const semanage_user_key_t * key,
			      semanage_user_t ** response)
{

	dbase_config_t *dconfig = semanage_user_dbase_local(handle);
	return dbase_query(handle, dconfig, key, response);
}

int semanage_user_exists_local(semanage_handle_t * handle,
			       const semanage_user_key_t * key, int *response)
{

	dbase_config_t *dconfig = semanage_user_dbase_local(handle);
	return dbase_exists(handle, dconfig, key, response);
}

int semanage_user_count_local(semanage_handle_t * handle,
			      unsigned int *response)
{

	dbase_config_t *dconfig = semanage_user_dbase_local(handle);
	return dbase_count(handle, dconfig, response);
}

int semanage_user_iterate_local(semanage_handle_t * handle,
				int (*handler) (const semanage_user_t * record,
						void *varg), void *handler_arg)
{

	dbase_config_t *dconfig = semanage_user_dbase_local(handle);
	return dbase_iterate(handle, dconfig, handler, handler_arg);
}

int semanage_user_list_local(semanage_handle_t * handle,
			     semanage_user_t *** records, unsigned int *count)
{

	dbase_config_t *dconfig = semanage_user_dbase_local(handle);
	return dbase_list(handle, dconfig, records, count);
}