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.
5 #ifndef CONTENT_ZYGOTE_ZYGOTE_H_
6 #define CONTENT_ZYGOTE_ZYGOTE_H_
11 #include "base/hash_tables.h"
12 #include "base/process.h"
19 class ZygoteForkDelegate
;
21 // This is the object which implements the zygote. The ZygoteMain function,
22 // which is called from ChromeMain, simply constructs one of these objects and
26 Zygote(int sandbox_flags
,
27 ZygoteForkDelegate
* helper
);
30 bool ProcessRequests();
32 static const int kBrowserDescriptor
= 3;
33 static const int kMagicSandboxIPCDescriptor
= 5;
36 // Returns true if the SUID sandbox is active.
37 bool UsingSUIDSandbox() const;
39 // ---------------------------------------------------------------------------
40 // Requests from the browser...
42 // Read and process a request from the browser. Returns true if we are in a
43 // new process and thus need to unwind back into ChromeMain.
44 bool HandleRequestFromBrowser(int fd
);
46 void HandleReapRequest(int fd
, const Pickle
& pickle
, PickleIterator iter
);
48 void HandleGetTerminationStatus(int fd
,
52 // This is equivalent to fork(), except that, when using the SUID sandbox, it
53 // returns the real PID of the child process as it appears outside the
54 // sandbox, rather than returning the PID inside the sandbox. Optionally, it
55 // fills in uma_name et al with a report the helper wants to make via
56 // UMA_HISTOGRAM_ENUMERATION.
57 int ForkWithRealPid(const std::string
& process_type
,
58 std::vector
<int>& fds
,
59 const std::string
& channel_switch
,
60 std::string
* uma_name
,
62 int* uma_boundary_value
);
64 // Unpacks process type and arguments from |pickle| and forks a new process.
65 // Returns -1 on error, otherwise returns twice, returning 0 to the child
66 // process and the child process ID to the parent process, like fork().
67 base::ProcessId
ReadArgsAndFork(const Pickle
& pickle
,
69 std::vector
<int>& fds
,
70 std::string
* uma_name
,
72 int* uma_boundary_value
);
74 // Handle a 'fork' request from the browser: this means that the browser
75 // wishes to start a new renderer. Returns true if we are in a new process,
76 // otherwise writes the child_pid back to the browser via |fd|. Writes a
77 // child_pid of -1 on error.
78 bool HandleForkRequest(int fd
,
81 std::vector
<int>& fds
);
83 bool HandleGetSandboxStatus(int fd
,
87 // In the SUID sandbox, we try to use a new PID namespace. Thus the PIDs
88 // fork() returns are not the real PIDs, so we need to map the Real PIDS
89 // into the sandbox PID namespace.
90 typedef base::hash_map
<base::ProcessHandle
, base::ProcessHandle
> ProcessMap
;
91 ProcessMap real_pids_to_sandbox_pids
;
93 const int sandbox_flags_
;
94 ZygoteForkDelegate
* helper_
;
96 // These might be set by helper_->InitialUMA. They supply a UMA enumeration
97 // sample we should report on the first fork.
98 std::string initial_uma_name_
;
99 int initial_uma_sample_
;
100 int initial_uma_boundary_value_
;
103 } // namespace content
105 #endif // CONTENT_ZYGOTE_ZYGOTE_H_