blob: 63bcc696e9f355ab9f14cbb3b67e1740932696ce [file] [log] [blame]
// Copyright 2019 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 "chrome/common/process_singleton_lock_posix.h"
#include "base/files/file_util.h"
#include "base/logging.h"
#include "base/strings/string_number_conversions.h"
const char kProcessSingletonLockDelimiter = '-';
bool ParseProcessSingletonLock(const base::FilePath& path,
std::string* hostname,
int* pid) {
base::FilePath target;
if (!base::ReadSymbolicLink(path, &target)) {
// The only errno that should occur is ENOENT.
if (errno != 0 && errno != ENOENT)
PLOG(ERROR) << "readlink(" << path.value() << ") failed";
}
std::string real_path = target.value();
if (real_path.empty())
return false;
std::string::size_type pos = real_path.rfind(kProcessSingletonLockDelimiter);
// If the path is not a symbolic link, or doesn't contain what we expect,
// bail.
if (pos == std::string::npos) {
*hostname = "";
*pid = -1;
return true;
}
*hostname = real_path.substr(0, pos);
const std::string& pid_str = real_path.substr(pos + 1);
if (!base::StringToInt(pid_str, pid))
*pid = -1;
return true;
}