15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/service_process_util_posix.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <signal.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <unistd.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base_paths.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
12a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "base/files/file_path.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/platform_thread.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/auto_start_linux.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/multi_process_lock.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MultiProcessLock* TakeServiceInitializingLock(bool waiting) {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string lock_name =
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetServiceProcessScopedName("_service_initializing");
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TakeNamedLock(lock_name, waiting);
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetBaseDesktopName() {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return "google-chrome-service.desktop";
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else  // CHROMIUM_BUILD
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return "chromium-service.desktop";
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MultiProcessLock* TakeServiceRunningLock(bool waiting) {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string lock_name =
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetServiceProcessScopedName("_service_running");
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TakeNamedLock(lock_name, waiting);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ForceServiceProcessShutdown(const std::string& version,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 base::ProcessId process_id) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (kill(process_id, SIGTERM) < 0) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DPLOG(ERROR) << "kill";
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Gets the name of the service process IPC channel.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns an absolute path as required.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IPC::ChannelHandle GetServiceProcessChannel() {
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath temp_dir;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(base::DIR_TEMP, &temp_dir);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string pipe_name = GetServiceProcessScopedVersionedName("_service_ipc");
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string pipe_path = temp_dir.Append(pipe_name).value();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pipe_path;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CheckServiceProcessReady() {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MultiProcessLock> running_lock(TakeServiceRunningLock(false));
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return running_lock.get() == NULL;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ServiceProcessState::TakeSingletonLock() {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  state_->initializing_lock_.reset(TakeServiceInitializingLock(true));
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return state_->initializing_lock_.get();
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ServiceProcessState::AddToAutoRun() {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(autorun_command_line_.get());
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string app_name = "Google Chrome Service";
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else  // CHROMIUM_BUILD
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string app_name = "Chromium Service";
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return AutoStart::AddApplication(
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetServiceProcessScopedName(GetBaseDesktopName()),
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      app_name,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      autorun_command_line_->GetCommandLineString(),
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ServiceProcessState::RemoveFromAutoRun() {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return AutoStart::Remove(
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetServiceProcessScopedName(GetBaseDesktopName()));
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
91