/**
* @file op_file.h
* Useful file management helpers
*
* @remark Copyright 2002 OProfile authors
* @remark Read the file COPYING
*
* @author John Levon
* @author Philippe Elie
*/
#ifndef OP_FILE_H
#define OP_FILE_H
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/types.h>
/**
* op_file_readable - is a file readable
* @param file file name
*
* Return true if the given file is readable and regular.
*
* Beware of race conditions !
*/
int op_file_readable(char const * file);
/**
* op_get_mtime - get mtime of file
* @param file file name
*
* Returns the mtime of the given file or 0 on failure
*/
time_t op_get_mtime(char const * file);
/**
* create_dir - create a directory
* @param dir the directory name to create
*
* Returns 0 on success.
*/
int create_dir(char const * dir);
/**
* create_path - create a path
* @param path the path to create
*
* create directory for each dir components in path
* the last path component is not considered as a directory
* but as a filename
*
* Returns 0 on success.
*/
int create_path(char const * path);
/**
* Clients of get_matching_pathnames must provide their own implementation
* of get_pathname_callback.
*/
typedef void (*get_pathname_callback)(char const * pathname, void * name_list);
/* This enum is intended solely for the use of get_matching_pathnames(),
* bit 0 is reserved for internal use..*/
enum recursion_type {
NO_RECURSION = 2,
MATCH_ANY_ENTRY_RECURSION = 4,
MATCH_DIR_ONLY_RECURSION = 8,
};
/**
* @param name_list where to store result
* @param get_pathname_callback client-provided callback function
* @param base_dir directory from where lookup starts
* @param filter a pathname filter
* @param recursion recursion_type -- see above enum and following description:
* NO_RECURSION: Find matching files from passed base_dir and call
* get_pathname_callback to add entry to name_list to be returned.
* MATCH_ANY_ENTRY_RECURSION: Starting at base_dir, for each entry in the
* dir that matches the filter: if entry is of type 'dir', recurse;
* else call get_pathname_callback to add entry to name_list to be
* returned.
* MATCH_DIR_ONLY_RECURSION: Starting at base_dir, if an entry in the
* dir is of type 'dir' and its complete pathname contains a match to
* the filter, call get_pathname_callback to add entry to name_list to
* be returned; else recurse.
*
* Returns 0 on success.
*
* Return a list of pathnames under base_dir, filtered by filter and optionally
* looking in sub-directory. See description above of the recursion_type
* parameter for more details.
* NOTE: For C clients: Your implementation of the get_pathname_callback
* function will probably dynamically allocate storage for elements
* added to name_list. If so, remember to free that memory when it's
* no longer needed.
*/
int get_matching_pathnames(void * name_list, get_pathname_callback,
char const * base_dir, char const * filter,
enum recursion_type recursion);
#ifdef __cplusplus
}
#endif
#endif /* OP_FILE_H */