113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/* Author: Mark Goldman <mgoldman@tresys.com> 213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * 313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * Copyright (C) 2007 Tresys Technology, LLC 413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * 513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * This library is free software; you can redistribute it and/or 613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * modify it under the terms of the GNU Lesser General Public 713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * License as published by the Free Software Foundation; either 813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * version 2.1 of the License, or (at your option) any later version. 913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * 1013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * This library is distributed in the hope that it will be useful, 1113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * but WITHOUT ANY WARRANTY; without even the implied warranty of 1213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * Lesser General Public License for more details. 1413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * 1513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * You should have received a copy of the GNU Lesser General Public 1613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * License along with this library; if not, write to the Free Software 1713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 1813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle */ 1913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 2013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/* This file contains helper functions that are loosely based off of what is 2113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * available from the python script genhomedircon. Also this file contains 2213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * c implementations of a couple of python functions so that genhomedircon will 2313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * look/act like the python script. 2413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle */ 2513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#ifndef _SEMANAGE_UTILITIES_H_ 2613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#define _SEMANAGE_UTILITIES_H_ 2713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 2813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <stdio.h> 2913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 3013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#if defined(__GNUC__) && !defined(__STRICT_ANSI__) 3113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#define WARN_UNUSED \ 3213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle __attribute__ ((__warn_unused_result__)) 3313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#else 3413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle# define WARN_UNUSED /* nothing */ 3513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#endif 3613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 3713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindletypedef struct list { 3813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle char *data; 3913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle struct list *next; 4013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle} semanage_list_t; 4113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 4213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/** 4313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * @param file the path to the file to look for a variable in 4413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * @param var the variable that you want the value of 4513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * @param delim the value that separates the part you care about from the part 4613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * that you don't. 4713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * @return for the first instance of var in the file, returns everything after 4813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * delim. 4913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * returns "" if not found IE if(*(semanage_findval(f,v,d)) == '\0'){ 5013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * printf("%s not found in file", v); 5113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * } 5213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * 5313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * NULL for error (out of memory, etc) 5413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle */ 55b8b0d7fa8ad38104ec017fd2b4d41bc5e4845f3cNicolas Ioosschar *semanage_findval(const char *file, const char *var, const char *delim) WARN_UNUSED; 5613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 5713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/** 5813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * @param str string to test 5913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * @param val prefix 6013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * @return 1 if val is the prefix of str 6113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * 0 if val is not the prefix of str 6213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * 6313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * note: if str == NULL, returns false 6413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * if val == NULL, returns true --nothing can always be the prefix of 6513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * something 6613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * if (*val) == "" returns true same as above. 6713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle */ 6813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleint semanage_is_prefix(const char *str, const char *val) WARN_UNUSED; 6913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 7013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/** 7113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * @param str the string to semanage_split 7213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * @return malloc'd string after the first run of charachters that aren't whitespace 7313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle */ 7413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlechar *semanage_split_on_space(const char *str) WARN_UNUSED; 7513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 7613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/** 7713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * @param str the string to semanage_split 7813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * @param delim the string delimiter. NOT a set of charachters that can be 7913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * a delimiter. 8013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * if *delim == '\0' behaves as semanage_splitOnSpace() 8113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * @return a ptr to the first charachter past the delimiter. 8213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * if delim doesn't appear in the string, returns a ptr to the 8313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * trailing null in the string 8413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle */ 8513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlechar *semanage_split(const char *str, const char *delim) WARN_UNUSED; 8613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 8713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/* linked list string functions 8813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * Functions allocate memory. Must be free'd with 8913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * either semanage_list_pop until list == NULL or semanage_list_destroy() 9013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle */ 91b8b0d7fa8ad38104ec017fd2b4d41bc5e4845f3cNicolas Ioossint semanage_list_push(semanage_list_t ** list, const char *data) WARN_UNUSED; 9213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlechar *semanage_list_pop(semanage_list_t ** list); 9313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlevoid semanage_list_destroy(semanage_list_t ** list); 9413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlesemanage_list_t *semanage_list_find(semanage_list_t * l, 95b8b0d7fa8ad38104ec017fd2b4d41bc5e4845f3cNicolas Iooss const char *data) WARN_UNUSED; 9613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleint semanage_list_sort(semanage_list_t ** l) WARN_UNUSED; 9713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/* function to compare 2 semanage_list_t nodes, 9813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * returns strcmp(x->data, y->data) 9913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * used internally by semanage_list_sort() 10013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle */ 10113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleint semanage_cmp_plist_t(const semanage_list_t ** x, 10213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle const semanage_list_t ** y); 10313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/** 10413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * @param data a target string 10513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * @param what a charachter 10613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * @returns the number of times the char appears in the string 10713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle */ 10813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleint semanage_str_count(char *data, char what); 10913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/** 11013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * @param - a string 11113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * @param the charachter to trim to 11213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * @return - mangles the string, converting the first 11313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * occurrance of the charachter to a '\0' from 11413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * the end of the string. 11513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle */ 11613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlevoid semanage_rtrim(char *str, char trim_to); 11713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 11813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/** 11913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * @param data some string 12013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * @return modifies the string such that the first whitespace char becomes 12113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * '\0', ending the string. 12213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle */ 12313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlevoid semanage_keep_until_space(char *data); 12413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 12513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/** 12613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * @param file - an open FILE to read from 12713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * @param pred - a function taking a string that 12813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * returns 1 if the string should be 12913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * kept and 0 otherwise 13013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * @return a list of lines from the file (empty lines become 13113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * empty strings) in the file order where pred(line) 13213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * returns > 0 13313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle */ 13413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlesemanage_list_t *semanage_slurp_file_filter(FILE * file, 13513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle int (*pred) (const char *)) 13613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle WARN_UNUSED; 13713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#endif 138