Don't try to set empty file contexts.
[platform/upstream/rpm.git] / lib / rpmsx.h
1 #ifndef H_RPMSX
2 #define H_RPMSX
3
4 /** \ingroup rpmdep rpmtrans
5  * \file lib/rpmsx.h
6  * Structure(s) used for file security context pattern handling
7  */
8
9 #include <regex.h>
10
11 /**
12  */
13 /*@-exportlocal@*/
14 /*@unchecked@*/
15 extern int _rpmsx_debug;
16 /*@=exportlocal@*/
17
18 /**
19  */
20 /*@-exportlocal@*/
21 /*@unchecked@*/
22 extern int _rpmsx_nopromote;
23 /*@=exportlocal@*/
24
25 typedef /*@abstract@*/ /*@refcounted@*/ struct rpmsx_s * rpmsx;
26 typedef struct rpmsxp_s * rpmsxp;
27 typedef struct rpmsxs_s * rpmsxs;
28
29 #if defined(_RPMSX_INTERNAL)
30 /**
31  * File security context regex pattern.
32  */
33 struct rpmsxp_s {
34 /*@only@*/ /*@relnull@*/
35     const char * pattern;       /*!< File path regex pattern. */
36 /*@only@*/ /*@relnull@*/
37     const char * type;          /*!< File type string. */
38 /*@only@*/ /*@relnull@*/
39     const char * context;       /*!< Security context. */
40 /*@only@*/ /*@relnull@*/
41     regex_t * preg;             /*!< Compiled regex. */
42     mode_t fmode;               /*!< File type. */
43     int matches;
44     int hasMetaChars;
45     int fstem;                  /*!< Stem id. */
46 };
47
48 /**
49  * File/pattern stem.
50  */
51 struct rpmsxs_s {
52 /*@only@*/ /*@relnull@*/
53     const char * stem;
54     int len;
55 };
56
57 /**
58  * File security context patterns container.
59  */
60 struct rpmsx_s {
61 /*@only@*/ /*@relnull@*/
62     rpmsxp sxp;                 /*!< File context patterns. */
63     int Count;                  /*!< No. of file context patterns. */
64     int i;                      /*!< Current pattern index. */
65 /*@only@*/ /*@relnull@*/
66     rpmsxs sxs;                 /*!< File stems. */
67     int nsxs;                   /*!< No. of file stems. */
68     int maxsxs;                 /*!< No. of allocated file stems. */
69     int reverse;                /*!< Reverse traversal? */
70 /*@refs@*/
71     int nrefs;                  /*!< Reference count. */
72 };
73 #endif /* defined(_RPMSX_INTERNAL) */
74
75 #ifdef __cplusplus
76 extern "C" {
77 #endif
78
79 /**
80  * Unreference a security context patterns instance.
81  * @param sx            security context patterns
82  * @param msg
83  * @return              NULL always
84  */
85 /*@unused@*/ /*@null@*/
86 rpmsx rpmsxUnlink (/*@killref@*/ /*@only@*/ /*@null@*/ rpmsx sx,
87                 /*@null@*/ const char * msg)
88         /*@modifies sx @*/;
89
90 /** @todo Remove debugging entry from the ABI. */
91 /*@-exportlocal@*/
92 /*@null@*/
93 rpmsx XrpmsxUnlink (/*@killref@*/ /*@only@*/ /*@null@*/ rpmsx sx,
94                 /*@null@*/ const char * msg, const char * fn, unsigned ln)
95         /*@modifies sx @*/;
96 /*@=exportlocal@*/
97 #define rpmsxUnlink(_sx, _msg)  XrpmsxUnlink(_sx, _msg, __FILE__, __LINE__)
98
99 /**
100  * Reference a security context patterns instance.
101  * @param sx            security context patterns
102  * @param msg
103  * @return              new security context patterns reference
104  */
105 /*@-exportlocal@*/
106 /*@unused@*/ /*@newref@*/ /*@null@*/
107 rpmsx rpmsxLink (/*@null@*/ rpmsx sx, /*@null@*/ const char * msg)
108         /*@modifies sx @*/;
109
110 /** @todo Remove debugging entry from the ABI. */
111 /*@newref@*/ /*@null@*/
112 rpmsx XrpmsxLink (/*@null@*/ rpmsx sx, /*@null@*/ const char * msg,
113                 const char * fn, unsigned ln)
114         /*@modifies sx @*/;
115 /*@=exportlocal@*/
116 #define rpmsxLink(_sx, _msg)    XrpmsxLink(_sx, _msg, __FILE__, __LINE__)
117
118 /**
119  * Destroy a security context patterns.
120  * @param sx            security context patterns
121  * @return              NULL always
122  */
123 /*@-exportlocal@*/
124 /*@null@*/
125 rpmsx rpmsxFree(/*@killref@*/ /*@only@*/ /*@null@*/ rpmsx sx)
126         /*@modifies sx@*/;
127 /*@=exportlocal@*/
128
129 /**
130  * Parse selinux file security context patterns.
131  * @param sx            security context patterns
132  * @param fn            file name to parse
133  * @return              0 on success
134  */
135 /*@-exportlocal@*/
136 int rpmsxParse(rpmsx sx, /*@null@*/ const char *fn)
137         /*@globals fileSystem @*/
138         /*@modifies sx, fileSystem @*/;
139 /*@=exportlocal@*/
140
141 /**
142  * Create and load security context patterns.
143  * @param fn            security context patterns file name
144  * @return              new security context patterns
145  */
146 /*@null@*/
147 rpmsx rpmsxNew(const char * fn)
148         /*@globals fileSystem @*/
149         /*@modifies fileSystem @*/;
150
151 /**
152  * Return security context patterns count.
153  * @param sx            security context patterns
154  * @return              current count
155  */
156 int rpmsxCount(/*@null@*/ const rpmsx sx)
157         /*@*/;
158
159 /**
160  * Return security context patterns index.
161  * @param sx            security context patterns
162  * @return              current index
163  */
164 int rpmsxIx(/*@null@*/ const rpmsx sx)
165         /*@*/;
166
167 /**
168  * Set security context patterns index.
169  * @param sx            security context patterns
170  * @param ix            new index
171  * @return              current index
172  */
173 int rpmsxSetIx(/*@null@*/ rpmsx sx, int ix)
174         /*@modifies sx @*/;
175
176 /**
177  * Return current pattern.
178  * @param sx            security context patterns
179  * @return              current pattern, NULL on invalid
180  */
181 /*@-exportlocal@*/
182 /*@observer@*/ /*@null@*/
183 extern const char * rpmsxPattern(/*@null@*/ const rpmsx sx)
184         /*@*/;
185 /*@=exportlocal@*/
186
187 /**
188  * Return current type.
189  * @param sx            security context patterns
190  * @return              current type, NULL on invalid/missing
191  */
192 /*@-exportlocal@*/
193 /*@observer@*/ /*@null@*/
194 extern const char * rpmsxType(/*@null@*/ const rpmsx sx)
195         /*@*/;
196 /*@=exportlocal@*/
197
198 /**
199  * Return current context.
200  * @param sx            security context patterns
201  * @return              current context, NULL on invalid
202  */
203 /*@-exportlocal@*/
204 /*@observer@*/ /*@null@*/
205 extern const char * rpmsxContext(/*@null@*/ const rpmsx sx)
206         /*@*/;
207 /*@=exportlocal@*/
208
209 /**
210  * Return current regex.
211  * @param sx            security context patterns
212  * @return              current context, NULL on invalid
213  */
214 /*@-exportlocal@*/
215 /*@observer@*/ /*@null@*/
216 extern regex_t * rpmsxRE(/*@null@*/ const rpmsx sx)
217         /*@*/;
218 /*@=exportlocal@*/
219
220 /**
221  * Return current file mode.
222  * @param sx            security context patterns
223  * @return              current file mode, 0 on invalid
224  */
225 /*@-exportlocal@*/
226 extern mode_t rpmsxFMode(/*@null@*/ const rpmsx sx)
227         /*@*/;
228 /*@=exportlocal@*/
229
230 /**
231  * Return current file stem.
232  * @param sx            security context patterns
233  * @return              current file stem, -1 on invalid
234  */
235 /*@-exportlocal@*/
236 extern int rpmsxFStem(/*@null@*/ const rpmsx sx)
237         /*@*/;
238 /*@=exportlocal@*/
239
240 /**
241  * Return next security context patterns iterator index.
242  * @param sx            security context patterns
243  * @return              security context patterns iterator index, -1 on termination
244  */
245 /*@-exportlocal@*/
246 int rpmsxNext(/*@null@*/ rpmsx sx)
247         /*@modifies sx @*/;
248 /*@=exportlocal@*/
249
250 /**
251  * Initialize security context patterns iterator.
252  * @param sx            security context patterns
253  * @param reverse       iterate in reverse order?
254  * @return              security context patterns
255  */
256 /*@-exportlocal@*/
257 /*@null@*/
258 rpmsx rpmsxInit(/*@null@*/ rpmsx sx, int reverse)
259         /*@modifies sx @*/;
260 /*@=exportlocal@*/
261
262 /**
263  * Find file security context from path and type.
264  * @param sx            security context patterns
265  * @param fn            file path
266  * @param fmode         file mode
267  * @return              file security context
268  */
269 /*@owned@*/ /*@null@*/
270 const char * rpmsxFContext(rpmsx sx, const char * fn, mode_t fmode)
271         /*@modifies sx @*/;
272
273 #ifdef __cplusplus
274 }
275 #endif
276
277 #endif  /* H_RPMSX */