blob: 8823b1ed1c7b485688f6e1db10469458239aceb4 [file] [log] [blame]
/* Copyright (C) 2005 Red Hat, Inc. */
/* Object: semanage_seuser_t (Unix User)
* Object: semanage_seuser_key_t (Unix User Key)
* Implements: record_t (Database Record)
* Implements: record_key_t (Database Record Key)
*/
struct semanage_seuser;
struct semanage_seuser_key;
typedef struct semanage_seuser record_t;
typedef struct semanage_seuser_key record_key_t;
#define DBASE_RECORD_DEFINED
#include <stdlib.h>
#include <string.h>
#include "seuser_internal.h"
#include "debug.h"
#include <semanage/handle.h>
#include "database.h"
struct semanage_seuser {
/* This user's name */
char *name;
/* This user's corresponding
* seuser ("role set") */
char *sename;
/* This user's mls range (only required for mls) */
char *mls_range;
};
struct semanage_seuser_key {
/* This user's name */
const char *name;
};
int semanage_seuser_key_create(semanage_handle_t * handle,
const char *name,
semanage_seuser_key_t ** key_ptr)
{
semanage_seuser_key_t *tmp_key = (semanage_seuser_key_t *)
malloc(sizeof(semanage_seuser_key_t));
if (!tmp_key) {
ERR(handle, "out of memory, could not create seuser key");
return STATUS_ERR;
}
tmp_key->name = name;
*key_ptr = tmp_key;
return STATUS_SUCCESS;
}
hidden_def(semanage_seuser_key_create)
int semanage_seuser_key_extract(semanage_handle_t * handle,
const semanage_seuser_t * seuser,
semanage_seuser_key_t ** key_ptr)
{
if (semanage_seuser_key_create(handle, seuser->name, key_ptr) < 0)
goto err;
return STATUS_SUCCESS;
err:
ERR(handle, "could not extract seuser key from record");
return STATUS_ERR;
}
hidden_def(semanage_seuser_key_extract)
void semanage_seuser_key_free(semanage_seuser_key_t * key)
{
free(key);
}
hidden_def(semanage_seuser_key_free)
int semanage_seuser_compare(const semanage_seuser_t * seuser,
const semanage_seuser_key_t * key)
{
return strcmp(seuser->name, key->name);
}
hidden_def(semanage_seuser_compare)
int semanage_seuser_compare2(const semanage_seuser_t * seuser,
const semanage_seuser_t * seuser2)
{
return strcmp(seuser->name, seuser2->name);
}
hidden_def(semanage_seuser_compare2)
static int semanage_seuser_compare2_qsort(const semanage_seuser_t ** seuser,
const semanage_seuser_t ** seuser2)
{
return strcmp((*seuser)->name, (*seuser2)->name);
}
/* Name */
const char *semanage_seuser_get_name(const semanage_seuser_t * seuser)
{
return seuser->name;
}
hidden_def(semanage_seuser_get_name)
int semanage_seuser_set_name(semanage_handle_t * handle,
semanage_seuser_t * seuser, const char *name)
{
char *tmp_name = strdup(name);
if (!tmp_name) {
ERR(handle, "out of memory, could not set seuser (Unix) name");
return STATUS_ERR;
}
free(seuser->name);
seuser->name = tmp_name;
return STATUS_SUCCESS;
}
hidden_def(semanage_seuser_set_name)
/* Selinux Name */
const char *semanage_seuser_get_sename(const semanage_seuser_t * seuser)
{
return seuser->sename;
}
hidden_def(semanage_seuser_get_sename)
int semanage_seuser_set_sename(semanage_handle_t * handle,
semanage_seuser_t * seuser, const char *sename)
{
char *tmp_sename = strdup(sename);
if (!tmp_sename) {
ERR(handle,
"out of memory, could not set seuser (SELinux) name");
return STATUS_ERR;
}
free(seuser->sename);
seuser->sename = tmp_sename;
return STATUS_SUCCESS;
}
hidden_def(semanage_seuser_set_sename)
/* MLS Range */
const char *semanage_seuser_get_mlsrange(const semanage_seuser_t * seuser)
{
return seuser->mls_range;
}
hidden_def(semanage_seuser_get_mlsrange)
int semanage_seuser_set_mlsrange(semanage_handle_t * handle,
semanage_seuser_t * seuser,
const char *mls_range)
{
char *tmp_mls_range = strdup(mls_range);
if (!tmp_mls_range) {
ERR(handle, "out of memory, could not set seuser MLS range");
return STATUS_ERR;
}
free(seuser->mls_range);
seuser->mls_range = tmp_mls_range;
return STATUS_SUCCESS;
}
hidden_def(semanage_seuser_set_mlsrange)
/* Create */
int semanage_seuser_create(semanage_handle_t * handle,
semanage_seuser_t ** seuser_ptr)
{
semanage_seuser_t *seuser =
(semanage_seuser_t *) malloc(sizeof(semanage_seuser_t));
if (!seuser) {
ERR(handle, "out of memory, could not create seuser");
return STATUS_ERR;
}
seuser->name = NULL;
seuser->sename = NULL;
seuser->mls_range = NULL;
*seuser_ptr = seuser;
return STATUS_SUCCESS;
}
hidden_def(semanage_seuser_create)
/* Deep copy clone */
int semanage_seuser_clone(semanage_handle_t * handle,
const semanage_seuser_t * seuser,
semanage_seuser_t ** seuser_ptr)
{
semanage_seuser_t *new_seuser = NULL;
if (semanage_seuser_create(handle, &new_seuser) < 0)
goto err;
if (semanage_seuser_set_name(handle, new_seuser, seuser->name) < 0)
goto err;
if (semanage_seuser_set_sename(handle, new_seuser, seuser->sename) < 0)
goto err;
if (seuser->mls_range &&
(semanage_seuser_set_mlsrange(handle, new_seuser, seuser->mls_range)
< 0))
goto err;
*seuser_ptr = new_seuser;
return STATUS_SUCCESS;
err:
ERR(handle, "could not clone seuser");
semanage_seuser_free(new_seuser);
return STATUS_ERR;
}
hidden_def(semanage_seuser_clone)
/* Destroy */
void semanage_seuser_free(semanage_seuser_t * seuser)
{
if (!seuser)
return;
free(seuser->name);
free(seuser->sename);
free(seuser->mls_range);
free(seuser);
}
hidden_def(semanage_seuser_free)
/* Record base functions */
record_table_t SEMANAGE_SEUSER_RTABLE = {
.create = semanage_seuser_create,
.key_extract = semanage_seuser_key_extract,
.key_free = semanage_seuser_key_free,
.clone = semanage_seuser_clone,
.compare = semanage_seuser_compare,
.compare2 = semanage_seuser_compare2,
.compare2_qsort = semanage_seuser_compare2_qsort,
.free = semanage_seuser_free,
};