Blame src/booleans_activedb.c

Packit Service 102278
/* Copyright (C) 2005 Red Hat, Inc. */
Packit Service 102278
Packit Service 102278
struct semanage_bool;
Packit Service 102278
struct semanage_bool_key;
Packit Service 102278
typedef struct semanage_bool record_t;
Packit Service 102278
typedef struct semanage_bool_key record_key_t;
Packit Service 102278
#define DBASE_RECORD_DEFINED
Packit Service 102278
Packit Service 102278
struct dbase_activedb;
Packit Service 102278
typedef struct dbase_activedb dbase_t;
Packit Service 102278
#define DBASE_DEFINED
Packit Service 102278
Packit Service 102278
#include <stdlib.h>
Packit Service 102278
#include <string.h>
Packit Service 102278
#include <selinux/selinux.h>
Packit Service 102278
#include <semanage/handle.h>
Packit Service 102278
#include "boolean_internal.h"
Packit Service 102278
#include "database_activedb.h"
Packit Service 102278
#include "parse_utils.h"
Packit Service 102278
#include "debug.h"
Packit Service 102278
Packit Service 102278
static int bool_read_list(semanage_handle_t * handle,
Packit Service 102278
			  semanage_bool_t *** booleans, unsigned int *count)
Packit Service 102278
{
Packit Service 102278
Packit Service 102278
	semanage_bool_t **tmp_booleans = NULL;
Packit Service 102278
	unsigned int tmp_count = 0;
Packit Service 102278
	int i;
Packit Service 102278
Packit Service 102278
	char **names = NULL;
Packit Service 102278
	int len = 0;
Packit Service 102278
Packit Service 102278
	/* Fetch boolean names */
Packit Service 102278
	if (security_get_boolean_names(&names, &len) < 0) {
Packit Service 102278
		ERR(handle, "could not get list of boolean names");
Packit Service 102278
		goto err;
Packit Service 102278
	}
Packit Service 102278
Packit Service 102278
	/* Allocate a sufficiently large array */
Packit Service 102278
	tmp_booleans = malloc(sizeof(semanage_bool_t *) * len);
Packit Service 102278
	if (tmp_booleans == NULL)
Packit Service 102278
		goto omem;
Packit Service 102278
Packit Service 102278
	/* Create records one by one */
Packit Service 102278
	for (i = 0; i < len; i++) {
Packit Service 102278
Packit Service 102278
		int value;
Packit Service 102278
Packit Service 102278
		if (semanage_bool_create(handle, &tmp_booleans[i]) < 0)
Packit Service 102278
			goto err;
Packit Service 102278
		tmp_count++;
Packit Service 102278
Packit Service 102278
		if (semanage_bool_set_name(handle,
Packit Service 102278
					   tmp_booleans[i], names[i]) < 0)
Packit Service 102278
			goto err;
Packit Service 102278
Packit Service 102278
		value = security_get_boolean_active(names[i]);
Packit Service 102278
		if (value < 0) {
Packit Service 102278
			ERR(handle, "could not get the value "
Packit Service 102278
			    "for boolean %s", names[i]);
Packit Service 102278
			goto err;
Packit Service 102278
		}
Packit Service 102278
Packit Service 102278
		semanage_bool_set_value(tmp_booleans[i], value);
Packit Service 102278
	}
Packit Service 102278
Packit Service 102278
	/* Success */
Packit Service 102278
	for (i = 0; i < len; i++)
Packit Service 102278
		free(names[i]);
Packit Service 102278
	free(names);
Packit Service 102278
	*booleans = tmp_booleans;
Packit Service 102278
	*count = tmp_count;
Packit Service 102278
	return STATUS_SUCCESS;
Packit Service 102278
Packit Service 102278
	/* Failure */
Packit Service 102278
      omem:
Packit Service 102278
	ERR(handle, "out of memory");
Packit Service 102278
Packit Service 102278
      err:
Packit Service 102278
	ERR(handle, "could not read boolean list");
Packit Service 102278
	for (i = 0; i < len; i++)
Packit Service 102278
		free(names[i]);
Packit Service 102278
	free(names);
Packit Service 102278
	for (i = 0; (unsigned int)i < tmp_count; i++)
Packit Service 102278
		semanage_bool_free(tmp_booleans[i]);
Packit Service 102278
	free(tmp_booleans);
Packit Service 102278
	return STATUS_ERR;
Packit Service 102278
}
Packit Service 102278
Packit Service 102278
static int bool_commit_list(semanage_handle_t * handle,
Packit Service 102278
			    semanage_bool_t ** booleans, unsigned int count)
Packit Service 102278
{
Packit Service 102278
Packit Service 102278
	SELboolean *blist = NULL;
Packit Service 102278
	const char *name;
Packit Service 102278
	unsigned int bcount = 0;
Packit Service 102278
	unsigned int i;
Packit Service 102278
	int curvalue, newvalue;
Packit Service 102278
Packit Service 102278
	/* Allocate a sufficiently large array */
Packit Service 102278
	blist = malloc(sizeof(SELboolean) * count);
Packit Service 102278
	if (blist == NULL)
Packit Service 102278
		goto omem;
Packit Service 102278
Packit Service 102278
	/* Populate array */
Packit Service 102278
	for (i = 0; i < count; i++) {
Packit Service 102278
		name = semanage_bool_get_name(booleans[i]);
Packit Service 102278
		if (!name)
Packit Service 102278
			goto omem;	
Packit Service 102278
		newvalue = semanage_bool_get_value(booleans[i]);
Packit Service 102278
		curvalue = security_get_boolean_active(name);
Packit Service 102278
		if (newvalue == curvalue)
Packit Service 102278
			continue;
Packit Service 102278
		blist[bcount].name = strdup(name);
Packit Service 102278
		if (blist[bcount].name == NULL)
Packit Service 102278
			goto omem;
Packit Service 102278
		blist[bcount].value = newvalue;
Packit Service 102278
		bcount++;
Packit Service 102278
	}
Packit Service 102278
Packit Service 102278
	/* Commit */
Packit Service 102278
	if (security_set_boolean_list(bcount, blist, 0) < 0) {
Packit Service 102278
		ERR(handle, "libselinux commit failed");
Packit Service 102278
		goto err;
Packit Service 102278
	}
Packit Service 102278
Packit Service 102278
	for (i = 0; i < bcount; i++)
Packit Service 102278
		free(blist[i].name);
Packit Service 102278
	free(blist);
Packit Service 102278
	return STATUS_SUCCESS;
Packit Service 102278
Packit Service 102278
      omem:
Packit Service 102278
	ERR(handle, "out of memory");
Packit Service 102278
Packit Service 102278
      err:
Packit Service 102278
	ERR(handle, "could not commit boolean list");
Packit Service 102278
	for (i = 0; i < bcount; i++)
Packit Service 102278
		free(blist[i].name);
Packit Service 102278
	free(blist);
Packit Service 102278
	return STATUS_ERR;
Packit Service 102278
}
Packit Service 102278
Packit Service 102278
/* BOOL RECORD: ACTIVEDB extension: method table */
Packit Service 102278
record_activedb_table_t SEMANAGE_BOOL_ACTIVEDB_RTABLE = {
Packit Service 102278
	.read_list = bool_read_list,
Packit Service 102278
	.commit_list = bool_commit_list,
Packit Service 102278
};
Packit Service 102278
Packit Service 102278
int bool_activedb_dbase_init(semanage_handle_t * handle,
Packit Service 102278
			     dbase_config_t * dconfig)
Packit Service 102278
{
Packit Service 102278
Packit Service 102278
	if (dbase_activedb_init(handle,
Packit Service 102278
				&SEMANAGE_BOOL_RTABLE,
Packit Service 102278
				&SEMANAGE_BOOL_ACTIVEDB_RTABLE,
Packit Service 102278
				&dconfig->dbase) < 0)
Packit Service 102278
		return STATUS_ERR;
Packit Service 102278
Packit Service 102278
	dconfig->dtable = &SEMANAGE_ACTIVEDB_DTABLE;
Packit Service 102278
	return STATUS_SUCCESS;
Packit Service 102278
}
Packit Service 102278
Packit Service 102278
void bool_activedb_dbase_release(dbase_config_t * dconfig)
Packit Service 102278
{
Packit Service 102278
Packit Service 102278
	dbase_activedb_release(dconfig->dbase);
Packit Service 102278
}