diff options
author | evan@chromium.org <evan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-11-21 01:29:00 +0000 |
---|---|---|
committer | evan@chromium.org <evan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-11-21 01:29:00 +0000 |
commit | 5d1937bb5d9137cbaa1c947c383c3742179062a9 (patch) | |
tree | e8644c6e2b7ce1c509d47b00b40bc5d41ef2f63f /base/base_paths_posix.cc | |
parent | 29d334a2a5e8b66a83c161f54f83f3cdf5a31240 (diff) | |
download | chromium_src-5d1937bb5d9137cbaa1c947c383c3742179062a9.zip chromium_src-5d1937bb5d9137cbaa1c947c383c3742179062a9.tar.gz chromium_src-5d1937bb5d9137cbaa1c947c383c3742179062a9.tar.bz2 |
posix: refactor duplicated path-handling code
We had the same code in three headers, and an "if FREEBSD" in a
_linux.cc file.
Review URL: http://codereview.chromium.org/414063
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@32722 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/base_paths_posix.cc')
-rw-r--r-- | base/base_paths_posix.cc | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/base/base_paths_posix.cc b/base/base_paths_posix.cc new file mode 100644 index 0000000..799c135 --- /dev/null +++ b/base/base_paths_posix.cc @@ -0,0 +1,63 @@ +// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/base_paths.h" + +#include <unistd.h> + +#include "base/file_path.h" +#include "base/file_util.h" +#include "base/logging.h" +#include "base/path_service.h" +#include "base/string_piece.h" +#include "base/sys_string_conversions.h" + +namespace base { + +#if defined(OS_LINUX) +const char kSelfExe[] = "/proc/self/exe"; +#elif defined(OS_FREEBSD) +const char kSelfExe[] = "/proc/curproc/file"; +#endif + +bool PathProviderPosix(int key, FilePath* result) { + FilePath path; + switch (key) { + case base::FILE_EXE: + case base::FILE_MODULE: { // TODO(evanm): is this correct? + char bin_dir[PATH_MAX + 1]; + int bin_dir_size = readlink(kSelfExe, bin_dir, PATH_MAX); + if (bin_dir_size < 0 || bin_dir_size > PATH_MAX) { + NOTREACHED() << "Unable to resolve " << kSelfExe << "."; + return false; + } + bin_dir[bin_dir_size] = 0; + *result = FilePath(bin_dir); + return true; + } + case base::DIR_SOURCE_ROOT: + // On POSIX, unit tests execute two levels deep from the source root. + // For example: sconsbuild/{Debug|Release}/net_unittest + if (PathService::Get(base::DIR_EXE, &path)) { + path = path.DirName().DirName(); + if (file_util::PathExists(path.Append("base/base_paths_posix.cc"))) { + *result = path; + return true; + } + } + // If that failed (maybe the build output is symlinked to a different + // drive) try assuming the current directory is the source root. + if (file_util::GetCurrentDirectory(&path) && + file_util::PathExists(path.Append("base/base_paths_posix.cc"))) { + *result = path; + return true; + } + LOG(ERROR) << "Couldn't find your source root. " + << "Try running from your chromium/src directory."; + return false; + } + return false; +} + +} // namespace base |