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