/* Author: Mark Goldman <mgoldman@tresys.com>
*
* Copyright (C) 2007 Tresys Technology, LLC
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
/* This file contains helper functions that are loosely based off of what is
* available from the python script genhomedircon. Also this file contains
* c implementations of a couple of python functions so that genhomedircon will
* look/act like the python script.
*/
#ifndef _SEMANAGE_UTILITIES_H_
#define _SEMANAGE_UTILITIES_H_
#include <stdio.h>
#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
#define WARN_UNUSED \
__attribute__ ((__warn_unused_result__))
#else
# define WARN_UNUSED /* nothing */
#endif
typedef struct list {
char *data;
struct list *next;
} semanage_list_t;
/**
* @param file the path to the file to look for a variable in
* @param var the variable that you want the value of
* @param delim the value that separates the part you care about from the part
* that you don't.
* @return for the first instance of var in the file, returns everything after
* delim.
* returns "" if not found IE if(*(semanage_findval(f,v,d)) == '\0'){
* printf("%s not found in file", v);
* }
*
* NULL for error (out of memory, etc)
*/
char *semanage_findval(const char *file, const char *var, const char *delim) WARN_UNUSED;
/**
* @param str string to test
* @param val prefix
* @return 1 if val is the prefix of str
* 0 if val is not the prefix of str
*
* note: if str == NULL, returns false
* if val == NULL, returns true --nothing can always be the prefix of
* something
* if (*val) == "" returns true same as above.
*/
int semanage_is_prefix(const char *str, const char *val) WARN_UNUSED;
/**
* @param str the string to semanage_split
* @return malloc'd string after the first run of charachters that aren't whitespace
*/
char *semanage_split_on_space(const char *str) WARN_UNUSED;
/**
* @param str the string to semanage_split
* @param delim the string delimiter. NOT a set of charachters that can be
* a delimiter.
* if *delim == '\0' behaves as semanage_splitOnSpace()
* @return a ptr to the first charachter past the delimiter.
* if delim doesn't appear in the string, returns a ptr to the
* trailing null in the string
*/
char *semanage_split(const char *str, const char *delim) WARN_UNUSED;
/* linked list string functions
* Functions allocate memory. Must be free'd with
* either semanage_list_pop until list == NULL or semanage_list_destroy()
*/
int semanage_list_push(semanage_list_t ** list, const char *data) WARN_UNUSED;
char *semanage_list_pop(semanage_list_t ** list);
void semanage_list_destroy(semanage_list_t ** list);
semanage_list_t *semanage_list_find(semanage_list_t * l,
const char *data) WARN_UNUSED;
int semanage_list_sort(semanage_list_t ** l) WARN_UNUSED;
/* function to compare 2 semanage_list_t nodes,
* returns strcmp(x->data, y->data)
* used internally by semanage_list_sort()
*/
int semanage_cmp_plist_t(const semanage_list_t ** x,
const semanage_list_t ** y);
/**
* @param data a target string
* @param what a charachter
* @returns the number of times the char appears in the string
*/
int semanage_str_count(char *data, char what);
/**
* @param - a string
* @param the charachter to trim to
* @return - mangles the string, converting the first
* occurrance of the charachter to a '\0' from
* the end of the string.
*/
void semanage_rtrim(char *str, char trim_to);
/**
* @param data some string
* @return modifies the string such that the first whitespace char becomes
* '\0', ending the string.
*/
void semanage_keep_until_space(char *data);
/**
* @param file - an open FILE to read from
* @param pred - a function taking a string that
* returns 1 if the string should be
* kept and 0 otherwise
* @return a list of lines from the file (empty lines become
* empty strings) in the file order where pred(line)
* returns > 0
*/
semanage_list_t *semanage_slurp_file_filter(FILE * file,
int (*pred) (const char *))
WARN_UNUSED;
#endif