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