• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef COMPONENTS_NACL_ZYGOTE_NACL_FORK_DELEGATE_LINUX_H_
6 #define COMPONENTS_NACL_ZYGOTE_NACL_FORK_DELEGATE_LINUX_H_
7 
8 #include <string>
9 #include <vector>
10 
11 #include "base/basictypes.h"
12 #include "base/compiler_specific.h"
13 #include "base/gtest_prod_util.h"
14 #include "content/public/common/zygote_fork_delegate_linux.h"
15 
16 namespace base {
17 struct LaunchOptions;
18 }
19 
20 template <typename>
21 class ScopedVector;
22 
23 namespace nacl {
24 
25 // Appends any ZygoteForkDelegate instances needed by NaCl to |*delegates|.
26 void AddNaClZygoteForkDelegates(
27     ScopedVector<content::ZygoteForkDelegate>* delegates);
28 
29 // The NaClForkDelegate is created during Chrome linux zygote
30 // initialization, and provides "fork()" functionality with
31 // NaCl specific process characteristics (specifically address
32 // space layout) as an alternative to forking the zygote.
33 // A new delegate is passed in as an argument to ZygoteMain().
34 class NaClForkDelegate : public content::ZygoteForkDelegate {
35  public:
36   explicit NaClForkDelegate(bool nonsfi_mode);
37   virtual ~NaClForkDelegate();
38 
39   virtual void Init(int sandboxdesc, bool enable_layer1_sandbox) OVERRIDE;
40   virtual void InitialUMA(std::string* uma_name,
41                           int* uma_sample,
42                           int* uma_boundary_value) OVERRIDE;
43   virtual bool CanHelp(const std::string& process_type, std::string* uma_name,
44                           int* uma_sample, int* uma_boundary_value) OVERRIDE;
45   virtual pid_t Fork(const std::string& process_type,
46                      const std::vector<int>& fds,
47                      const std::string& channel_id) OVERRIDE;
48   virtual bool GetTerminationStatus(pid_t pid, bool known_dead,
49                                     base::TerminationStatus* status,
50                                     int* exit_code) OVERRIDE;
51 
52  private:
53   static void AddPassthroughEnvToOptions(base::LaunchOptions* options);
54 
55   // These values are reported via UMA and hence they become permanent
56   // constants.  Old values cannot be reused, only new ones added.
57   enum NaClHelperStatus {
58     kNaClHelperUnused = 0,
59     kNaClHelperMissing = 1,
60     kNaClHelperBootstrapMissing = 2,
61     kNaClHelperValgrind = 3,
62     kNaClHelperLaunchFailed = 4,
63     kNaClHelperAckFailed = 5,
64     kNaClHelperSuccess = 6,
65     kNaClHelperStatusBoundary  // Must be one greater than highest value used.
66   };
67 
68   const bool nonsfi_mode_;
69   NaClHelperStatus status_;
70   int fd_;
71 
72   FRIEND_TEST_ALL_PREFIXES(NaClForkDelegateLinuxTest, EnvPassthrough);
73 
74   DISALLOW_COPY_AND_ASSIGN(NaClForkDelegate);
75 };
76 
77 }  // namespace nacl
78 
79 #endif  // COMPONENTS_NACL_ZYGOTE_NACL_FORK_DELEGATE_LINUX_H_
80