OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // On Linux, when the user tries to launch a second copy of chrome, we check | 5 // On Linux, when the user tries to launch a second copy of chrome, we check |
6 // for a socket in the user's profile directory. If the socket file is open we | 6 // for a socket in the user's profile directory. If the socket file is open we |
7 // send a message to the first chrome browser process with the current | 7 // send a message to the first chrome browser process with the current |
8 // directory and second process command line flags. The second process then | 8 // directory and second process command line flags. The second process then |
9 // exits. | 9 // exits. |
10 // | 10 // |
(...skipping 666 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
677 // Validate the message. The shortest message is kStartToken\0x\0x | 677 // Validate the message. The shortest message is kStartToken\0x\0x |
678 const size_t kMinMessageLength = arraysize(kStartToken) + 4; | 678 const size_t kMinMessageLength = arraysize(kStartToken) + 4; |
679 if (bytes_read_ < kMinMessageLength) { | 679 if (bytes_read_ < kMinMessageLength) { |
680 buf_[bytes_read_] = 0; | 680 buf_[bytes_read_] = 0; |
681 LOG(ERROR) << "Invalid socket message (wrong length):" << buf_; | 681 LOG(ERROR) << "Invalid socket message (wrong length):" << buf_; |
682 CleanupAndDeleteSelf(); | 682 CleanupAndDeleteSelf(); |
683 return; | 683 return; |
684 } | 684 } |
685 | 685 |
686 std::string str(buf_, bytes_read_); | 686 std::string str(buf_, bytes_read_); |
687 std::vector<std::string> tokens; | 687 std::vector<std::string> tokens = base::SplitString( |
688 base::SplitString(str, kTokenDelimiter, &tokens); | 688 str, std::string(1, kTokenDelimiter), |
| 689 base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); |
689 | 690 |
690 if (tokens.size() < 3 || tokens[0] != kStartToken) { | 691 if (tokens.size() < 3 || tokens[0] != kStartToken) { |
691 LOG(ERROR) << "Wrong message format: " << str; | 692 LOG(ERROR) << "Wrong message format: " << str; |
692 CleanupAndDeleteSelf(); | 693 CleanupAndDeleteSelf(); |
693 return; | 694 return; |
694 } | 695 } |
695 | 696 |
696 // Stop the expiration timer to prevent this SocketReader object from being | 697 // Stop the expiration timer to prevent this SocketReader object from being |
697 // terminated unexpectly. | 698 // terminated unexpectly. |
698 timer_.Stop(); | 699 timer_.Stop(); |
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1063 } | 1064 } |
1064 | 1065 |
1065 void ProcessSingleton::KillProcess(int pid) { | 1066 void ProcessSingleton::KillProcess(int pid) { |
1066 // TODO(james.su@gmail.com): Is SIGKILL ok? | 1067 // TODO(james.su@gmail.com): Is SIGKILL ok? |
1067 int rv = kill(static_cast<base::ProcessHandle>(pid), SIGKILL); | 1068 int rv = kill(static_cast<base::ProcessHandle>(pid), SIGKILL); |
1068 // ESRCH = No Such Process (can happen if the other process is already in | 1069 // ESRCH = No Such Process (can happen if the other process is already in |
1069 // progress of shutting down and finishes before we try to kill it). | 1070 // progress of shutting down and finishes before we try to kill it). |
1070 DCHECK(rv == 0 || errno == ESRCH) << "Error killing process: " | 1071 DCHECK(rv == 0 || errno == ESRCH) << "Error killing process: " |
1071 << base::safe_strerror(errno); | 1072 << base::safe_strerror(errno); |
1072 } | 1073 } |
OLD | NEW |