18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Copyright (C) 2007-2009 The Android Open Source Project
28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project**
38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This software is licensed under the terms of the GNU General Public
48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** License version 2, as published by the Free Software Foundation, and
58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** may be copied, distributed, and modified under those terms.
68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project**
78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This program is distributed in the hope that it will be useful,
88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** but WITHOUT ANY WARRANTY; without even the implied warranty of
98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** GNU General Public License for more details.
118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*/
128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef _ANDROID_UTILS_PATH_H
138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define _ANDROID_UTILS_PATH_H
148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15c6e0caedac5585546cb68605418eedc9e726b44bDavid 'Digit' Turner#include <android/utils/compiler.h>
168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <android/utils/system.h>
178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <stdint.h>  /* for uint64_t */
188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
19c6e0caedac5585546cb68605418eedc9e726b44bDavid 'Digit' TurnerANDROID_BEGIN_HEADER
20c6e0caedac5585546cb68605418eedc9e726b44bDavid 'Digit' Turner
218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/** MISC FILE AND DIRECTORY HANDLING
228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **/
238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* O_BINARY is required in the MS C library to avoid opening file
258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * in text mode (the default, ahhhhh)
268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if !defined(_WIN32) && !defined(O_BINARY)
288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  define  O_BINARY  0
298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* define  PATH_SEP as a string containing the directory separateor */
328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32
338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  define  PATH_SEP   "\\"
345389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#  define  PATH_SEP_C '\\'
358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  define  PATH_SEP   "/"
375389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#  define  PATH_SEP_C '/'
388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* get MAX_PATH, note that PATH_MAX is set to 260 on Windows for
418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * stupid backwards-compatibility reason, though any 32-bit version
428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * of the OS handles much much longer paths
438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32
458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  undef   MAX_PATH
468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  define  MAX_PATH    1024
478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  undef   PATH_MAX
488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  define  PATH_MAX    MAX_PATH
498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  include <limits.h>
518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  define  MAX_PATH    PATH_MAX
528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* checks that a given file exists */
558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern ABool  path_exists( const char*  path );
568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* checks that a path points to a regular file */
588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern ABool  path_is_regular( const char*  path );
598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* checks that a path points to a directory */
618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern ABool  path_is_dir( const char*  path );
628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* checks that a path is absolute or not */
648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern ABool  path_is_absolute( const char*  path );
658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* checks that one can read/write a given (regular) file */
678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern ABool  path_can_read( const char*  path );
688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern ABool  path_can_write( const char*  path );
698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
702d238fd9871687b1557f15b8878a6cf3e9634b57David 'Digit' Turner/* checks that one can execute a given file */
712d238fd9871687b1557f15b8878a6cf3e9634b57David 'Digit' Turnerextern ABool  path_can_exec( const char* path );
722d238fd9871687b1557f15b8878a6cf3e9634b57David 'Digit' Turner
738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* try to make a directory */
748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern APosixStatus   path_mkdir( const char*  path, int  mode );
758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
765389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine/* ensure that a given directory exists, create it if not,
778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0 on success, -1 on error */
788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern APosixStatus   path_mkdir_if_needed( const char*  path, int  mode );
798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* return the size of a given file in '*psize'. returns 0 on
818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * success, -1 on failure (error code in errno) */
828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern APosixStatus   path_get_size( const char*  path, uint64_t  *psize );
838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*  path_parent() can be used to return the n-level parent of a given directory
858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *  this understands . and .. when encountered in the input path.
868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *  the returned string must be freed by the caller.
888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern char*  path_parent( const char*  path, int  levels );
908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* split a path into a (dirname,basename) pair. the result strings must be freed
928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * by the caller. Return 0 on success, or -1 on error. Error conditions include
938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * the following:
948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *   - 'path' is empty
958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *   - 'path' is "/" or degenerate cases like "////"
968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *   - basename is "." or ".."
978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * if there is no directory separator in path, *dirname will be set to "."
998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * if the path is of type "/foo", then *dirname will be set to "/"
1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * pdirname can be NULL if you don't want the directory name
1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * pbasename can be NULL if you don't want the base name
1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern int    path_split( const char*  path, char* *pdirname, char* *pbasename );
1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* a convenience function to retrieve the directory name as returned by
1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * path_split(). Returns NULL if path_split() returns an error.
1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * the result string must be freed by the caller
1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern char*  path_dirname( const char*  path );
1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* a convenience function to retrieve the base name as returned by
1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * path_split(). Returns NULL if path_split() returns an error.
1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * the result must be freed by the caller.
1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern char*  path_basename( const char*  path );
1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1182d238fd9871687b1557f15b8878a6cf3e9634b57David 'Digit' Turner/* look for a given executable in the system path and return its full path.
1192d238fd9871687b1557f15b8878a6cf3e9634b57David 'Digit' Turner * Returns NULL if not found. Note that on Windows this doesn't not append
1202d238fd9871687b1557f15b8878a6cf3e9634b57David 'Digit' Turner * an .exe prefix, or other magical thing like Cygwin usually does.
1212d238fd9871687b1557f15b8878a6cf3e9634b57David 'Digit' Turner */
1222d238fd9871687b1557f15b8878a6cf3e9634b57David 'Digit' Turnerextern char*  path_search_exec( const char* filename );
1232d238fd9871687b1557f15b8878a6cf3e9634b57David 'Digit' Turner
124816e53ca385b64c18c9c7cfca569c4d747634e97David 'Digit' Turner/* Return the absolute version of a path. If 'path' is already absolute,
125816e53ca385b64c18c9c7cfca569c4d747634e97David 'Digit' Turner * this will be a simple copy. Otherwise, this function will prepend the
126816e53ca385b64c18c9c7cfca569c4d747634e97David 'Digit' Turner * current working directory to the result.
127816e53ca385b64c18c9c7cfca569c4d747634e97David 'Digit' Turner */
128816e53ca385b64c18c9c7cfca569c4d747634e97David 'Digit' Turnerextern char*  path_get_absolute( const char* path );
129816e53ca385b64c18c9c7cfca569c4d747634e97David 'Digit' Turner
1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/** OTHER FILE UTILITIES
1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **
1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **  path_empty_file() creates an empty file at a given path location.
1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **  if the file already exists, it is truncated without warning
1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **
1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **  path_copy_file() copies one file into another.
1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **
1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **  unlink_file() is equivalent to unlink() on Unix, on Windows,
1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **  it will handle the case where _unlink() fails because the file is
1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **  read-only by trying to change its access rights then calling _unlink()
1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **  again.
1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **
1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **  these functions return 0 on success, and -1 on error
1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **
1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **  load_text_file() reads a file into a heap-allocated memory block,
1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **  and appends a 0 to it. the caller must free it
1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **/
1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* creates an empty file at a given location. If the file already
1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * exists, it is truncated without warning. returns 0 on success,
1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * or -1 on failure.
1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern APosixStatus   path_empty_file( const char*  path );
1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* copies on file into another one. 0 on success, -1 on failure
1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (error code in errno). Does not work on directories */
1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern APosixStatus   path_copy_file( const char*  dest, const char*  source );
1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* unlink/delete a given file. Note that on Win32, this will
1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * fail if the program has an opened handle to the file
1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern APosixStatus   path_delete_file( const char*  path );
1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* try to load a given file into a heap-allocated block.
1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * if 'pSize' is not NULL, this will set the file's size in '*pSize'
1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * note that this actually zero-terminates the file for convenience.
1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * In case of failure, NULL is returned and the error code is in errno
1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void*          path_load_file( const char*  path, size_t  *pSize );
1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* */
171c6e0caedac5585546cb68605418eedc9e726b44bDavid 'Digit' TurnerANDROID_END_HEADER
1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* _ANDROID_UTILS_PATH_H */
174