2006-10-19 19:50:23 +08:00
/** \file path.h
2012-11-18 18:23:22 +08:00
Directory utilities . This library contains functions for locating
configuration directories , for testing if a command with a given
name can be found in the PATH , and various other path - related
issues .
2006-10-19 19:50:23 +08:00
*/
# ifndef FISH_PATH_H
# define FISH_PATH_H
2012-07-21 13:11:05 +08:00
# include "env.h"
2008-01-14 00:47:47 +08:00
/**
Return value for path_cdpath_get when locatied a rotten symlink
*/
2007-09-21 01:52:43 +08:00
# define EROTTEN 1
2006-10-19 19:50:23 +08:00
/**
Returns the user configuration directory for fish . If the directory
or one of it ' s parents doesn ' t exist , they are first created .
2012-02-10 10:43:36 +08:00
\ param path The directory as an out param
\ return whether the directory was returned successfully
2006-10-19 19:50:23 +08:00
*/
2012-02-06 08:42:24 +08:00
bool path_get_config ( wcstring & path ) ;
2006-10-19 19:50:23 +08:00
/**
2012-07-21 13:11:05 +08:00
Finds the full path of an executable . Returns YES if successful .
2012-11-18 18:23:22 +08:00
2006-10-19 19:50:23 +08:00
\ param cmd The name of the executable .
2012-07-21 13:11:05 +08:00
\ param output_or_NULL If non - NULL , store the full path .
\ param vars The environment variables snapshot to use
2012-01-30 15:22:42 +08:00
\ return 0 if the command can not be found , the path of the command otherwise . The result should be freed with free ( ) .
2006-10-19 19:50:23 +08:00
*/
2012-07-21 13:11:05 +08:00
bool path_get_path ( const wcstring & cmd ,
wcstring * output_or_NULL ,
const env_vars_snapshot_t & vars = env_vars_snapshot_t : : current ( ) ) ;
2012-06-03 05:04:25 +08:00
2006-10-19 19:50:23 +08:00
/**
2007-09-21 01:52:43 +08:00
Returns the full path of the specified directory , using the CDPATH
variable as a list of base directories for relative paths . The
returned string is allocated using halloc and the specified
context .
2012-11-18 18:23:22 +08:00
2007-09-21 01:52:43 +08:00
If no valid path is found , null is returned and errno is set to
ENOTDIR if at least one such path was found , but it did not point
to a directory , EROTTEN if a arotten symbolic link was found , or
ENOENT if no file of the specified name was found . If both a rotten
symlink and a file are found , it is undefined which error status
will be returned .
2012-11-18 18:23:22 +08:00
2012-07-21 13:11:05 +08:00
\ param dir The name of the directory .
\ param out_or_NULL If non - NULL , return the path to the resolved directory
2012-02-19 10:54:36 +08:00
\ param wd The working directory , or NULL to use the default . The working directory should have a slash appended at the end .
2012-07-21 13:11:05 +08:00
\ param vars The environment variable snapshot to use ( for the CDPATH variable )
2012-02-01 08:50:03 +08:00
\ return 0 if the command can not be found , the path of the command otherwise . The path should be free ' d with free ( ) .
2006-10-19 19:50:23 +08:00
*/
2012-07-21 13:11:05 +08:00
bool path_get_cdpath ( const wcstring & dir ,
wcstring * out_or_NULL ,
const wchar_t * wd = NULL ,
const env_vars_snapshot_t & vars = env_vars_snapshot_t : : current ( ) ) ;
2012-02-09 03:48:51 +08:00
2012-07-21 13:11:05 +08:00
/** Returns whether the path can be used for an implicit cd command; if so, also returns the path by reference (if desired). This requires it to start with one of the allowed prefixes (., .., ~) and resolve to a directory. */
bool path_can_be_implicit_cd ( const wcstring & path ,
wcstring * out_path = NULL ,
const wchar_t * wd = NULL ,
const env_vars_snapshot_t & vars = env_vars_snapshot_t : : current ( ) ) ;
2006-10-19 19:50:23 +08:00
2008-01-14 00:47:47 +08:00
/**
2012-02-08 13:23:12 +08:00
Remove double slashes and trailing slashes from a path ,
e . g . transform foo //bar/ into foo/bar. The string is modified in-place.
2008-01-14 00:47:47 +08:00
*/
2012-11-19 08:30:30 +08:00
void path_make_canonical ( wcstring & path ) ;
2007-05-11 03:11:28 +08:00
2013-08-28 09:26:22 +08:00
/** Check if two paths are equivalent, which means to ignore runs of multiple slashes (or trailing slashes) */
bool paths_are_equivalent ( const wcstring & p1 , const wcstring & p2 ) ;
2012-02-19 10:54:36 +08:00
bool path_is_valid ( const wcstring & path , const wcstring & working_directory ) ;
2012-02-19 13:56:30 +08:00
/** Returns whether the two paths refer to the same file */
bool paths_are_same_file ( const wcstring & path1 , const wcstring & path2 ) ;
2006-10-19 19:50:23 +08:00
# endif