|
327 | 327 | <span id="325">325</span>
|
328 | 328 | <span id="326">326</span>
|
329 | 329 | <span id="327">327</span>
|
| 330 | +<span id="328">328</span> |
| 331 | +<span id="329">329</span> |
| 332 | +<span id="330">330</span> |
| 333 | +<span id="331">331</span> |
| 334 | +<span id="332">332</span> |
| 335 | +<span id="333">333</span> |
| 336 | +<span id="334">334</span> |
| 337 | +<span id="335">335</span> |
| 338 | +<span id="336">336</span> |
| 339 | +<span id="337">337</span> |
| 340 | +<span id="338">338</span> |
| 341 | +<span id="339">339</span> |
| 342 | +<span id="340">340</span> |
| 343 | +<span id="341">341</span> |
| 344 | +<span id="342">342</span> |
| 345 | +<span id="343">343</span> |
| 346 | +<span id="344">344</span> |
| 347 | +<span id="345">345</span> |
| 348 | +<span id="346">346</span> |
| 349 | +<span id="347">347</span> |
| 350 | +<span id="348">348</span> |
| 351 | +<span id="349">349</span> |
| 352 | +<span id="350">350</span> |
| 353 | +<span id="351">351</span> |
| 354 | +<span id="352">352</span> |
| 355 | +<span id="353">353</span> |
| 356 | +<span id="354">354</span> |
| 357 | +<span id="355">355</span> |
| 358 | +<span id="356">356</span> |
| 359 | +<span id="357">357</span> |
| 360 | +<span id="358">358</span> |
| 361 | +<span id="359">359</span> |
| 362 | +<span id="360">360</span> |
| 363 | +<span id="361">361</span> |
330 | 364 | </pre><pre class="rust"><code><span class="comment">// This file is part of the uutils coreutils package.</span>
|
331 | 365 | <span class="comment">//</span>
|
332 | 366 | <span class="comment">// (c) Jordi Boggiano <j.boggiano@seld.be></span>
|
|
351 | 385 | <span class="kw">use</span> <span class="ident">std::env</span>;
|
352 | 386 | <span class="kw">use</span> <span class="ident">std::io</span>::{<span class="self">self</span>, <span class="ident">Write</span>};
|
353 | 387 | <span class="kw">use</span> <span class="ident">std::iter::Iterator</span>;
|
| 388 | +<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">unix</span>)]</span> |
| 389 | +<span class="kw">use</span> <span class="ident">std::os::unix::process::ExitStatusExt</span>; |
354 | 390 | <span class="kw">use</span> <span class="ident">std::process</span>;
|
355 | 391 | <span class="kw">use</span> <span class="ident">uucore::display::Quotable</span>;
|
356 | 392 | <span class="kw">use</span> <span class="ident">uucore::error</span>::{<span class="ident">UResult</span>, <span class="ident">USimpleError</span>, <span class="ident">UUsageError</span>};
|
357 | 393 | <span class="kw">use</span> <span class="ident">uucore::format_usage</span>;
|
| 394 | +<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">unix</span>)]</span> |
| 395 | +<span class="kw">use</span> <span class="ident">uucore::signals::signal_name_by_value</span>; |
358 | 396 |
|
359 | 397 | <span class="kw">const</span> <span class="ident">USAGE</span>: <span class="kw-2">&</span><span class="ident">str</span> <span class="op">=</span> <span class="string">"{} [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]"</span>;
|
360 | 398 | <span class="kw">const</span> <span class="ident">AFTER_HELP</span>: <span class="kw-2">&</span><span class="ident">str</span> <span class="op">=</span> <span class="string">"\
|
|
637 | 675 | * created. This is much simpler than dealing with the hassles of calling execvp directly.
|
638 | 676 | */</span>
|
639 | 677 | <span class="kw">match</span> <span class="ident">process::Command::new</span>(<span class="kw-2">&</span><span class="kw-2">*</span><span class="ident">prog</span>).<span class="ident">args</span>(<span class="ident">args</span>).<span class="ident">status</span>() {
|
640 |
| - <span class="prelude-val">Ok</span>(<span class="ident">exit</span>) <span class="kw">if</span> <span class="op">!</span><span class="ident">exit</span>.<span class="ident">success</span>() => <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">exit</span>.<span class="ident">code</span>().<span class="ident">unwrap</span>().<span class="ident">into</span>()), |
| 678 | + <span class="prelude-val">Ok</span>(<span class="ident">exit</span>) <span class="kw">if</span> <span class="op">!</span><span class="ident">exit</span>.<span class="ident">success</span>() => { |
| 679 | + <span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">unix</span>)]</span> |
| 680 | + <span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">exit_code</span>) <span class="op">=</span> <span class="ident">exit</span>.<span class="ident">code</span>() { |
| 681 | + <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">exit_code</span>.<span class="ident">into</span>()); |
| 682 | + } <span class="kw">else</span> { |
| 683 | + <span class="comment">// `exit.code()` returns `None` on Unix when the process is terminated by a signal.</span> |
| 684 | + <span class="comment">// See std::os::unix::process::ExitStatusExt for more information. This prints out</span> |
| 685 | + <span class="comment">// the interrupted process and the signal it received.</span> |
| 686 | + <span class="kw">let</span> <span class="ident">signal_code</span> <span class="op">=</span> <span class="ident">exit</span>.<span class="ident">signal</span>().<span class="ident">unwrap</span>(); |
| 687 | + <span class="macro">eprintln!</span>( |
| 688 | + <span class="string">"\"{}\" terminated by signal {}"</span>, |
| 689 | + { |
| 690 | + <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">command</span> <span class="op">=</span> <span class="ident">uucore::util_name</span>().<span class="ident">to_owned</span>(); |
| 691 | + <span class="ident">command</span>.<span class="ident">push</span>(<span class="string">' '</span>); |
| 692 | + <span class="ident">command</span>.<span class="ident">push_str</span>(<span class="kw-2">&</span><span class="ident">opts</span>.<span class="ident">program</span>.<span class="ident">join</span>(<span class="string">" "</span>)); |
| 693 | + <span class="ident">command</span> |
| 694 | + }, |
| 695 | + <span class="ident">signal_name_by_value</span>(<span class="ident">signal_code</span> <span class="kw">as</span> <span class="ident">usize</span>).<span class="ident">map_or_else</span>( |
| 696 | + <span class="op">|</span><span class="op">|</span> <span class="ident">String::from</span>(<span class="string">"UNKNOWN"</span>), |
| 697 | + <span class="op">|</span><span class="ident">signal</span><span class="op">|</span> { |
| 698 | + <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">full_signal_name</span> <span class="op">=</span> <span class="ident">String::from</span>(<span class="string">"SIG"</span>); |
| 699 | + <span class="ident">full_signal_name</span>.<span class="ident">push_str</span>(<span class="ident">signal</span>); |
| 700 | + <span class="ident">full_signal_name</span> |
| 701 | + } |
| 702 | + ) |
| 703 | + ); |
| 704 | + <span class="kw">return</span> <span class="prelude-val">Err</span>((<span class="number">128</span> <span class="op">+</span> <span class="ident">signal_code</span>).<span class="ident">into</span>()); |
| 705 | + } |
| 706 | + <span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">not</span>(<span class="ident">unix</span>))]</span> |
| 707 | + <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">exit</span>.<span class="ident">code</span>().<span class="ident">unwrap</span>().<span class="ident">into</span>()); |
| 708 | + } |
641 | 709 | <span class="prelude-val">Err</span>(<span class="kw-2">ref</span> <span class="ident">err</span>) <span class="kw">if</span> <span class="ident">err</span>.<span class="ident">kind</span>() <span class="op">==</span> <span class="ident">io::ErrorKind::NotFound</span> => <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="number">127</span>.<span class="ident">into</span>()),
|
642 | 710 | <span class="prelude-val">Err</span>(<span class="kw">_</span>) => <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="number">126</span>.<span class="ident">into</span>()),
|
643 | 711 | <span class="prelude-val">Ok</span>(<span class="kw">_</span>) => (),
|
|
0 commit comments