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