OLD | NEW |
1 // Copyright (c) 2009-2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009-2010 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 "login_manager/session_manager_service.h" | 5 #include "login_manager/session_manager_service.h" |
6 | 6 |
7 #include <errno.h> | 7 #include <errno.h> |
8 #include <glib.h> | 8 #include <glib.h> |
9 #include <grp.h> | 9 #include <grp.h> |
10 #include <sys/errno.h> | 10 #include <sys/errno.h> |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
191 | 191 |
192 g_main_loop_run(main_loop_); | 192 g_main_loop_run(main_loop_); |
193 | 193 |
194 if (child_pid_ != 0) // otherwise, we never created a child. | 194 if (child_pid_ != 0) // otherwise, we never created a child. |
195 CleanupChildren(3); | 195 CleanupChildren(3); |
196 | 196 |
197 return true; | 197 return true; |
198 } | 198 } |
199 | 199 |
200 int SessionManagerService::RunChild() { | 200 int SessionManagerService::RunChild() { |
| 201 child_job_->RecordTime(); |
201 int pid = fork(); | 202 int pid = fork(); |
202 if (pid == 0) { | 203 if (pid == 0) { |
203 // In the child. | 204 // In the child. |
204 child_job_->Run(); | 205 child_job_->Run(); |
205 exit(1); // Run() is not supposed to return. | 206 exit(1); // Run() is not supposed to return. |
206 } | 207 } |
207 g_child_watch_add_full(G_PRIORITY_HIGH_IDLE, | 208 g_child_watch_add_full(G_PRIORITY_HIGH_IDLE, |
208 pid, | 209 pid, |
209 HandleChildExit, | 210 HandleChildExit, |
210 this, | 211 this, |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
309 CHECK(WEXITSTATUS(status) != SetUidExecJob::kCantSetuid); | 310 CHECK(WEXITSTATUS(status) != SetUidExecJob::kCantSetuid); |
310 CHECK(WEXITSTATUS(status) != SetUidExecJob::kCantExec); | 311 CHECK(WEXITSTATUS(status) != SetUidExecJob::kCantExec); |
311 } else { | 312 } else { |
312 DLOG(INFO) << " Exited...somehow, without an exit code or a signal??"; | 313 DLOG(INFO) << " Exited...somehow, without an exit code or a signal??"; |
313 } | 314 } |
314 | 315 |
315 bool exited_clean = WIFEXITED(status) && WEXITSTATUS(status) == 0; | 316 bool exited_clean = WIFEXITED(status) && WEXITSTATUS(status) == 0; |
316 | 317 |
317 // If the child _ever_ exits uncleanly, we want to start it up again. | 318 // If the child _ever_ exits uncleanly, we want to start it up again. |
318 SessionManagerService* manager = static_cast<SessionManagerService*>(data); | 319 SessionManagerService* manager = static_cast<SessionManagerService*>(data); |
319 if (exited_clean) { | 320 if (exited_clean || manager->should_stop_child()) { |
320 ServiceShutdown(data); | 321 ServiceShutdown(data); |
321 } else if (manager->should_run_child()) { | 322 } else if (manager->should_run_child()) { |
322 // TODO(cmasone): deal with fork failing in RunChild() | 323 // TODO(cmasone): deal with fork failing in RunChild() |
323 LOG(INFO) << "Running the child again..."; | 324 LOG(INFO) << "Running the child again..."; |
324 manager->set_child_pid(manager->RunChild()); | 325 manager->set_child_pid(manager->RunChild()); |
325 } else { | 326 } else { |
326 LOG(INFO) << "Should NOT run"; | 327 LOG(INFO) << "Should NOT run"; |
327 manager->AllowGracefulExit(); | 328 manager->AllowGracefulExit(); |
328 } | 329 } |
329 } | 330 } |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
397 system_->kill(child_pid_, SIGKILL); | 398 system_->kill(child_pid_, SIGKILL); |
398 } | 399 } |
399 | 400 |
400 void SessionManagerService::SetGError(GError** error, | 401 void SessionManagerService::SetGError(GError** error, |
401 ChromeOSLoginError code, | 402 ChromeOSLoginError code, |
402 const char* message) { | 403 const char* message) { |
403 g_set_error(error, CHROMEOS_LOGIN_ERROR, code, "Login error: %s", message); | 404 g_set_error(error, CHROMEOS_LOGIN_ERROR, code, "Login error: %s", message); |
404 } | 405 } |
405 | 406 |
406 } // namespace login_manager | 407 } // namespace login_manager |
OLD | NEW |