blob: 78871a26089eefdeba3f182a29ca3b12c1ea913a [file] [log] [blame]
Joshua Brindle13cd4c82008-08-19 15:30:36 -04001/* Copyright (C) 2005 Red Hat, Inc. */
2
3struct semanage_iface;
4struct semanage_iface_key;
5typedef struct semanage_iface record_t;
6typedef struct semanage_iface_key record_key_t;
7#define DBASE_RECORD_DEFINED
8
9struct dbase_file;
10typedef 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
22static 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
57static 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 */
149record_file_table_t SEMANAGE_IFACE_FILE_RTABLE = {
150 .parse = iface_parse,
151 .print = iface_print,
152};
153
154int iface_file_dbase_init(semanage_handle_t * handle,
155 const char *fname, dbase_config_t * dconfig)
156{
157
158 if (dbase_file_init(handle,
159 fname,
160 &SEMANAGE_IFACE_RTABLE,
161 &SEMANAGE_IFACE_FILE_RTABLE, &dconfig->dbase) < 0)
162 return STATUS_ERR;
163
164 dconfig->dtable = &SEMANAGE_FILE_DTABLE;
165 return STATUS_SUCCESS;
166}
167
168void iface_file_dbase_release(dbase_config_t * dconfig)
169{
170
171 dbase_file_release(dconfig->dbase);
172}