xref: /aosp_15_r20/external/selinux/libsemanage/src/utilities.h (revision 2d543d20722ada2425b5bdab9d0d1d29470e7bba)
1*2d543d20SAndroid Build Coastguard Worker /* Author: Mark Goldman   <[email protected]>
2*2d543d20SAndroid Build Coastguard Worker  *
3*2d543d20SAndroid Build Coastguard Worker  * Copyright (C) 2007 Tresys Technology, LLC
4*2d543d20SAndroid Build Coastguard Worker  *
5*2d543d20SAndroid Build Coastguard Worker  *  This library is free software; you can redistribute it and/or
6*2d543d20SAndroid Build Coastguard Worker  *  modify it under the terms of the GNU Lesser General Public
7*2d543d20SAndroid Build Coastguard Worker  *  License as published by the Free Software Foundation; either
8*2d543d20SAndroid Build Coastguard Worker  *  version 2.1 of the License, or (at your option) any later version.
9*2d543d20SAndroid Build Coastguard Worker  *
10*2d543d20SAndroid Build Coastguard Worker  *  This library is distributed in the hope that it will be useful,
11*2d543d20SAndroid Build Coastguard Worker  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12*2d543d20SAndroid Build Coastguard Worker  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13*2d543d20SAndroid Build Coastguard Worker  *  Lesser General Public License for more details.
14*2d543d20SAndroid Build Coastguard Worker  *
15*2d543d20SAndroid Build Coastguard Worker  *  You should have received a copy of the GNU Lesser General Public
16*2d543d20SAndroid Build Coastguard Worker  *  License along with this library; if not, write to the Free Software
17*2d543d20SAndroid Build Coastguard Worker  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18*2d543d20SAndroid Build Coastguard Worker  */
19*2d543d20SAndroid Build Coastguard Worker 
20*2d543d20SAndroid Build Coastguard Worker /* This file contains helper functions that are loosely based off of what is
21*2d543d20SAndroid Build Coastguard Worker  * available from the python script genhomedircon.  Also this file contains
22*2d543d20SAndroid Build Coastguard Worker  * c implementations of a couple of python functions so that genhomedircon will
23*2d543d20SAndroid Build Coastguard Worker  * look/act like the python script.
24*2d543d20SAndroid Build Coastguard Worker  */
25*2d543d20SAndroid Build Coastguard Worker #ifndef _SEMANAGE_UTILITIES_H_
26*2d543d20SAndroid Build Coastguard Worker #define _SEMANAGE_UTILITIES_H_
27*2d543d20SAndroid Build Coastguard Worker 
28*2d543d20SAndroid Build Coastguard Worker #include <stdio.h>
29*2d543d20SAndroid Build Coastguard Worker 
30*2d543d20SAndroid Build Coastguard Worker #if defined(__GNUC__) && !defined(__STRICT_ANSI__)
31*2d543d20SAndroid Build Coastguard Worker #define WARN_UNUSED \
32*2d543d20SAndroid Build Coastguard Worker 	__attribute__ ((__warn_unused_result__))
33*2d543d20SAndroid Build Coastguard Worker #else
34*2d543d20SAndroid Build Coastguard Worker # define WARN_UNUSED		/* nothing */
35*2d543d20SAndroid Build Coastguard Worker #endif
36*2d543d20SAndroid Build Coastguard Worker 
37*2d543d20SAndroid Build Coastguard Worker typedef struct list {
38*2d543d20SAndroid Build Coastguard Worker 	char *data;
39*2d543d20SAndroid Build Coastguard Worker 	struct list *next;
40*2d543d20SAndroid Build Coastguard Worker } semanage_list_t;
41*2d543d20SAndroid Build Coastguard Worker 
42*2d543d20SAndroid Build Coastguard Worker /**
43*2d543d20SAndroid Build Coastguard Worker  * @param file  the path to the file to look for a variable in
44*2d543d20SAndroid Build Coastguard Worker  * @param var   the variable that you want the value of
45*2d543d20SAndroid Build Coastguard Worker  * @param delim the value that separates the part you care about from the part
46*2d543d20SAndroid Build Coastguard Worker  *	       that you don't.
47*2d543d20SAndroid Build Coastguard Worker  * @return for the first instance of var in the file, returns everything after
48*2d543d20SAndroid Build Coastguard Worker  *	   delim.
49*2d543d20SAndroid Build Coastguard Worker  *	   returns "" if not found IE if(*(semanage_findval(f,v,d)) == '\0'){
50*2d543d20SAndroid Build Coastguard Worker  *					  printf("%s not found in file", v);
51*2d543d20SAndroid Build Coastguard Worker  *				       }
52*2d543d20SAndroid Build Coastguard Worker  *
53*2d543d20SAndroid Build Coastguard Worker  *	   NULL for error (out of memory, etc)
54*2d543d20SAndroid Build Coastguard Worker  */
55*2d543d20SAndroid Build Coastguard Worker char *semanage_findval(const char *file, const char *var, const char *delim) WARN_UNUSED;
56*2d543d20SAndroid Build Coastguard Worker 
57*2d543d20SAndroid Build Coastguard Worker /**
58*2d543d20SAndroid Build Coastguard Worker  * @param str   string to test
59*2d543d20SAndroid Build Coastguard Worker  * @param	 val   prefix
60*2d543d20SAndroid Build Coastguard Worker  * @return  1 if val is the prefix of str
61*2d543d20SAndroid Build Coastguard Worker  *	    0 if val is not the prefix of str
62*2d543d20SAndroid Build Coastguard Worker  *
63*2d543d20SAndroid Build Coastguard Worker  * note: if str == NULL, returns false
64*2d543d20SAndroid Build Coastguard Worker  *	 if val == NULL, returns true --nothing can always be the prefix of
65*2d543d20SAndroid Build Coastguard Worker  *				        something
66*2d543d20SAndroid Build Coastguard Worker  *	 if (*val) == "" returns true same as above.
67*2d543d20SAndroid Build Coastguard Worker  */
68*2d543d20SAndroid Build Coastguard Worker int semanage_is_prefix(const char *str, const char *val) WARN_UNUSED;
69*2d543d20SAndroid Build Coastguard Worker 
70*2d543d20SAndroid Build Coastguard Worker /**
71*2d543d20SAndroid Build Coastguard Worker  * @param str   the string to semanage_split
72*2d543d20SAndroid Build Coastguard Worker  * @return     malloc'd string after the first run of characters that aren't whitespace
73*2d543d20SAndroid Build Coastguard Worker  */
74*2d543d20SAndroid Build Coastguard Worker char *semanage_split_on_space(const char *str) WARN_UNUSED;
75*2d543d20SAndroid Build Coastguard Worker 
76*2d543d20SAndroid Build Coastguard Worker /**
77*2d543d20SAndroid Build Coastguard Worker  * @param	 str   the string to semanage_split
78*2d543d20SAndroid Build Coastguard Worker  * @param	 delim the string delimiter.  NOT a set of characters that can be
79*2d543d20SAndroid Build Coastguard Worker  *	       a delimiter.
80*2d543d20SAndroid Build Coastguard Worker  *	       if *delim == '\0' behaves as semanage_splitOnSpace()
81*2d543d20SAndroid Build Coastguard Worker  * @return   a ptr to the first character past the delimiter.
82*2d543d20SAndroid Build Coastguard Worker  *	    if delim doesn't appear in the string, returns a ptr to the
83*2d543d20SAndroid Build Coastguard Worker  *	    trailing null in the string
84*2d543d20SAndroid Build Coastguard Worker  */
85*2d543d20SAndroid Build Coastguard Worker char *semanage_split(const char *str, const char *delim) WARN_UNUSED;
86*2d543d20SAndroid Build Coastguard Worker 
87*2d543d20SAndroid Build Coastguard Worker /* linked list string functions
88*2d543d20SAndroid Build Coastguard Worker  * Functions allocate memory.  Must be free'd with
89*2d543d20SAndroid Build Coastguard Worker  * either semanage_list_pop until list == NULL or semanage_list_destroy()
90*2d543d20SAndroid Build Coastguard Worker  */
91*2d543d20SAndroid Build Coastguard Worker int semanage_list_push(semanage_list_t ** list, const char *data) WARN_UNUSED;
92*2d543d20SAndroid Build Coastguard Worker char *semanage_list_pop(semanage_list_t ** list);
93*2d543d20SAndroid Build Coastguard Worker void semanage_list_destroy(semanage_list_t ** list);
94*2d543d20SAndroid Build Coastguard Worker semanage_list_t *semanage_list_find(semanage_list_t * l,
95*2d543d20SAndroid Build Coastguard Worker 				    const char *data) WARN_UNUSED;
96*2d543d20SAndroid Build Coastguard Worker int semanage_list_sort(semanage_list_t ** l) WARN_UNUSED;
97*2d543d20SAndroid Build Coastguard Worker /* function to compare 2 semanage_list_t nodes,
98*2d543d20SAndroid Build Coastguard Worker  * returns strcmp(x->data, y->data)
99*2d543d20SAndroid Build Coastguard Worker  * used internally by semanage_list_sort()
100*2d543d20SAndroid Build Coastguard Worker  */
101*2d543d20SAndroid Build Coastguard Worker int semanage_cmp_plist_t(const semanage_list_t ** x,
102*2d543d20SAndroid Build Coastguard Worker 			 const semanage_list_t ** y);
103*2d543d20SAndroid Build Coastguard Worker /**
104*2d543d20SAndroid Build Coastguard Worker  * @param      data a target string
105*2d543d20SAndroid Build Coastguard Worker  * @param      what  a character
106*2d543d20SAndroid Build Coastguard Worker  * @returns    the number of times the char appears in the string
107*2d543d20SAndroid Build Coastguard Worker  */
108*2d543d20SAndroid Build Coastguard Worker int semanage_str_count(const char *data, char what);
109*2d543d20SAndroid Build Coastguard Worker /**
110*2d543d20SAndroid Build Coastguard Worker  * @param      - a string
111*2d543d20SAndroid Build Coastguard Worker  * @param            the character to trim to
112*2d543d20SAndroid Build Coastguard Worker  * @return   - mangles the string, converting the first
113*2d543d20SAndroid Build Coastguard Worker  *             occurrence of the character to a '\0' from
114*2d543d20SAndroid Build Coastguard Worker  *             the end of the string.
115*2d543d20SAndroid Build Coastguard Worker  */
116*2d543d20SAndroid Build Coastguard Worker void semanage_rtrim(char *str, char trim_to);
117*2d543d20SAndroid Build Coastguard Worker 
118*2d543d20SAndroid Build Coastguard Worker /**
119*2d543d20SAndroid Build Coastguard Worker  * @param      value being searched for
120*2d543d20SAndroid Build Coastguard Worker  * @param      replacement value that replaces found search values
121*2d543d20SAndroid Build Coastguard Worker  * @param      string being searched and replaced on
122*2d543d20SAndroid Build Coastguard Worker  * @param      maximum number of value occurrences (zero for unlimited)
123*2d543d20SAndroid Build Coastguard Worker  * @return     newly-allocated string with the replaced values
124*2d543d20SAndroid Build Coastguard Worker  */
125*2d543d20SAndroid Build Coastguard Worker char *semanage_str_replace(const char *search, const char *replace,
126*2d543d20SAndroid Build Coastguard Worker 			   const char *src, size_t lim);
127*2d543d20SAndroid Build Coastguard Worker 
128*2d543d20SAndroid Build Coastguard Worker /**
129*2d543d20SAndroid Build Coastguard Worker  * @param data    some string
130*2d543d20SAndroid Build Coastguard Worker  * @return  modifies the string such that the first whitespace char becomes
131*2d543d20SAndroid Build Coastguard Worker  *	    '\0', ending the string.
132*2d543d20SAndroid Build Coastguard Worker  */
133*2d543d20SAndroid Build Coastguard Worker void semanage_keep_until_space(char *data);
134*2d543d20SAndroid Build Coastguard Worker 
135*2d543d20SAndroid Build Coastguard Worker /**
136*2d543d20SAndroid Build Coastguard Worker  * @param    file    - an open FILE to read from
137*2d543d20SAndroid Build Coastguard Worker  * @param    pred    - a function taking a string that
138*2d543d20SAndroid Build Coastguard Worker  *                    returns 1 if the string should be
139*2d543d20SAndroid Build Coastguard Worker  *                    kept and 0 otherwise
140*2d543d20SAndroid Build Coastguard Worker  * @return  a list of lines from the file (empty lines become
141*2d543d20SAndroid Build Coastguard Worker  *          empty strings) in the file order where pred(line)
142*2d543d20SAndroid Build Coastguard Worker  *          returns > 0
143*2d543d20SAndroid Build Coastguard Worker  */
144*2d543d20SAndroid Build Coastguard Worker semanage_list_t *semanage_slurp_file_filter(FILE * file,
145*2d543d20SAndroid Build Coastguard Worker 					    int (*pred) (const char *))
146*2d543d20SAndroid Build Coastguard Worker     WARN_UNUSED;
147*2d543d20SAndroid Build Coastguard Worker #endif
148