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
16namespace base {
17struct LaunchOptions;
18}
19
20template <typename>
21class ScopedVector;
22
23namespace nacl {
24
25// Appends any ZygoteForkDelegate instances needed by NaCl to |*delegates|.
26void 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().
34class 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