Home | History | Annotate | Download | only in src
      1 /* Copyright (C) 2005 Red Hat, Inc. */
      2 
      3 struct semanage_iface;
      4 struct semanage_iface_key;
      5 typedef struct semanage_iface record_t;
      6 typedef struct semanage_iface_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 <semanage/handle.h>
     16 #include "iface_internal.h"
     17 #include "context_internal.h"
     18 #include "database_file.h"
     19 #include "parse_utils.h"
     20 #include "debug.h"
     21 
     22 static int iface_print(semanage_handle_t * handle,
     23 		       semanage_iface_t * iface, FILE * str)
     24 {
     25 
     26 	char *con_str = NULL;
     27 
     28 	const char *name = semanage_iface_get_name(iface);
     29 	semanage_context_t *ifcon = semanage_iface_get_ifcon(iface);
     30 	semanage_context_t *msgcon = semanage_iface_get_msgcon(iface);
     31 
     32 	if (fprintf(str, "netifcon %s ", name) < 0)
     33 		goto err;
     34 
     35 	if (semanage_context_to_string(handle, ifcon, &con_str) < 0)
     36 		goto err;
     37 	if (fprintf(str, "%s ", con_str) < 0)
     38 		goto err;
     39 	free(con_str);
     40 	con_str = NULL;
     41 
     42 	if (semanage_context_to_string(handle, msgcon, &con_str) < 0)
     43 		goto err;
     44 	if (fprintf(str, "%s\n", con_str) < 0)
     45 		goto err;
     46 	free(con_str);
     47 	con_str = NULL;
     48 
     49 	return STATUS_SUCCESS;
     50 
     51       err:
     52 	ERR(handle, "could not print interface %s to stream", name);
     53 	free(con_str);
     54 	return STATUS_ERR;
     55 }
     56 
     57 static int iface_parse(semanage_handle_t * handle,
     58 		       parse_info_t * info, semanage_iface_t * iface)
     59 {
     60 
     61 	char *str = NULL;
     62 	semanage_context_t *con = NULL;
     63 
     64 	if (parse_skip_space(handle, info) < 0)
     65 		goto err;
     66 	if (!info->ptr)
     67 		goto last;
     68 
     69 	/* Header */
     70 	if (parse_assert_str(handle, info, "netifcon") < 0)
     71 		goto err;
     72 	if (parse_assert_space(handle, info) < 0)
     73 		goto err;
     74 
     75 	/* Name */
     76 	if (parse_fetch_string(handle, info, &str, ' ') < 0)
     77 		goto err;
     78 	if (semanage_iface_set_name(handle, iface, str) < 0)
     79 		goto err;
     80 	free(str);
     81 	str = NULL;
     82 
     83 	/* Interface context */
     84 	if (parse_assert_space(handle, info) < 0)
     85 		goto err;
     86 	if (parse_fetch_string(handle, info, &str, ' ') < 0)
     87 		goto err;
     88 	if (semanage_context_from_string(handle, str, &con) < 0) {
     89 		ERR(handle, "invalid security context \"%s\" (%s: %u)\n%s",
     90 		    str, info->filename, info->lineno, info->orig_line);
     91 		goto err;
     92 	}
     93 	if (con == NULL) {
     94 		ERR(handle, "<<none>> context is not valid for "
     95 		    "interfaces (%s: %u)\n%s", info->filename,
     96 		    info->lineno, info->orig_line);
     97 		goto err;
     98 	}
     99 	free(str);
    100 	str = NULL;
    101 
    102 	if (semanage_iface_set_ifcon(handle, iface, con) < 0)
    103 		goto err;
    104 	semanage_context_free(con);
    105 	con = NULL;
    106 
    107 	/* Message context */
    108 	if (parse_assert_space(handle, info) < 0)
    109 		goto err;
    110 	if (parse_fetch_string(handle, info, &str, ' ') < 0)
    111 		goto err;
    112 	if (semanage_context_from_string(handle, str, &con) < 0) {
    113 		ERR(handle, "invalid security context \"%s\" (%s: %u)\n%s",
    114 		    str, info->filename, info->lineno, info->orig_line);
    115 		goto err;
    116 	}
    117 	if (con == NULL) {
    118 		ERR(handle, "<<none>> context is not valid for "
    119 		    "interfaces (%s: %u)\n%s", info->filename,
    120 		    info->lineno, info->orig_line);
    121 		goto err;
    122 	}
    123 	free(str);
    124 	str = NULL;
    125 
    126 	if (semanage_iface_set_msgcon(handle, iface, con) < 0)
    127 		goto err;
    128 	semanage_context_free(con);
    129 	con = NULL;
    130 
    131 	if (parse_assert_space(handle, info) < 0)
    132 		goto err;
    133 
    134 	return STATUS_SUCCESS;
    135 
    136       last:
    137 	parse_dispose_line(info);
    138 	return STATUS_NODATA;
    139 
    140       err:
    141 	ERR(handle, "could not parse interface record");
    142 	free(str);
    143 	semanage_context_free(con);
    144 	parse_dispose_line(info);
    145 	return STATUS_ERR;
    146 }
    147 
    148 /* IFACE RECORD: FILE extension: method table */
    149 record_file_table_t SEMANAGE_IFACE_FILE_RTABLE = {
    150 	.parse = iface_parse,
    151 	.print = iface_print,
    152 };
    153 
    154 int iface_file_dbase_init(semanage_handle_t * handle,
    155 			  const char *path_ro,
    156 			  const char *path_rw,
    157 			  dbase_config_t * dconfig)
    158 {
    159 
    160 	if (dbase_file_init(handle,
    161 			    path_ro,
    162 			    path_rw,
    163 			    &SEMANAGE_IFACE_RTABLE,
    164 			    &SEMANAGE_IFACE_FILE_RTABLE, &dconfig->dbase) < 0)
    165 		return STATUS_ERR;
    166 
    167 	dconfig->dtable = &SEMANAGE_FILE_DTABLE;
    168 	return STATUS_SUCCESS;
    169 }
    170 
    171 void iface_file_dbase_release(dbase_config_t * dconfig)
    172 {
    173 
    174 	dbase_file_release(dconfig->dbase);
    175 }
    176