Go to the documentation of this file.00001
00006
00007
00008
00009
00010 #include <ecl/filesystem/config.hpp>
00011
00012 #if defined(ECL_PRIVATE_HAS_POSIX_REALPATH)
00013
00014
00015
00016
00017
00018 #include <iostream>
00019 #include <errno.h>
00020 #include <climits>
00021 #include <cstdlib>
00022 #include <string>
00023 #include <ecl/errors/handlers.hpp>
00024 #include "../../include/ecl/filesystem/realpath.hpp"
00025
00026
00027
00028
00029
00030 namespace ecl {
00031
00032
00033
00034
00035
00036 ecl_filesystem_PUBLIC ecl::Error realpath(const std::string& path, std::string& absolute_path) {
00037 int path_max;
00038
00039 #ifdef PATH_MAX
00040 path_max = PATH_MAX;
00041 #else
00042 path_max = pathconf(path, _PC_PATH_MAX);
00043 if (path_max <= 0) { path_max = 4096; }
00044 #endif
00045
00046 char buffer[path_max];
00047 char *result = ::realpath(path.c_str(), buffer);
00048 absolute_path = buffer;
00049 if ( result != NULL ) {
00050 absolute_path = buffer;
00051 } else {
00052 switch(errno) {
00053 case(EACCES) : { return Error(PermissionsError); }
00054 case(EINVAL) : { return Error(InvalidArgError); }
00055 case(EIO) : { return Error(ReadError); }
00056 case(ELOOP) : { return Error(InvalidObjectError); }
00057 case(ENAMETOOLONG) : { return Error(InvalidArgError); }
00058 case(ENOENT) : { return Error(NotFoundError); }
00059 case(ENOTDIR) : { return Error(InvalidObjectError); }
00060 default : { return Error(UnknownError); }
00061 }
00062 }
00063 return Error(NoError);
00064 }
00065
00066 };
00067
00068 #endif
00069