1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/common/service_process_util_posix.h"
6
7#include <signal.h>
8#include <unistd.h>
9
10#include "base/base_paths.h"
11#include "base/command_line.h"
12#include "base/files/file_path.h"
13#include "base/logging.h"
14#include "base/path_service.h"
15#include "base/threading/platform_thread.h"
16#include "chrome/common/auto_start_linux.h"
17#include "chrome/common/multi_process_lock.h"
18
19namespace {
20
21MultiProcessLock* TakeServiceInitializingLock(bool waiting) {
22  std::string lock_name =
23      GetServiceProcessScopedName("_service_initializing");
24  return TakeNamedLock(lock_name, waiting);
25}
26
27std::string GetBaseDesktopName() {
28#if defined(GOOGLE_CHROME_BUILD)
29  return "google-chrome-service.desktop";
30#else  // CHROMIUM_BUILD
31  return "chromium-service.desktop";
32#endif
33}
34}  // namespace
35
36MultiProcessLock* TakeServiceRunningLock(bool waiting) {
37  std::string lock_name =
38      GetServiceProcessScopedName("_service_running");
39  return TakeNamedLock(lock_name, waiting);
40}
41
42bool ForceServiceProcessShutdown(const std::string& version,
43                                 base::ProcessId process_id) {
44  if (kill(process_id, SIGTERM) < 0) {
45    DPLOG(ERROR) << "kill";
46    return false;
47  }
48  return true;
49}
50
51// Gets the name of the service process IPC channel.
52// Returns an absolute path as required.
53IPC::ChannelHandle GetServiceProcessChannel() {
54  base::FilePath temp_dir;
55  PathService::Get(base::DIR_TEMP, &temp_dir);
56  std::string pipe_name = GetServiceProcessScopedVersionedName("_service_ipc");
57  std::string pipe_path = temp_dir.Append(pipe_name).value();
58  return pipe_path;
59}
60
61
62
63bool CheckServiceProcessReady() {
64  scoped_ptr<MultiProcessLock> running_lock(TakeServiceRunningLock(false));
65  return running_lock.get() == NULL;
66}
67
68bool ServiceProcessState::TakeSingletonLock() {
69  state_->initializing_lock_.reset(TakeServiceInitializingLock(true));
70  return state_->initializing_lock_.get();
71}
72
73bool ServiceProcessState::AddToAutoRun() {
74  DCHECK(autorun_command_line_.get());
75#if defined(GOOGLE_CHROME_BUILD)
76  std::string app_name = "Google Chrome Service";
77#else  // CHROMIUM_BUILD
78  std::string app_name = "Chromium Service";
79#endif
80  return AutoStart::AddApplication(
81      GetServiceProcessScopedName(GetBaseDesktopName()),
82      app_name,
83      autorun_command_line_->GetCommandLineString(),
84      false);
85}
86
87bool ServiceProcessState::RemoveFromAutoRun() {
88  return AutoStart::Remove(
89      GetServiceProcessScopedName(GetBaseDesktopName()));
90}
91