1*ec63e07aSXin Li // Copyright 2019 Google LLC
2*ec63e07aSXin Li //
3*ec63e07aSXin Li // Licensed under the Apache License, Version 2.0 (the "License");
4*ec63e07aSXin Li // you may not use this file except in compliance with the License.
5*ec63e07aSXin Li // You may obtain a copy of the License at
6*ec63e07aSXin Li //
7*ec63e07aSXin Li // https://www.apache.org/licenses/LICENSE-2.0
8*ec63e07aSXin Li //
9*ec63e07aSXin Li // Unless required by applicable law or agreed to in writing, software
10*ec63e07aSXin Li // distributed under the License is distributed on an "AS IS" BASIS,
11*ec63e07aSXin Li // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*ec63e07aSXin Li // See the License for the specific language governing permissions and
13*ec63e07aSXin Li // limitations under the License.
14*ec63e07aSXin Li
15*ec63e07aSXin Li #ifndef SANDBOXED_API_SANDBOX2_UTIL_PATH_H_
16*ec63e07aSXin Li #define SANDBOXED_API_SANDBOX2_UTIL_PATH_H_
17*ec63e07aSXin Li
18*ec63e07aSXin Li #include <initializer_list>
19*ec63e07aSXin Li #include <string>
20*ec63e07aSXin Li #include <utility>
21*ec63e07aSXin Li
22*ec63e07aSXin Li #include "absl/strings/string_view.h"
23*ec63e07aSXin Li
24*ec63e07aSXin Li namespace sapi::file {
25*ec63e07aSXin Li
26*ec63e07aSXin Li namespace internal {
27*ec63e07aSXin Li // Not part of the public API.
28*ec63e07aSXin Li std::string JoinPathImpl(std::initializer_list<absl::string_view> paths);
29*ec63e07aSXin Li } // namespace internal
30*ec63e07aSXin Li
31*ec63e07aSXin Li // Joins multiple paths together using the platform-specific path separator.
32*ec63e07aSXin Li // Arguments must be convertible to absl::string_view.
33*ec63e07aSXin Li template <typename... T>
JoinPath(const T &...args)34*ec63e07aSXin Li inline std::string JoinPath(const T&... args) {
35*ec63e07aSXin Li return internal::JoinPathImpl({args...});
36*ec63e07aSXin Li }
37*ec63e07aSXin Li
38*ec63e07aSXin Li // Return true if path is absolute.
39*ec63e07aSXin Li bool IsAbsolutePath(absl::string_view path);
40*ec63e07aSXin Li
41*ec63e07aSXin Li // Returns the parts of the path, split on the final "/". If there is no
42*ec63e07aSXin Li // "/" in the path, the first part of the output is empty and the second
43*ec63e07aSXin Li // is the input. If the only "/" in the path is the first character, it is
44*ec63e07aSXin Li // the first part of the output.
45*ec63e07aSXin Li std::pair<absl::string_view, absl::string_view> SplitPath(
46*ec63e07aSXin Li absl::string_view path);
47*ec63e07aSXin Li
48*ec63e07aSXin Li // Collapses duplicate "/"s, resolve ".." and "." path elements, removes
49*ec63e07aSXin Li // trailing "/".
50*ec63e07aSXin Li //
51*ec63e07aSXin Li // NOTE: This respects relative vs. absolute paths, but does not
52*ec63e07aSXin Li // invoke any system calls in order to resolve relative paths to the actual
53*ec63e07aSXin Li // working directory. That is, this is purely a string manipulation, completely
54*ec63e07aSXin Li // independent of process state.
55*ec63e07aSXin Li std::string CleanPath(absl::string_view path);
56*ec63e07aSXin Li
57*ec63e07aSXin Li } // namespace sapi::file
58*ec63e07aSXin Li
59*ec63e07aSXin Li #endif // SANDBOXED_API_SANDBOX2_UTIL_PATH_H_
60