|
1713 | 1713 | <span id="1708">1708</span>
|
1714 | 1714 | <span id="1709">1709</span>
|
1715 | 1715 | <span id="1710">1710</span>
|
| 1716 | +<span id="1711">1711</span> |
| 1717 | +<span id="1712">1712</span> |
| 1718 | +<span id="1713">1713</span> |
| 1719 | +<span id="1714">1714</span> |
| 1720 | +<span id="1715">1715</span> |
| 1721 | +<span id="1716">1716</span> |
1716 | 1722 | </pre><pre class="rust"><code><span class="attribute">#![<span class="ident">allow</span>(<span class="ident">clippy::missing_safety_doc</span>)]</span>
|
1717 | 1723 |
|
1718 | 1724 | <span class="comment">// This file is part of the uutils coreutils package.</span>
|
|
1725 | 1731 |
|
1726 | 1732 | <span class="comment">// spell-checker:ignore (ToDO) ficlone linkgs lstat nlink nlinks pathbuf reflink strs xattrs symlinked</span>
|
1727 | 1733 |
|
1728 |
| -<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">any</span>(<span class="ident">target_os</span> <span class="op">=</span> <span class="string">"linux"</span>, <span class="ident">target_os</span> <span class="op">=</span> <span class="string">"android"</span>))]</span> |
1729 |
| -<span class="attribute">#[<span class="ident">macro_use</span>]</span> |
1730 |
| -<span class="kw">extern</span> <span class="kw">crate</span> <span class="ident">ioctl_sys</span>; |
1731 | 1734 | <span class="attribute">#[<span class="ident">macro_use</span>]</span>
|
1732 | 1735 | <span class="kw">extern</span> <span class="kw">crate</span> <span class="ident">quick_error</span>;
|
1733 | 1736 | <span class="attribute">#[<span class="ident">macro_use</span>]</span>
|
|
1776 | 1779 | <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>};
|
1777 | 1780 | <span class="kw">use</span> <span class="ident">walkdir::WalkDir</span>;
|
1778 | 1781 |
|
1779 |
| -<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">any</span>(<span class="ident">target_os</span> <span class="op">=</span> <span class="string">"linux"</span>, <span class="ident">target_os</span> <span class="op">=</span> <span class="string">"android"</span>))]</span> |
1780 |
| -<span class="macro">ioctl!</span>(<span class="ident">write</span> <span class="ident">ficlone</span> <span class="ident">with</span> <span class="number">0x94</span>, <span class="number">9</span>; <span class="ident">std::os::raw::c_int</span>); |
1781 |
| - |
1782 | 1782 | <span class="macro">quick_error!</span> {
|
1783 | 1783 | <span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Debug</span>)]</span>
|
1784 | 1784 | <span class="kw">pub</span> <span class="kw">enum</span> <span class="ident">Error</span> {
|
|
1945 | 1945 | <span class="ident">verbose</span>: <span class="ident">bool</span>,
|
1946 | 1946 | }
|
1947 | 1947 |
|
| 1948 | +<span class="comment">// From /usr/include/linux/fs.h:</span> |
| 1949 | +<span class="comment">// #define FICLONE _IOW(0x94, 9, int)</span> |
| 1950 | +<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">any</span>(<span class="ident">target_os</span> <span class="op">=</span> <span class="string">"linux"</span>, <span class="ident">target_os</span> <span class="op">=</span> <span class="string">"android"</span>))]</span> |
| 1951 | +<span class="comment">// Use a macro as libc::ioctl expects u32 or u64 depending on the arch</span> |
| 1952 | +<span class="macro">macro_rules!</span> <span class="ident">FICLONE</span> { |
| 1953 | + () => { |
| 1954 | + <span class="number">0x40049409</span> |
| 1955 | + }; |
| 1956 | +} |
| 1957 | + |
1948 | 1958 | <span class="kw">static</span> <span class="ident">ABOUT</span>: <span class="kw-2">&</span><span class="ident">str</span> <span class="op">=</span> <span class="string">"Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY."</span>;
|
1949 | 1959 | <span class="kw">static</span> <span class="ident">LONG_HELP</span>: <span class="kw-2">&</span><span class="ident">str</span> <span class="op">=</span> <span class="string">""</span>;
|
1950 | 1960 | <span class="kw">static</span> <span class="ident">EXIT_ERR</span>: <span class="ident">i32</span> <span class="op">=</span> <span class="number">1</span>;
|
|
3282 | 3292 | .<span class="ident">context</span>(<span class="ident">context</span>)<span class="question-mark">?</span>;
|
3283 | 3293 | <span class="kw">match</span> <span class="ident">mode</span> {
|
3284 | 3294 | <span class="ident">ReflinkMode::Always</span> => <span class="kw">unsafe</span> {
|
3285 |
| - <span class="kw">let</span> <span class="ident">result</span> <span class="op">=</span> <span class="ident">ficlone</span>(<span class="ident">dst_file</span>.<span class="ident">as_raw_fd</span>(), <span class="ident">src_file</span>.<span class="ident">as_raw_fd</span>() <span class="kw">as</span> <span class="kw-2">*const</span> <span class="ident">i32</span>); |
| 3295 | + <span class="kw">let</span> <span class="ident">result</span> <span class="op">=</span> <span class="ident">libc::ioctl</span>(<span class="ident">dst_file</span>.<span class="ident">as_raw_fd</span>(), <span class="macro">FICLONE!</span>(), <span class="ident">src_file</span>.<span class="ident">as_raw_fd</span>()); |
| 3296 | + |
3286 | 3297 | <span class="kw">if</span> <span class="ident">result</span> <span class="op">!</span><span class="op">=</span> <span class="number">0</span> {
|
3287 | 3298 | <span class="prelude-val">Err</span>(<span class="macro">format!</span>(
|
3288 | 3299 | <span class="string">"failed to clone {:?} from {:?}: {}"</span>,
|
|
3296 | 3307 | }
|
3297 | 3308 | },
|
3298 | 3309 | <span class="ident">ReflinkMode::Auto</span> => <span class="kw">unsafe</span> {
|
3299 |
| - <span class="kw">let</span> <span class="ident">result</span> <span class="op">=</span> <span class="ident">ficlone</span>(<span class="ident">dst_file</span>.<span class="ident">as_raw_fd</span>(), <span class="ident">src_file</span>.<span class="ident">as_raw_fd</span>() <span class="kw">as</span> <span class="kw-2">*const</span> <span class="ident">i32</span>); |
| 3310 | + <span class="kw">let</span> <span class="ident">result</span> <span class="op">=</span> <span class="ident">libc::ioctl</span>(<span class="ident">dst_file</span>.<span class="ident">as_raw_fd</span>(), <span class="macro">FICLONE!</span>(), <span class="ident">src_file</span>.<span class="ident">as_raw_fd</span>()); |
| 3311 | + |
3300 | 3312 | <span class="kw">if</span> <span class="ident">result</span> <span class="op">!</span><span class="op">=</span> <span class="number">0</span> {
|
3301 | 3313 | <span class="ident">fs::copy</span>(<span class="ident">source</span>, <span class="ident">dest</span>).<span class="ident">context</span>(<span class="ident">context</span>)<span class="question-mark">?</span>;
|
3302 | 3314 | }
|
|
0 commit comments