blob: 686a945efbf33426a0c37cd79dfc35f024e482a3 [file] [log] [blame]
// Copyright 2014 The Chromium OS 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 "chromeos/ui/util.h"
#include <stdarg.h>
#include <sys/types.h>
#include <unistd.h>
#include <vector>
#include <base/command_line.h>
#include <base/files/file_path.h>
#include <base/files/file_util.h>
#include <base/logging.h>
#include <base/process/launch.h>
namespace chromeos {
namespace ui {
namespace util {
base::FilePath GetReparentedPath(const std::string& path,
const base::FilePath& parent) {
if (parent.empty())
return base::FilePath(path);
CHECK(!path.empty() && path[0] == '/');
base::FilePath relative_path(path.substr(1));
CHECK(!relative_path.IsAbsolute());
return parent.Append(relative_path);
}
bool SetPermissions(const base::FilePath& path,
uid_t uid,
gid_t gid,
mode_t mode) {
if (getuid() == 0) {
if (chown(path.value().c_str(), uid, gid) != 0) {
PLOG(ERROR) << "Couldn't chown " << path.value() << " to "
<< uid << ":" << gid;
return false;
}
}
if (chmod(path.value().c_str(), mode) != 0) {
PLOG(ERROR) << "Unable to chmod " << path.value() << " to "
<< std::oct << mode;
return false;
}
return true;
}
bool EnsureDirectoryExists(const base::FilePath& path,
uid_t uid,
gid_t gid,
mode_t mode) {
if (!base::CreateDirectory(path)) {
PLOG(ERROR) << "Unable to create " << path.value();
return false;
}
return SetPermissions(path, uid, gid, mode);
}
bool Run(const char* command,
const char* arg, ...) {
// Extra parentheses because yay C++ most vexing parse.
base::CommandLine cl((base::FilePath(command)));
va_list list;
va_start(list, arg);
while (arg) {
cl.AppendArg(const_cast<char*>(arg));
arg = va_arg(list, char*);
}
va_end(list);
std::string output;
int exit_code = 0;
if (!base::GetAppOutputWithExitCode(cl, &output, &exit_code)) {
LOG(WARNING) << "\"" << cl.GetCommandLineString() << "\" failed with "
<< exit_code << ": " << output;
return false;
}
return true;
}
} // namespace util
} // namespace ui
} // namespace chromeos