blob: be9917b41f78e3ba95c9bca5adc342587b0647f6 [file] [log] [blame]
// Copyright 2014 The Bazel Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef BAZEL_SRC_MAIN_CPP_UTIL_FILE_H_
#define BAZEL_SRC_MAIN_CPP_UTIL_FILE_H_
#include <string>
#include <vector>
#include "src/main/cpp/util/file_platform.h"
namespace blaze_util {
class IPipe {
public:
// Error modes of the pipe.
//
// This is a platform-independent abstraction of `errno`. If you need to
// handle an errno value, add an entry here and update the platform-specific
// pipe implementations accordingly.
enum Errors {
SUCCESS = 0,
OTHER_ERROR = 1,
INTERRUPTED = 2, // EINTR
};
virtual ~IPipe() {}
// Sends `size` bytes from `buffer` through the pipe.
// Returns true if `size` is not negative and could send all the data.
virtual bool Send(const void *buffer, int size) = 0;
// Receives at most `size` bytes into `buffer` from the pipe.
// Returns the number of bytes received.
// If `size` is negative or if there's an error, then returns -1, and if
// `error` isn't NULL then sets its value to one of the `Errors`.
virtual int Receive(void *buffer, int size, int *error) = 0;
};
// Replaces 'content' with data read from a source using `ReadFromHandle`.
// If `max_size` is positive, the method reads at most that many bytes;
// otherwise the method reads everything.
// Returns false on error. Can be called from a signal handler.
bool ReadFrom(file_handle_type handle, std::string *content, int max_size = 0);
// Reads up to `size` bytes using `ReadFromHandle` into `data`.
// There must be enough memory allocated at `data`.
// Returns true on success, false on error.
bool ReadFrom(file_handle_type handle, void *data, size_t size);
// Writes `content` into file `filename`, and chmods it to `perm`.
// Returns false on failure.
bool WriteFile(const std::string &content, const std::string &filename,
unsigned int perm = 0644);
bool WriteFile(const std::string &content, const Path &path,
unsigned int perm = 0644);
// Lists all files in `path` and all of its subdirectories.
//
// Does not follow symlinks / junctions.
//
// Populates `result` with the full paths of the files. Every entry will have
// `path` as its prefix. If `path` is a file, `result` contains just this
// file.
void GetAllFilesUnder(const std::string &path,
std::vector<std::string> *result);
class DirectoryEntryConsumer;
// Visible for testing only.
typedef void (*_ForEachDirectoryEntry)(const std::string &path,
DirectoryEntryConsumer *consume);
// Visible for testing only.
void _GetAllFilesUnder(const std::string &path,
std::vector<std::string> *result,
_ForEachDirectoryEntry walk_entries);
} // namespace blaze_util
#endif // BAZEL_SRC_MAIN_CPP_UTIL_FILE_H_