|
770 | 770 | <span id="765">765</span>
|
771 | 771 | <span id="766">766</span>
|
772 | 772 | <span id="767">767</span>
|
| 773 | +<span id="768">768</span> |
| 774 | +<span id="769">769</span> |
| 775 | +<span id="770">770</span> |
| 776 | +<span id="771">771</span> |
| 777 | +<span id="772">772</span> |
| 778 | +<span id="773">773</span> |
| 779 | +<span id="774">774</span> |
| 780 | +<span id="775">775</span> |
| 781 | +<span id="776">776</span> |
| 782 | +<span id="777">777</span> |
| 783 | +<span id="778">778</span> |
| 784 | +<span id="779">779</span> |
| 785 | +<span id="780">780</span> |
| 786 | +<span id="781">781</span> |
| 787 | +<span id="782">782</span> |
| 788 | +<span id="783">783</span> |
| 789 | +<span id="784">784</span> |
| 790 | +<span id="785">785</span> |
| 791 | +<span id="786">786</span> |
| 792 | +<span id="787">787</span> |
| 793 | +<span id="788">788</span> |
| 794 | +<span id="789">789</span> |
| 795 | +<span id="790">790</span> |
| 796 | +<span id="791">791</span> |
773 | 797 | </pre><pre class="rust"><code><span class="comment">// spell-checker:ignore (vars) RFILE</span>
|
774 | 798 |
|
775 | 799 | <span class="attribute">#![<span class="ident">allow</span>(<span class="ident">clippy::upper_case_acronyms</span>)]</span>
|
|
1220 | 1244 | },
|
1221 | 1245 | }
|
1222 | 1246 |
|
| 1247 | +<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Debug</span>, <span class="ident">Clone</span>, <span class="ident">Copy</span>, <span class="ident">PartialEq</span>, <span class="ident">Eq</span>)]</span> |
| 1248 | +<span class="kw">struct</span> <span class="ident">DeviceAndINode</span> { |
| 1249 | + <span class="ident">device_id</span>: <span class="ident">u64</span>, |
| 1250 | + <span class="ident">inode</span>: <span class="ident">u64</span>, |
| 1251 | +} |
| 1252 | + |
| 1253 | +<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">unix</span>)]</span> |
| 1254 | +<span class="kw">impl</span> <span class="ident">From</span><span class="op"><</span><span class="ident">fs::Metadata</span><span class="op">></span> <span class="kw">for</span> <span class="ident">DeviceAndINode</span> { |
| 1255 | + <span class="kw">fn</span> <span class="ident">from</span>(<span class="ident">md</span>: <span class="ident">fs::Metadata</span>) -> <span class="self">Self</span> { |
| 1256 | + <span class="kw">use</span> <span class="ident">std::os::unix::fs::MetadataExt</span>; |
| 1257 | + |
| 1258 | + <span class="self">Self</span> { |
| 1259 | + <span class="ident">device_id</span>: <span class="ident">md</span>.<span class="ident">dev</span>(), |
| 1260 | + <span class="ident">inode</span>: <span class="ident">md</span>.<span class="ident">ino</span>(), |
| 1261 | + } |
| 1262 | + } |
| 1263 | +} |
| 1264 | + |
| 1265 | +<span class="kw">impl</span> <span class="ident">TryFrom</span><span class="op"><</span><span class="kw-2">&</span><span class="ident">libc::stat</span><span class="op">></span> <span class="kw">for</span> <span class="ident">DeviceAndINode</span> { |
| 1266 | + <span class="kw">type</span> <span class="ident">Error</span> <span class="op">=</span> <span class="ident">Error</span>; |
| 1267 | + |
| 1268 | + <span class="attribute">#[<span class="ident">allow</span>(<span class="ident">clippy::useless_conversion</span>)]</span> |
| 1269 | + <span class="kw">fn</span> <span class="ident">try_from</span>(<span class="ident">st</span>: <span class="kw-2">&</span><span class="ident">libc::stat</span>) -> <span class="prelude-ty">Result</span><span class="op"><</span><span class="self">Self</span><span class="op">></span> { |
| 1270 | + <span class="kw">let</span> <span class="ident">device_id</span> <span class="op">=</span> <span class="ident">u64::try_from</span>(<span class="ident">st</span>.<span class="ident">st_dev</span>).<span class="ident">map_err</span>(<span class="op">|</span><span class="ident">_r</span><span class="op">|</span> <span class="ident">Error::OutOfRange</span>)<span class="question-mark">?</span>; |
| 1271 | + <span class="kw">let</span> <span class="ident">inode</span> <span class="op">=</span> <span class="ident">u64::try_from</span>(<span class="ident">st</span>.<span class="ident">st_ino</span>).<span class="ident">map_err</span>(<span class="op">|</span><span class="ident">_r</span><span class="op">|</span> <span class="ident">Error::OutOfRange</span>)<span class="question-mark">?</span>; |
| 1272 | + <span class="prelude-val">Ok</span>(<span class="self">Self</span> { <span class="ident">device_id</span>, <span class="ident">inode</span> }) |
| 1273 | + } |
| 1274 | +} |
| 1275 | + |
1223 | 1276 | <span class="kw">fn</span> <span class="ident">process_files</span>(
|
1224 | 1277 | <span class="ident">options</span>: <span class="kw-2">&</span><span class="ident">Options</span>,
|
1225 | 1278 | <span class="ident">context</span>: <span class="kw-2">&</span><span class="ident">SELinuxSecurityContext</span>,
|
1226 |
| - <span class="ident">root_dev_ino</span>: <span class="prelude-ty">Option</span><span class="op"><</span>(<span class="ident">libc::ino_t</span>, <span class="ident">libc::dev_t</span>)<span class="op">></span>, |
| 1279 | + <span class="ident">root_dev_ino</span>: <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">DeviceAndINode</span><span class="op">></span>, |
1227 | 1280 | ) -> <span class="ident">Vec</span><span class="op"><</span><span class="ident">Error</span><span class="op">></span> {
|
1228 | 1281 | <span class="kw">let</span> <span class="ident">fts_options</span> <span class="op">=</span> <span class="ident">options</span>.<span class="ident">recursive_mode</span>.<span class="ident">fts_open_options</span>();
|
1229 | 1282 | <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">fts</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">fts::FTS::new</span>(<span class="ident">options</span>.<span class="ident">files</span>.<span class="ident">iter</span>(), <span class="ident">fts_options</span>) {
|
|
1255 | 1308 | <span class="ident">options</span>: <span class="kw-2">&</span><span class="ident">Options</span>,
|
1256 | 1309 | <span class="ident">context</span>: <span class="kw-2">&</span><span class="ident">SELinuxSecurityContext</span>,
|
1257 | 1310 | <span class="ident">fts</span>: <span class="kw-2">&mut</span> <span class="ident">fts::FTS</span>,
|
1258 |
| - <span class="ident">root_dev_ino</span>: <span class="prelude-ty">Option</span><span class="op"><</span>(<span class="ident">libc::ino_t</span>, <span class="ident">libc::dev_t</span>)<span class="op">></span>, |
| 1311 | + <span class="ident">root_dev_ino</span>: <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">DeviceAndINode</span><span class="op">></span>, |
1259 | 1312 | ) -> <span class="prelude-ty">Result</span><span class="op"><</span>()<span class="op">></span> {
|
1260 | 1313 | <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">entry</span> <span class="op">=</span> <span class="ident">fts</span>.<span class="ident">last_entry_ref</span>().<span class="ident">unwrap</span>();
|
1261 | 1314 |
|
|
1276 | 1329 | };
|
1277 | 1330 |
|
1278 | 1331 | <span class="comment">// SAFETY: If `entry.fts_statp` is not null, then is is assumed to be valid.</span>
|
1279 |
| - <span class="kw">let</span> <span class="ident">file_dev_ino</span> <span class="op">=</span> <span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">stat</span>) <span class="op">=</span> <span class="ident">entry</span>.<span class="ident">stat</span>() { |
1280 |
| - (<span class="ident">stat</span>.<span class="ident">st_ino</span>, <span class="ident">stat</span>.<span class="ident">st_dev</span>) |
| 1332 | + <span class="kw">let</span> <span class="ident">file_dev_ino</span>: <span class="ident">DeviceAndINode</span> <span class="op">=</span> <span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">st</span>) <span class="op">=</span> <span class="ident">entry</span>.<span class="ident">stat</span>() { |
| 1333 | + <span class="ident">st</span>.<span class="ident">try_into</span>()<span class="question-mark">?</span> |
1281 | 1334 | } <span class="kw">else</span> {
|
1282 | 1335 | <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">err</span>(<span class="string">"Getting meta data"</span>, <span class="ident">io::ErrorKind::InvalidInput</span>));
|
1283 | 1336 | };
|
|
1464 | 1517 |
|
1465 | 1518 | <span class="doccomment">/// Call `lstat()` to get the device and inode numbers for `/`.</span>
|
1466 | 1519 | <span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">unix</span>)]</span>
|
1467 |
| -<span class="kw">fn</span> <span class="ident">get_root_dev_ino</span>() -> <span class="prelude-ty">Result</span><span class="op"><</span>(<span class="ident">libc::ino_t</span>, <span class="ident">libc::dev_t</span>)<span class="op">></span> { |
1468 |
| - <span class="kw">use</span> <span class="ident">std::os::unix::fs::MetadataExt</span>; |
1469 |
| - |
| 1520 | +<span class="kw">fn</span> <span class="ident">get_root_dev_ino</span>() -> <span class="prelude-ty">Result</span><span class="op"><</span><span class="ident">DeviceAndINode</span><span class="op">></span> { |
1470 | 1521 | <span class="ident">fs::symlink_metadata</span>(<span class="string">"/"</span>)
|
1471 |
| - .<span class="ident">map</span>(<span class="op">|</span><span class="ident">md</span><span class="op">|</span> (<span class="ident">md</span>.<span class="ident">ino</span>(), <span class="ident">md</span>.<span class="ident">dev</span>())) |
| 1522 | + .<span class="ident">map</span>(<span class="ident">DeviceAndINode::from</span>) |
1472 | 1523 | .<span class="ident">map_err</span>(<span class="op">|</span><span class="ident">r</span><span class="op">|</span> <span class="ident">Error::from_io1</span>(<span class="string">"std::fs::symlink_metadata"</span>, <span class="string">"/"</span>, <span class="ident">r</span>))
|
1473 | 1524 | }
|
1474 | 1525 |
|
1475 |
| -<span class="kw">fn</span> <span class="ident">root_dev_ino_check</span>( |
1476 |
| - <span class="ident">root_dev_ino</span>: <span class="prelude-ty">Option</span><span class="op"><</span>(<span class="ident">libc::ino_t</span>, <span class="ident">libc::dev_t</span>)<span class="op">></span>, |
1477 |
| - <span class="ident">dir_dev_ino</span>: (<span class="ident">libc::ino_t</span>, <span class="ident">libc::dev_t</span>), |
1478 |
| -) -> <span class="ident">bool</span> { |
| 1526 | +<span class="kw">fn</span> <span class="ident">root_dev_ino_check</span>(<span class="ident">root_dev_ino</span>: <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">DeviceAndINode</span><span class="op">></span>, <span class="ident">dir_dev_ino</span>: <span class="ident">DeviceAndINode</span>) -> <span class="ident">bool</span> { |
1479 | 1527 | <span class="ident">root_dev_ino</span>.<span class="ident">map_or</span>(<span class="bool-val">false</span>, <span class="op">|</span><span class="ident">root_dev_ino</span><span class="op">|</span> <span class="ident">root_dev_ino</span> <span class="op">==</span> <span class="ident">dir_dev_ino</span>)
|
1480 | 1528 | }
|
1481 | 1529 |
|
|
0 commit comments