Home | History | Annotate | Download | only in libutil
      1 /**
      2  * @file op_file.h
      3  * Useful file management helpers
      4  *
      5  * @remark Copyright 2002 OProfile authors
      6  * @remark Read the file COPYING
      7  *
      8  * @author John Levon
      9  * @author Philippe Elie
     10  */
     11 
     12 #ifndef OP_FILE_H
     13 #define OP_FILE_H
     14 
     15 #ifdef __cplusplus
     16 extern "C" {
     17 #endif
     18 
     19 #include <sys/types.h>
     20 
     21 /**
     22  * op_file_readable - is a file readable
     23  * @param file file name
     24  *
     25  * Return true if the given file is readable and regular.
     26  *
     27  * Beware of race conditions !
     28  */
     29 int op_file_readable(char const * file);
     30 
     31 /**
     32  * op_get_mtime - get mtime of file
     33  * @param file  file name
     34  *
     35  * Returns the mtime of the given file or 0 on failure
     36  */
     37 time_t op_get_mtime(char const * file);
     38 
     39 /**
     40  * create_dir - create a directory
     41  * @param dir  the directory name to create
     42  *
     43  * Returns 0 on success.
     44  */
     45 int create_dir(char const * dir);
     46 
     47 
     48 /**
     49  * create_path - create a path
     50  * @param path  the path to create
     51  *
     52  * create directory for each dir components in path
     53  * the last path component is not considered as a directory
     54  * but as a filename
     55  *
     56  * Returns 0 on success.
     57  */
     58 int create_path(char const * path);
     59 
     60 /**
     61  * Clients of get_matching_pathnames must provide their own implementation
     62  * of get_pathname_callback.
     63  */
     64 typedef void (*get_pathname_callback)(char const * pathname, void * name_list);
     65 
     66 /* This enum is intended solely for the use of get_matching_pathnames(),
     67  * bit 0 is reserved for internal use..*/
     68 enum recursion_type {
     69 	NO_RECURSION = 2,
     70 	MATCH_ANY_ENTRY_RECURSION = 4,
     71 	MATCH_DIR_ONLY_RECURSION = 8,
     72 };
     73 /**
     74  * @param name_list where to store result
     75  * @param get_pathname_callback client-provided callback function
     76  * @param base_dir directory from where lookup starts
     77  * @param filter a pathname filter
     78  * @param recursion recursion_type -- see above enum and following description:
     79  *	NO_RECURSION:  Find matching files from passed base_dir and call
     80  *          get_pathname_callback to add entry to name_list to be returned.
     81  *	MATCH_ANY_ENTRY_RECURSION: Starting at base_dir, for each entry in the
     82  *	   dir that matches the filter: if entry is of type 'dir', recurse;
     83  *         else call get_pathname_callback to add entry to name_list to be
     84  *         returned.
     85  *	MATCH_DIR_ONLY_RECURSION: Starting at base_dir, if an entry in the
     86  *         dir is of type 'dir' and its complete pathname contains a match to
     87  *         the filter, call get_pathname_callback to add entry to name_list to
     88  *         be returned; else recurse.
     89  *
     90  * Returns 0 on success.
     91  *
     92  * Return a list of pathnames under base_dir, filtered by filter and optionally
     93  * looking in sub-directory. See description above of the recursion_type
     94  * parameter for more details.
     95  *    NOTE: For C clients: Your implementation of the get_pathname_callback
     96  *          function will probably dynamically allocate storage for elements
     97  *          added to name_list.  If so, remember to free that memory when it's
     98  *          no longer needed.
     99  */
    100 int get_matching_pathnames(void * name_list, get_pathname_callback,
    101 			   char const * base_dir, char const * filter,
    102 			   enum recursion_type recursion);
    103 
    104 
    105 #ifdef __cplusplus
    106 }
    107 #endif
    108 
    109 #endif /* OP_FILE_H */
    110