|
280 | 280 | <span id="280">280</span>
|
281 | 281 | <span id="281">281</span>
|
282 | 282 | <span id="282">282</span>
|
| 283 | +<span id="283">283</span> |
| 284 | +<span id="284">284</span> |
| 285 | +<span id="285">285</span> |
| 286 | +<span id="286">286</span> |
| 287 | +<span id="287">287</span> |
| 288 | +<span id="288">288</span> |
| 289 | +<span id="289">289</span> |
| 290 | +<span id="290">290</span> |
| 291 | +<span id="291">291</span> |
| 292 | +<span id="292">292</span> |
| 293 | +<span id="293">293</span> |
| 294 | +<span id="294">294</span> |
| 295 | +<span id="295">295</span> |
| 296 | +<span id="296">296</span> |
| 297 | +<span id="297">297</span> |
283 | 298 | </pre><pre class="rust"><code><span class="comment">// This file is part of the uutils coreutils package.</span>
|
284 | 299 | <span class="comment">//</span>
|
285 | 300 | <span class="comment">// (c) Vsevolod Velichko <torkvemada@sorokdva.net></span>
|
|
298 | 313 | <span class="kw">use</span> <span class="ident">std::os::unix::prelude::OsStrExt</span>;
|
299 | 314 | <span class="kw">use</span> <span class="ident">std::path::Path</span>;
|
300 | 315 | <span class="kw">use</span> <span class="ident">std::process</span>;
|
301 |
| -<span class="kw">use</span> <span class="ident">uucore::error</span>::{<span class="ident">set_exit_code</span>, <span class="ident">UClapError</span>, <span class="ident">UResult</span>}; |
| 316 | +<span class="kw">use</span> <span class="ident">uucore::error</span>::{<span class="ident">set_exit_code</span>, <span class="ident">UClapError</span>, <span class="ident">UResult</span>, <span class="ident">UUsageError</span>}; |
| 317 | +<span class="kw">use</span> <span class="ident">uucore::fs</span>::{<span class="ident">canonicalize</span>, <span class="ident">MissingHandling</span>, <span class="ident">ResolveMode</span>}; |
302 | 318 | <span class="kw">use</span> <span class="ident">uucore::libc</span>::{<span class="self">self</span>, <span class="ident">chroot</span>, <span class="ident">setgid</span>, <span class="ident">setgroups</span>, <span class="ident">setuid</span>};
|
303 | 319 | <span class="kw">use</span> <span class="ident">uucore</span>::{<span class="ident">entries</span>, <span class="ident">format_usage</span>};
|
304 | 320 |
|
|
330 | 346 | <span class="prelude-val">None</span> => <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">ChrootError::MissingNewRoot</span>.<span class="ident">into</span>()),
|
331 | 347 | };
|
332 | 348 |
|
| 349 | + <span class="kw">let</span> <span class="ident">skip_chdir</span> <span class="op">=</span> <span class="ident">matches</span>.<span class="ident">contains_id</span>(<span class="ident">options::SKIP_CHDIR</span>); |
| 350 | + <span class="comment">// We are resolving the path in case it is a symlink or /. or /../</span> |
| 351 | + <span class="kw">if</span> <span class="ident">skip_chdir</span> |
| 352 | + <span class="op">&&</span> <span class="ident">canonicalize</span>(<span class="ident">newroot</span>, <span class="ident">MissingHandling::Normal</span>, <span class="ident">ResolveMode::Logical</span>) |
| 353 | + .<span class="ident">unwrap</span>() |
| 354 | + .<span class="ident">to_str</span>() |
| 355 | + <span class="op">!</span><span class="op">=</span> <span class="prelude-val">Some</span>(<span class="string">"/"</span>) |
| 356 | + { |
| 357 | + <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">UUsageError::new</span>( |
| 358 | + <span class="number">125</span>, |
| 359 | + <span class="string">"option --skip-chdir only permitted if NEWROOT is old '/'"</span>, |
| 360 | + )); |
| 361 | + } |
| 362 | + |
333 | 363 | <span class="kw">if</span> <span class="op">!</span><span class="ident">newroot</span>.<span class="ident">is_dir</span>() {
|
334 | 364 | <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">ChrootError::NoSuchDirectory</span>(<span class="macro">format!</span>(<span class="string">"{}"</span>, <span class="ident">newroot</span>.<span class="ident">display</span>())).<span class="ident">into</span>());
|
335 | 365 | }
|
|
0 commit comments