@@ -86,6 +86,39 @@ WorkshopWorkplace::GetFullPlanNames() const noexcept
8686 return Pg::EncodeArray (list);
8787}
8888
89+ static void
90+ PrepareChildProcess (PreparedChildProcess &p, const char *plan_name,
91+ const Plan &plan,
92+ FileDescriptor stderr_fd, SocketDescriptor control_fd)
93+ {
94+ p.hook_info = plan_name;
95+ p.stderr_fd = p.stdout_fd = stderr_fd;
96+ p.control_fd = control_fd.ToFileDescriptor ();
97+
98+ if (!debug_mode) {
99+ p.uid_gid .effective_uid = plan.uid ;
100+ p.uid_gid .effective_gid = plan.gid ;
101+
102+ std::copy (plan.groups .begin (), plan.groups .end (),
103+ p.uid_gid .supplementary_groups .begin ());
104+ }
105+
106+ if (!plan.chroot .empty ())
107+ p.chroot = plan.chroot .c_str ();
108+
109+ p.umask = plan.umask ;
110+ p.rlimits = plan.rlimits ;
111+ p.priority = plan.priority ;
112+ p.sched_idle = plan.sched_idle ;
113+ p.ioprio_idle = plan.ioprio_idle ;
114+ p.ns .enable_network = plan.private_network ;
115+
116+ if (plan.private_tmp )
117+ p.ns .mount .mount_tmp_tmpfs = " " ;
118+
119+ p.no_new_privs = true ;
120+ }
121+
89122void
90123WorkshopWorkplace::Start (EventLoop &event_loop, const WorkshopJob &job,
91124 std::shared_ptr<Plan> plan,
@@ -122,34 +155,8 @@ WorkshopWorkplace::Start(EventLoop &event_loop, const WorkshopJob &job,
122155 enable_journal);
123156
124157 PreparedChildProcess p;
125- p.hook_info = job.plan_name .c_str ();
126- p.stderr_fd = stderr_w;
127-
128- if (control_child.IsDefined ())
129- p.control_fd = control_child.ToFileDescriptor ();
130-
131- if (!debug_mode) {
132- p.uid_gid .effective_uid = plan->uid ;
133- p.uid_gid .effective_gid = plan->gid ;
134-
135- std::copy (plan->groups .begin (), plan->groups .end (),
136- p.uid_gid .supplementary_groups .begin ());
137- }
138-
139- if (!plan->chroot .empty ())
140- p.chroot = plan->chroot .c_str ();
141-
142- p.umask = plan->umask ;
143- p.rlimits = plan->rlimits ;
144- p.priority = plan->priority ;
145- p.sched_idle = plan->sched_idle ;
146- p.ioprio_idle = plan->ioprio_idle ;
147- p.ns .enable_network = plan->private_network ;
148-
149- if (plan->private_tmp )
150- p.ns .mount .mount_tmp_tmpfs = " " ;
151-
152- p.no_new_privs = true ;
158+ PrepareChildProcess (p, job.plan_name .c_str (), *plan,
159+ stderr_w, control_child);
153160
154161 /* use a per-plan cgroup */
155162
@@ -172,10 +179,7 @@ WorkshopWorkplace::Start(EventLoop &event_loop, const WorkshopJob &job,
172179
173180 UniqueFileDescriptor stdout_w;
174181
175- if (plan->control_channel ) {
176- /* copy stdout to stderr into the "log" column */
177- p.stdout_fd = p.stderr_fd ;
178- } else {
182+ if (!plan->control_channel ) {
179183 /* if there is no control channel, read progress from the
180184 stdout pipe */
181185 UniqueFileDescriptor stdout_r;
0 commit comments