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_file;
     10 typedef struct dbase_file dbase_t;
     11 #define DBASE_DEFINED
     12 
     13 #include <stdlib.h>
     14 #include <stdio.h>
     15 #include <ctype.h>
     16 #include <string.h>
     17 #include <semanage/handle.h>
     18 #include "boolean_internal.h"
     19 #include "database_file.h"
     20 #include "parse_utils.h"
     21 #include "debug.h"
     22 
     23 static int bool_print(semanage_handle_t * handle,
     24 		      semanage_bool_t * boolean, FILE * str)
     25 {
     26 
     27 	const char *name = semanage_bool_get_name(boolean);
     28 	int value = semanage_bool_get_value(boolean);
     29 
     30 	if (fprintf(str, "%s=%d\n", name, value) < 0) {
     31 		ERR(handle, "could not print boolean %s to stream", name);
     32 		return STATUS_ERR;
     33 	}
     34 
     35 	return STATUS_SUCCESS;
     36 }
     37 
     38 static int bool_parse(semanage_handle_t * handle,
     39 		      parse_info_t * info, semanage_bool_t * boolean)
     40 {
     41 
     42 	int value = 0;
     43 	char *str = NULL;
     44 
     45 	if (parse_skip_space(handle, info) < 0)
     46 		goto err;
     47 	if (!info->ptr)
     48 		goto last;
     49 
     50 	/* Extract name */
     51 	if (parse_fetch_string(handle, info, &str, '=') < 0)
     52 		goto err;
     53 
     54 	if (semanage_bool_set_name(handle, boolean, str) < 0)
     55 		goto err;
     56 	free(str);
     57 	str = NULL;
     58 
     59 	/* Assert = */
     60 	if (parse_skip_space(handle, info) < 0)
     61 		goto err;
     62 	if (parse_assert_ch(handle, info, '=') < 0)
     63 		goto err;
     64 
     65 	/* Extract value */
     66 	if (parse_skip_space(handle, info) < 0)
     67 		goto err;
     68 	if (parse_optional_str(info, "true") != STATUS_NODATA)
     69 		value = 1;
     70 	else if (parse_optional_str(info, "TRUE") != STATUS_NODATA)
     71 		value = 1;
     72 	else if (parse_optional_str(info, "false") != STATUS_NODATA)
     73 		value = 0;
     74 	else if (parse_optional_str(info, "FALSE") != STATUS_NODATA)
     75 		value = 0;
     76 	else if (parse_fetch_int(handle, info, &value, ' ') < 0)
     77 		goto err;
     78 
     79 	if (value != 0 && value != 1) {
     80 		ERR(handle, "invalid boolean value for \"%s\": %u "
     81 		    "(%s: %u)\n%s", semanage_bool_get_name(boolean),
     82 		    value, info->filename, info->lineno, info->orig_line);
     83 		goto err;
     84 	}
     85 	semanage_bool_set_value(boolean, value);
     86 
     87 	if (parse_assert_space(handle, info) < 0)
     88 		goto err;
     89 
     90 	return STATUS_SUCCESS;
     91 
     92       last:
     93 	parse_dispose_line(info);
     94 	return STATUS_NODATA;
     95 
     96       err:
     97 	ERR(handle, "could not parse boolean record");
     98 	free(str);
     99 	parse_dispose_line(info);
    100 	return STATUS_ERR;
    101 }
    102 
    103 /* BOOL RECORD: FILE extension: method table */
    104 record_file_table_t SEMANAGE_BOOL_FILE_RTABLE = {
    105 	.parse = bool_parse,
    106 	.print = bool_print,
    107 };
    108 
    109 int bool_file_dbase_init(semanage_handle_t * handle,
    110 			 const char *path_ro,
    111 			 const char *path_rw,
    112 			 dbase_config_t * dconfig)
    113 {
    114 
    115 	if (dbase_file_init(handle,
    116 			    path_ro,
    117 			    path_rw,
    118 			    &SEMANAGE_BOOL_RTABLE,
    119 			    &SEMANAGE_BOOL_FILE_RTABLE, &dconfig->dbase) < 0)
    120 		return STATUS_ERR;
    121 
    122 	dconfig->dtable = &SEMANAGE_FILE_DTABLE;
    123 	return STATUS_SUCCESS;
    124 }
    125 
    126 void bool_file_dbase_release(dbase_config_t * dconfig)
    127 {
    128 
    129 	dbase_file_release(dconfig->dbase);
    130 }
    131