/* 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);
}