Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(296)

Side by Side Diff: chrome/browser/chromeos/login/chrome_restart_request.cc

Issue 2310823003: chromeos: Remove dbus::FileDescriptor from SessionManagerClient (Closed)
Patch Set: Add a comment Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | chrome/browser/chromeos/settings/device_settings_test_helper.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 #include "chrome/browser/chromeos/login/chrome_restart_request.h" 5 #include "chrome/browser/chromeos/login/chrome_restart_request.h"
6 6
7 #include <sys/socket.h>
7 #include <vector> 8 #include <vector>
8 9
9 #include "ash/common/ash_switches.h" 10 #include "ash/common/ash_switches.h"
10 #include "base/base_switches.h" 11 #include "base/base_switches.h"
11 #include "base/command_line.h" 12 #include "base/command_line.h"
12 #include "base/macros.h" 13 #include "base/macros.h"
13 #include "base/memory/weak_ptr.h" 14 #include "base/memory/weak_ptr.h"
14 #include "base/message_loop/message_loop.h" 15 #include "base/message_loop/message_loop.h"
15 #include "base/process/launch.h" 16 #include "base/process/launch.h"
16 #include "base/strings/string_split.h" 17 #include "base/strings/string_split.h"
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after
263 explicit ChromeRestartRequest(const std::vector<std::string>& argv); 264 explicit ChromeRestartRequest(const std::vector<std::string>& argv);
264 ~ChromeRestartRequest(); 265 ~ChromeRestartRequest();
265 266
266 // Starts the request. 267 // Starts the request.
267 void Start(); 268 void Start();
268 269
269 private: 270 private:
270 // Fires job restart request to session manager. 271 // Fires job restart request to session manager.
271 void RestartJob(); 272 void RestartJob();
272 273
274 // Called when RestartJob D-Bus method call is complete.
275 void OnRestartJob(base::ScopedFD local_auth_fd, DBusMethodCallStatus status);
276
273 const std::vector<std::string> argv_; 277 const std::vector<std::string> argv_;
274 base::OneShotTimer timer_; 278 base::OneShotTimer timer_;
275 279
276 DISALLOW_COPY_AND_ASSIGN(ChromeRestartRequest); 280 DISALLOW_COPY_AND_ASSIGN(ChromeRestartRequest);
277 }; 281 };
278 282
279 ChromeRestartRequest::ChromeRestartRequest(const std::vector<std::string>& argv) 283 ChromeRestartRequest::ChromeRestartRequest(const std::vector<std::string>& argv)
280 : argv_(argv) {} 284 : argv_(argv) {}
281 285
282 ChromeRestartRequest::~ChromeRestartRequest() {} 286 ChromeRestartRequest::~ChromeRestartRequest() {}
(...skipping 29 matching lines...) Expand all
312 local_state_task_runner->PostTaskAndReply( 316 local_state_task_runner->PostTaskAndReply(
313 FROM_HERE, 317 FROM_HERE,
314 base::Bind(&EnsureLocalStateIsWritten), 318 base::Bind(&EnsureLocalStateIsWritten),
315 base::Bind(&ChromeRestartRequest::RestartJob, AsWeakPtr())); 319 base::Bind(&ChromeRestartRequest::RestartJob, AsWeakPtr()));
316 } 320 }
317 321
318 void ChromeRestartRequest::RestartJob() { 322 void ChromeRestartRequest::RestartJob() {
319 DCHECK_CURRENTLY_ON(BrowserThread::UI); 323 DCHECK_CURRENTLY_ON(BrowserThread::UI);
320 VLOG(1) << "ChromeRestartRequest::RestartJob"; 324 VLOG(1) << "ChromeRestartRequest::RestartJob";
321 325
322 DBusThreadManager::Get()->GetSessionManagerClient()->RestartJob(argv_); 326 // The session manager requires a RestartJob caller to open a socket pair and
327 // pass one end over D-Bus while holding the local end open for the duration
328 // of the call.
329 int sockets[2] = {-1, -1};
330 // socketpair() doesn't cause disk IO so it's OK to call it on the UI thread.
331 // Also, the current chrome process is going to die soon so it doesn't matter
332 // anyways.
333 if (socketpair(AF_UNIX, SOCK_STREAM, 0, sockets) < 0) {
334 PLOG(ERROR) << "Failed to create a unix domain socketpair";
335 delete this;
336 return;
337 }
338 base::ScopedFD local_auth_fd(sockets[0]);
339 base::ScopedFD remote_auth_fd(sockets[1]);
340 // Ownership of local_auth_fd is passed to the callback that is to be
341 // called on completion of this method call. This keeps the browser end
342 // of the socket-pair alive for the duration of the RPC.
343 DBusThreadManager::Get()->GetSessionManagerClient()->RestartJob(
344 remote_auth_fd.get(), argv_,
345 base::Bind(&ChromeRestartRequest::OnRestartJob, AsWeakPtr(),
346 base::Passed(&local_auth_fd)));
347 }
323 348
349 void ChromeRestartRequest::OnRestartJob(base::ScopedFD local_auth_fd,
350 DBusMethodCallStatus status) {
351 // Now that the call is complete, local_auth_fd can be closed and discarded,
352 // which will happen automatically when it goes out of scope.
353 VLOG(1) << "OnRestartJob";
324 delete this; 354 delete this;
325 } 355 }
326 356
327 } // namespace 357 } // namespace
328 358
329 void GetOffTheRecordCommandLine(const GURL& start_url, 359 void GetOffTheRecordCommandLine(const GURL& start_url,
330 bool is_oobe_completed, 360 bool is_oobe_completed,
331 const base::CommandLine& base_command_line, 361 const base::CommandLine& base_command_line,
332 base::CommandLine* command_line) { 362 base::CommandLine* command_line) {
333 base::DictionaryValue otr_switches; 363 base::DictionaryValue otr_switches;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 // Relaunch chrome without session manager on dev box. 395 // Relaunch chrome without session manager on dev box.
366 ReLaunch(command_line); 396 ReLaunch(command_line);
367 return; 397 return;
368 } 398 }
369 399
370 // ChromeRestartRequest deletes itself after request sent to session manager. 400 // ChromeRestartRequest deletes itself after request sent to session manager.
371 (new ChromeRestartRequest(command_line.argv()))->Start(); 401 (new ChromeRestartRequest(command_line.argv()))->Start();
372 } 402 }
373 403
374 } // namespace chromeos 404 } // namespace chromeos
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/chromeos/settings/device_settings_test_helper.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698