Home | History | Annotate | Download | only in src
      1 /* Copyright (C) 2005 Red Hat, Inc. */
      2 
      3 struct semanage_bool;
      4 struct semanage_bool_key;
      5 typedef struct semanage_bool record_t;
      6 typedef struct semanage_bool_key record_key_t;
      7 #define DBASE_RECORD_DEFINED
      8 
      9 struct dbase_activedb;
     10 typedef struct dbase_activedb dbase_t;
     11 #define DBASE_DEFINED
     12 
     13 #include <stdlib.h>
     14 #include <string.h>
     15 #include <selinux/selinux.h>
     16 #include <semanage/handle.h>
     17 #include "boolean_internal.h"
     18 #include "database_activedb.h"
     19 #include "parse_utils.h"
     20 #include "debug.h"
     21 
     22 static int bool_read_list(semanage_handle_t * handle,
     23 			  semanage_bool_t *** booleans, unsigned int *count)
     24 {
     25 
     26 	semanage_bool_t **tmp_booleans = NULL;
     27 	unsigned int tmp_count = 0;
     28 	int i;
     29 
     30 	char **names = NULL;
     31 	int len = 0;
     32 
     33 	/* Fetch boolean names */
     34 	if (security_get_boolean_names(&names, &len) < 0) {
     35 		ERR(handle, "could not get list of boolean names");
     36 		goto err;
     37 	}
     38 
     39 	/* Allocate a sufficiently large array */
     40 	tmp_booleans = malloc(sizeof(semanage_bool_t *) * len);
     41 	if (tmp_booleans == NULL)
     42 		goto omem;
     43 
     44 	/* Create records one by one */
     45 	for (i = 0; i < len; i++) {
     46 
     47 		int value;
     48 
     49 		if (semanage_bool_create(handle, &tmp_booleans[i]) < 0)
     50 			goto err;
     51 		tmp_count++;
     52 
     53 		if (semanage_bool_set_name(handle,
     54 					   tmp_booleans[i], names[i]) < 0)
     55 			goto err;
     56 
     57 		value = security_get_boolean_active(names[i]);
     58 		if (value < 0) {
     59 			ERR(handle, "could not get the value "
     60 			    "for boolean %s", names[i]);
     61 			goto err;
     62 		}
     63 
     64 		semanage_bool_set_value(tmp_booleans[i], value);
     65 	}
     66 
     67 	/* Success */
     68 	for (i = 0; i < len; i++)
     69 		free(names[i]);
     70 	free(names);
     71 	*booleans = tmp_booleans;
     72 	*count = tmp_count;
     73 	return STATUS_SUCCESS;
     74 
     75 	/* Failure */
     76       omem:
     77 	ERR(handle, "out of memory");
     78 
     79       err:
     80 	ERR(handle, "could not read boolean list");
     81 	for (i = 0; i < len; i++)
     82 		free(names[i]);
     83 	free(names);
     84 	for (i = 0; (unsigned int)i < tmp_count; i++)
     85 		semanage_bool_free(tmp_booleans[i]);
     86 	free(tmp_booleans);
     87 	return STATUS_ERR;
     88 }
     89 
     90 static int bool_commit_list(semanage_handle_t * handle,
     91 			    semanage_bool_t ** booleans, unsigned int count)
     92 {
     93 
     94 	SELboolean *blist = NULL;
     95 	const char *name;
     96 	unsigned int bcount = 0;
     97 	unsigned int i;
     98 	int curvalue, newvalue;
     99 
    100 	/* Allocate a sufficiently large array */
    101 	blist = malloc(sizeof(SELboolean) * count);
    102 	if (blist == NULL)
    103 		goto omem;
    104 
    105 	/* Populate array */
    106 	for (i = 0; i < count; i++) {
    107 		name = semanage_bool_get_name(booleans[i]);
    108 		if (!name)
    109 			goto omem;
    110 		newvalue = semanage_bool_get_value(booleans[i]);
    111 		curvalue = security_get_boolean_active(name);
    112 		if (newvalue == curvalue)
    113 			continue;
    114 		blist[bcount].name = strdup(name);
    115 		if (blist[bcount].name == NULL)
    116 			goto omem;
    117 		blist[bcount].value = newvalue;
    118 		bcount++;
    119 	}
    120 
    121 	/* Commit */
    122 	if (security_set_boolean_list(bcount, blist, 0) < 0) {
    123 		ERR(handle, "libselinux commit failed");
    124 		goto err;
    125 	}
    126 
    127 	for (i = 0; i < bcount; i++)
    128 		free(blist[i].name);
    129 	free(blist);
    130 	return STATUS_SUCCESS;
    131 
    132       omem:
    133 	ERR(handle, "out of memory");
    134 
    135       err:
    136 	ERR(handle, "could not commit boolean list");
    137 	for (i = 0; i < bcount; i++)
    138 		free(blist[i].name);
    139 	free(blist);
    140 	return STATUS_ERR;
    141 }
    142 
    143 /* BOOL RECORD: ACTIVEDB extension: method table */
    144 record_activedb_table_t SEMANAGE_BOOL_ACTIVEDB_RTABLE = {
    145 	.read_list = bool_read_list,
    146 	.commit_list = bool_commit_list,
    147 };
    148 
    149 int bool_activedb_dbase_init(semanage_handle_t * handle,
    150 			     dbase_config_t * dconfig)
    151 {
    152 
    153 	if (dbase_activedb_init(handle,
    154 				&SEMANAGE_BOOL_RTABLE,
    155 				&SEMANAGE_BOOL_ACTIVEDB_RTABLE,
    156 				&dconfig->dbase) < 0)
    157 		return STATUS_ERR;
    158 
    159 	dconfig->dtable = &SEMANAGE_ACTIVEDB_DTABLE;
    160 	return STATUS_SUCCESS;
    161 }
    162 
    163 void bool_activedb_dbase_release(dbase_config_t * dconfig)
    164 {
    165 
    166 	dbase_activedb_release(dconfig->dbase);
    167 }
    168