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