This commit is contained in:
sylvestre
2021-08-29 02:26:40 +00:00
parent 1a0a3c674b
commit 0bb8285776
49 changed files with 775 additions and 274 deletions
+6 -6
View File
File diff suppressed because one or more lines are too long
+76 -12
View File
@@ -356,6 +356,38 @@
<span id="354">354</span>
<span id="355">355</span>
<span id="356">356</span>
<span id="357">357</span>
<span id="358">358</span>
<span id="359">359</span>
<span id="360">360</span>
<span id="361">361</span>
<span id="362">362</span>
<span id="363">363</span>
<span id="364">364</span>
<span id="365">365</span>
<span id="366">366</span>
<span id="367">367</span>
<span id="368">368</span>
<span id="369">369</span>
<span id="370">370</span>
<span id="371">371</span>
<span id="372">372</span>
<span id="373">373</span>
<span id="374">374</span>
<span id="375">375</span>
<span id="376">376</span>
<span id="377">377</span>
<span id="378">378</span>
<span id="379">379</span>
<span id="380">380</span>
<span id="381">381</span>
<span id="382">382</span>
<span id="383">383</span>
<span id="384">384</span>
<span id="385">385</span>
<span id="386">386</span>
<span id="387">387</span>
<span id="388">388</span>
</pre><pre class="rust">
<span class="comment">// This file is part of the uutils coreutils package.</span>
<span class="comment">//</span>
@@ -457,6 +489,10 @@ or: {0} [OPTION]... --reference=RFILE FILE...&quot;</span>,
<span class="prelude-val">Some</span>(<span class="ident">cmode</span>)
};
<span class="kw">if</span> <span class="ident">files</span>.<span class="ident">is_empty</span>() {
<span class="macro">crash!</span>(<span class="number">1</span>, <span class="string">&quot;missing operand&quot;</span>);
}
<span class="kw">let</span> <span class="ident">chmoder</span> <span class="op">=</span> <span class="ident">Chmoder</span> {
<span class="ident">changes</span>,
<span class="ident">quiet</span>,
@@ -539,6 +575,9 @@ or: {0} [OPTION]... --reference=RFILE FILE...&quot;</span>,
<span class="comment">// e.g. &quot;chmod -v -xw -R FILE&quot; -&gt; &quot;chmod -v xw -R FILE&quot;</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">strip_minus_from_mode</span>(<span class="ident">args</span>: <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">Vec</span><span class="op">&lt;</span><span class="ident">String</span><span class="op">&gt;</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">bool</span> {
<span class="kw">for</span> <span class="ident">arg</span> <span class="kw">in</span> <span class="ident">args</span> {
<span class="kw">if</span> <span class="ident">arg</span> <span class="op">=</span><span class="op">=</span> <span class="string">&quot;--&quot;</span> {
<span class="kw">break</span>;
}
<span class="kw">if</span> <span class="ident">arg</span>.<span class="ident">starts_with</span>(<span class="string">&#39;-&#39;</span>) {
<span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">second</span>) <span class="op">=</span> <span class="ident">arg</span>.<span class="ident">chars</span>().<span class="ident">nth</span>(<span class="number">1</span>) {
<span class="kw">match</span> <span class="ident">second</span> {
@@ -581,7 +620,7 @@ or: {0} [OPTION]... --reference=RFILE FILE...&quot;</span>,
<span class="kw">if</span> <span class="op">!</span><span class="self">self</span>.<span class="ident">quiet</span> {
<span class="macro">show_error!</span>(<span class="string">&quot;cannot operate on dangling symlink &#39;{}&#39;&quot;</span>, <span class="ident">filename</span>);
}
} <span class="kw">else</span> {
} <span class="kw">else</span> <span class="kw">if</span> <span class="op">!</span><span class="self">self</span>.<span class="ident">quiet</span> {
<span class="macro">show_error!</span>(<span class="string">&quot;cannot access &#39;{}&#39;: No such file or directory&quot;</span>, <span class="ident">filename</span>);
}
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="number">1</span>);
@@ -612,9 +651,11 @@ or: {0} [OPTION]... --reference=RFILE FILE...&quot;</span>,
<span class="comment">// instead it just sets the readonly attribute on the file</span>
<span class="prelude-val">Err</span>(<span class="number">0</span>)
}
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">any</span>(<span class="ident">unix</span>, <span class="ident">target_os</span> <span class="op">=</span> <span class="string">&quot;redox&quot;</span>))]</span>
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">unix</span>)]</span>
<span class="kw">fn</span> <span class="ident">chmod_file</span>(<span class="kw-2">&amp;</span><span class="self">self</span>, <span class="ident">file</span>: <span class="kw-2">&amp;</span><span class="ident">Path</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span>(), <span class="ident">i32</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">fperm</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">fs::metadata</span>(<span class="ident">file</span>) {
<span class="kw">use</span> <span class="ident">uucore::mode::get_umask</span>;
<span class="kw">let</span> <span class="ident">fperm</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">fs::metadata</span>(<span class="ident">file</span>) {
<span class="prelude-val">Ok</span>(<span class="ident">meta</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">meta</span>.<span class="ident">mode</span>() <span class="op">&amp;</span> <span class="number">0o7777</span>,
<span class="prelude-val">Err</span>(<span class="ident">err</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="kw">if</span> <span class="ident">is_symlink</span>(<span class="ident">file</span>) {
@@ -637,18 +678,30 @@ or: {0} [OPTION]... --reference=RFILE FILE...&quot;</span>,
<span class="prelude-val">Some</span>(<span class="ident">mode</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="self">self</span>.<span class="ident">change_file</span>(<span class="ident">fperm</span>, <span class="ident">mode</span>, <span class="ident">file</span>)<span class="question-mark">?</span>,
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="ident">cmode_unwrapped</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">cmode</span>.<span class="ident">clone</span>().<span class="ident">unwrap</span>();
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">new_mode</span> <span class="op">=</span> <span class="ident">fperm</span>;
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">naively_expected_new_mode</span> <span class="op">=</span> <span class="ident">new_mode</span>;
<span class="kw">for</span> <span class="ident">mode</span> <span class="kw">in</span> <span class="ident">cmode_unwrapped</span>.<span class="ident">split</span>(<span class="string">&#39;,&#39;</span>) {
<span class="comment">// cmode is guaranteed to be Some in this case</span>
<span class="kw">let</span> <span class="ident">arr</span>: <span class="kw-2">&amp;</span>[<span class="ident">char</span>] <span class="op">=</span> <span class="kw-2">&amp;</span>[<span class="string">&#39;0&#39;</span>, <span class="string">&#39;1&#39;</span>, <span class="string">&#39;2&#39;</span>, <span class="string">&#39;3&#39;</span>, <span class="string">&#39;4&#39;</span>, <span class="string">&#39;5&#39;</span>, <span class="string">&#39;6&#39;</span>, <span class="string">&#39;7&#39;</span>, <span class="string">&#39;8&#39;</span>, <span class="string">&#39;9&#39;</span>];
<span class="kw">let</span> <span class="ident">result</span> <span class="op">=</span> <span class="kw">if</span> <span class="ident">mode</span>.<span class="ident">contains</span>(<span class="ident">arr</span>) {
<span class="ident">mode::parse_numeric</span>(<span class="ident">fperm</span>, <span class="ident">mode</span>)
<span class="ident">mode::parse_numeric</span>(<span class="ident">new_mode</span>, <span class="ident">mode</span>, <span class="ident">file</span>.<span class="ident">is_dir</span>()).<span class="ident">map</span>(<span class="op">|</span><span class="ident">v</span><span class="op">|</span> (<span class="ident">v</span>, <span class="ident">v</span>))
} <span class="kw">else</span> {
<span class="ident">mode::parse_symbolic</span>(<span class="ident">fperm</span>, <span class="ident">mode</span>, <span class="ident">file</span>.<span class="ident">is_dir</span>())
<span class="ident">mode::parse_symbolic</span>(<span class="ident">new_mode</span>, <span class="ident">mode</span>, <span class="ident">get_umask</span>(), <span class="ident">file</span>.<span class="ident">is_dir</span>()).<span class="ident">map</span>(<span class="op">|</span><span class="ident">m</span><span class="op">|</span> {
<span class="comment">// calculate the new mode as if umask was 0</span>
<span class="kw">let</span> <span class="ident">naive_mode</span> <span class="op">=</span> <span class="ident">mode::parse_symbolic</span>(
<span class="ident">naively_expected_new_mode</span>,
<span class="ident">mode</span>,
<span class="number">0</span>,
<span class="ident">file</span>.<span class="ident">is_dir</span>(),
)
.<span class="ident">unwrap</span>(); <span class="comment">// we know that mode must be valid, so this cannot fail</span>
(<span class="ident">m</span>, <span class="ident">naive_mode</span>)
})
};
<span class="kw">match</span> <span class="ident">result</span> {
<span class="prelude-val">Ok</span>(<span class="ident">mode</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="self">self</span>.<span class="ident">change_file</span>(<span class="ident">fperm</span>, <span class="ident">mode</span>, <span class="ident">file</span>)<span class="question-mark">?</span>;
<span class="ident">fperm</span> <span class="op">=</span> <span class="ident">mode</span>;
<span class="prelude-val">Ok</span>((<span class="ident">mode</span>, <span class="ident">naive_mode</span>)) <span class="op">=</span><span class="op">&gt;</span> {
<span class="ident">new_mode</span> <span class="op">=</span> <span class="ident">mode</span>;
<span class="ident">naively_expected_new_mode</span> <span class="op">=</span> <span class="ident">naive_mode</span>;
}
<span class="prelude-val">Err</span>(<span class="ident">f</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="kw">if</span> <span class="op">!</span><span class="self">self</span>.<span class="ident">quiet</span> {
@@ -658,6 +711,17 @@ or: {0} [OPTION]... --reference=RFILE FILE...&quot;</span>,
}
}
}
<span class="self">self</span>.<span class="ident">change_file</span>(<span class="ident">fperm</span>, <span class="ident">new_mode</span>, <span class="ident">file</span>)<span class="question-mark">?</span>;
<span class="comment">// if a permission would have been removed if umask was 0, but it wasn&#39;t because umask was not 0, print an error and fail</span>
<span class="kw">if</span> (<span class="ident">new_mode</span> <span class="op">&amp;</span> <span class="op">!</span><span class="ident">naively_expected_new_mode</span>) <span class="op">!</span><span class="op">=</span> <span class="number">0</span> {
<span class="macro">show_error!</span>(
<span class="string">&quot;{}: new permissions are {}, not {}&quot;</span>,
<span class="ident">file</span>.<span class="ident">display</span>(),
<span class="ident">display_permissions_unix</span>(<span class="ident">new_mode</span> <span class="kw">as</span> <span class="ident">mode_t</span>, <span class="bool-val">false</span>),
<span class="ident">display_permissions_unix</span>(<span class="ident">naively_expected_new_mode</span> <span class="kw">as</span> <span class="ident">mode_t</span>, <span class="bool-val">false</span>)
);
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="number">1</span>);
}
}
}
@@ -681,8 +745,8 @@ or: {0} [OPTION]... --reference=RFILE FILE...&quot;</span>,
<span class="macro">show_error!</span>(<span class="string">&quot;{}&quot;</span>, <span class="ident">err</span>);
}
<span class="kw">if</span> <span class="self">self</span>.<span class="ident">verbose</span> {
<span class="macro">show_error!</span>(
<span class="string">&quot;failed to change mode of file &#39;{}&#39; from {:o} ({}) to {:o} ({})&quot;</span>,
<span class="macro">println!</span>(
<span class="string">&quot;failed to change mode of file &#39;{}&#39; from {:04o} ({}) to {:04o} ({})&quot;</span>,
<span class="ident">file</span>.<span class="ident">display</span>(),
<span class="ident">fperm</span>,
<span class="ident">display_permissions_unix</span>(<span class="ident">fperm</span> <span class="kw">as</span> <span class="ident">mode_t</span>, <span class="bool-val">false</span>),
@@ -693,8 +757,8 @@ or: {0} [OPTION]... --reference=RFILE FILE...&quot;</span>,
<span class="prelude-val">Err</span>(<span class="number">1</span>)
} <span class="kw">else</span> {
<span class="kw">if</span> <span class="self">self</span>.<span class="ident">verbose</span> <span class="op">|</span><span class="op">|</span> <span class="self">self</span>.<span class="ident">changes</span> {
<span class="macro">show_error!</span>(
<span class="string">&quot;mode of &#39;{}&#39; changed from {:o} ({}) to {:o} ({})&quot;</span>,
<span class="macro">println!</span>(
<span class="string">&quot;mode of &#39;{}&#39; changed from {:04o} ({}) to {:04o} ({})&quot;</span>,
<span class="ident">file</span>.<span class="ident">display</span>(),
<span class="ident">fperm</span>,
<span class="ident">display_permissions_unix</span>(<span class="ident">fperm</span> <span class="kw">as</span> <span class="ident">mode_t</span>, <span class="bool-val">false</span>),
+20 -12
View File
@@ -274,6 +274,10 @@
<span id="272">272</span>
<span id="273">273</span>
<span id="274">274</span>
<span id="275">275</span>
<span id="276">276</span>
<span id="277">277</span>
<span id="278">278</span>
</pre><pre class="rust">
<span class="comment">// This file is part of the uutils coreutils package.</span>
<span class="comment">//</span>
@@ -289,6 +293,9 @@
<span class="attribute">#[<span class="ident">macro_use</span>]</span>
<span class="kw">extern</span> <span class="kw">crate</span> <span class="ident">clap</span>;
<span class="attribute">#[<span class="ident">macro_use</span>]</span>
<span class="kw">extern</span> <span class="kw">crate</span> <span class="ident">uucore</span>;
<span class="kw">use</span> <span class="ident">clap</span>::{<span class="ident">App</span>, <span class="ident">AppSettings</span>, <span class="ident">Arg</span>};
<span class="kw">use</span> <span class="ident">ini::Ini</span>;
<span class="kw">use</span> <span class="ident">std::borrow::Cow</span>;
@@ -296,6 +303,7 @@
<span class="kw">use</span> <span class="ident">std::io</span>::{<span class="self">self</span>, <span class="ident">Write</span>};
<span class="kw">use</span> <span class="ident">std::iter::Iterator</span>;
<span class="kw">use</span> <span class="ident">std::process::Command</span>;
<span class="kw">use</span> <span class="ident">uucore::error</span>::{<span class="ident">UResult</span>, <span class="ident">USimpleError</span>};
<span class="kw">const</span> <span class="ident">USAGE</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]&quot;</span>;
<span class="kw">const</span> <span class="ident">AFTER_HELP</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;\
@@ -347,7 +355,7 @@ A mere - implies -i. If no COMMAND, print the resulting environment.
}
}
<span class="kw">fn</span> <span class="ident">load_config_file</span>(<span class="ident">opts</span>: <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">Options</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span>(), <span class="ident">i32</span><span class="op">&gt;</span> {
<span class="kw">fn</span> <span class="ident">load_config_file</span>(<span class="ident">opts</span>: <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">Options</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">UResult</span><span class="op">&lt;</span>()<span class="op">&gt;</span> {
<span class="comment">// NOTE: config files are parsed using an INI parser b/c it&#39;s available and compatible with &quot;.env&quot;-style files</span>
<span class="comment">// ... * but support for actual INI files, although working, is not intended, nor claimed</span>
<span class="kw">for</span> <span class="kw-2">&amp;</span><span class="ident">file</span> <span class="kw">in</span> <span class="kw-2">&amp;</span><span class="ident">opts</span>.<span class="ident">files</span> {
@@ -434,7 +442,7 @@ A mere - implies -i. If no COMMAND, print the resulting environment.
.<span class="ident">help</span>(<span class="string">&quot;remove variable from the environment&quot;</span>))
}
<span class="kw">fn</span> <span class="ident">run_env</span>(<span class="ident">args</span>: <span class="kw">impl</span> <span class="ident">uucore::Args</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span>(), <span class="ident">i32</span><span class="op">&gt;</span> {
<span class="kw">fn</span> <span class="ident">run_env</span>(<span class="ident">args</span>: <span class="kw">impl</span> <span class="ident">uucore::Args</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">UResult</span><span class="op">&lt;</span>()<span class="op">&gt;</span> {
<span class="kw">let</span> <span class="ident">app</span> <span class="op">=</span> <span class="ident">uu_app</span>();
<span class="kw">let</span> <span class="ident">matches</span> <span class="op">=</span> <span class="ident">app</span>.<span class="ident">get_matches_from</span>(<span class="ident">args</span>);
@@ -465,8 +473,10 @@ A mere - implies -i. If no COMMAND, print the resulting environment.
<span class="kw">match</span> <span class="ident">env::set_current_dir</span>(<span class="ident">d</span>) {
<span class="prelude-val">Ok</span>(()) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">d</span>,
<span class="prelude-val">Err</span>(<span class="ident">error</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="macro">eprintln!</span>(<span class="string">&quot;env: cannot change directory to \&quot;{}\&quot;: {}&quot;</span>, <span class="ident">d</span>, <span class="ident">error</span>);
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="number">125</span>);
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">USimpleError::new</span>(
<span class="number">125</span>,
<span class="macro">format!</span>(<span class="string">&quot;cannot change directory to \&quot;{}\&quot;: {}&quot;</span>, <span class="ident">d</span>, <span class="ident">error</span>),
));
}
};
}
@@ -530,9 +540,9 @@ A mere - implies -i. If no COMMAND, print the resulting environment.
<span class="comment">// FIXME: this should just use execvp() (no fork()) on Unix-like systems</span>
<span class="kw">match</span> <span class="ident">Command::new</span>(<span class="kw-2">&amp;</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>() {
<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="op">=</span><span class="op">&gt;</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="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="op">=</span> <span class="ident">io::ErrorKind::NotFound</span> <span class="op">=</span><span class="op">&gt;</span> <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="number">127</span>),
<span class="prelude-val">Err</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="number">126</span>),
<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="op">=</span><span class="op">&gt;</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>()),
<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="op">=</span> <span class="ident">io::ErrorKind::NotFound</span> <span class="op">=</span><span class="op">&gt;</span> <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="number">127</span>.<span class="ident">into</span>()),
<span class="prelude-val">Err</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="number">126</span>.<span class="ident">into</span>()),
<span class="prelude-val">Ok</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">&gt;</span> (),
}
} <span class="kw">else</span> {
@@ -543,11 +553,9 @@ A mere - implies -i. If no COMMAND, print the resulting environment.
<span class="prelude-val">Ok</span>(())
}
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">uumain</span>(<span class="ident">args</span>: <span class="kw">impl</span> <span class="ident">uucore::Args</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">i32</span> {
<span class="kw">match</span> <span class="ident">run_env</span>(<span class="ident">args</span>) {
<span class="prelude-val">Ok</span>(()) <span class="op">=</span><span class="op">&gt;</span> <span class="number">0</span>,
<span class="prelude-val">Err</span>(<span class="ident">code</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">code</span>,
}
<span class="attribute">#[<span class="ident">uucore_procs::gen_uumain</span>]</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">uumain</span>(<span class="ident">args</span>: <span class="kw">impl</span> <span class="ident">uucore::Args</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">UResult</span><span class="op">&lt;</span>()<span class="op">&gt;</span> {
<span class="ident">run_env</span>(<span class="ident">args</span>)
}
</pre></div>
</section><section id="search" class="content hidden"></section><div id="rustdoc-vars" data-root-path="../../" data-current-crate="uu_env" data-search-index-js="../../search-index.js" data-search-js="../../search.js"></div><script src="../../main.js"></script><script src="../../source-script.js"></script><script src="../../source-files.js"></script></body></html>
+3 -1
View File
@@ -763,6 +763,7 @@
<span id="761">761</span>
<span id="762">762</span>
<span id="763">763</span>
<span id="764">764</span>
</pre><pre class="rust">
<span class="comment">// * This file is part of the uutils coreutils package.</span>
<span class="comment">// *</span>
@@ -784,6 +785,7 @@
<span class="kw">use</span> <span class="ident">uucore::backup_control</span>::{<span class="self">self</span>, <span class="ident">BackupMode</span>};
<span class="kw">use</span> <span class="ident">uucore::entries</span>::{<span class="ident">grp2gid</span>, <span class="ident">usr2uid</span>};
<span class="kw">use</span> <span class="ident">uucore::error</span>::{<span class="ident">FromIo</span>, <span class="ident">UError</span>, <span class="ident">UIoError</span>, <span class="ident">UResult</span>};
<span class="kw">use</span> <span class="ident">uucore::mode::get_umask</span>;
<span class="kw">use</span> <span class="ident">uucore::perms</span>::{<span class="ident">wrap_chown</span>, <span class="ident">Verbosity</span>, <span class="ident">VerbosityLevel</span>};
<span class="kw">use</span> <span class="ident">libc</span>::{<span class="ident">getegid</span>, <span class="ident">geteuid</span>};
@@ -1125,7 +1127,7 @@
<span class="kw">let</span> <span class="ident">specified_mode</span>: <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">u32</span><span class="op">&gt;</span> <span class="op">=</span> <span class="kw">if</span> <span class="ident">matches</span>.<span class="ident">is_present</span>(<span class="ident">OPT_MODE</span>) {
<span class="kw">let</span> <span class="ident">x</span> <span class="op">=</span> <span class="ident">matches</span>.<span class="ident">value_of</span>(<span class="ident">OPT_MODE</span>).<span class="ident">ok_or</span>(<span class="number">1</span>)<span class="question-mark">?</span>;
<span class="prelude-val">Some</span>(<span class="ident">mode::parse</span>(<span class="ident">x</span>, <span class="ident">considering_dir</span>).<span class="ident">map_err</span>(<span class="op">|</span><span class="ident">err</span><span class="op">|</span> {
<span class="prelude-val">Some</span>(<span class="ident">mode::parse</span>(<span class="ident">x</span>, <span class="ident">considering_dir</span>, <span class="ident">get_umask</span>()).<span class="ident">map_err</span>(<span class="op">|</span><span class="ident">err</span><span class="op">|</span> {
<span class="macro">show_error!</span>(<span class="string">&quot;Invalid mode string: {}&quot;</span>, <span class="ident">err</span>);
<span class="number">1</span>
})<span class="question-mark">?</span>)
+3 -3
View File
@@ -45,14 +45,14 @@
<span class="kw">use</span> <span class="ident">uucore::mode</span>;
<span class="doccomment">/// Takes a user-supplied string and tries to parse to u16 mode bitmask.</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">parse</span>(<span class="ident">mode_string</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>, <span class="ident">considering_dir</span>: <span class="ident">bool</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">u32</span>, <span class="ident">String</span><span class="op">&gt;</span> {
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">parse</span>(<span class="ident">mode_string</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>, <span class="ident">considering_dir</span>: <span class="ident">bool</span>, <span class="ident">umask</span>: <span class="ident">u32</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">u32</span>, <span class="ident">String</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="ident">numbers</span>: <span class="kw-2">&amp;</span>[<span class="ident">char</span>] <span class="op">=</span> <span class="kw-2">&amp;</span>[<span class="string">&#39;0&#39;</span>, <span class="string">&#39;1&#39;</span>, <span class="string">&#39;2&#39;</span>, <span class="string">&#39;3&#39;</span>, <span class="string">&#39;4&#39;</span>, <span class="string">&#39;5&#39;</span>, <span class="string">&#39;6&#39;</span>, <span class="string">&#39;7&#39;</span>, <span class="string">&#39;8&#39;</span>, <span class="string">&#39;9&#39;</span>];
<span class="comment">// Passing 000 as the existing permissions seems to mirror GNU behavior.</span>
<span class="kw">if</span> <span class="ident">mode_string</span>.<span class="ident">contains</span>(<span class="ident">numbers</span>) {
<span class="ident">mode::parse_numeric</span>(<span class="number">0</span>, <span class="ident">mode_string</span>)
<span class="ident">mode::parse_numeric</span>(<span class="number">0</span>, <span class="ident">mode_string</span>, <span class="ident">considering_dir</span>)
} <span class="kw">else</span> {
<span class="ident">mode::parse_symbolic</span>(<span class="number">0</span>, <span class="ident">mode_string</span>, <span class="ident">considering_dir</span>)
<span class="ident">mode::parse_symbolic</span>(<span class="number">0</span>, <span class="ident">mode_string</span>, <span class="ident">umask</span>, <span class="ident">considering_dir</span>)
}
}
+63 -1
View File
@@ -662,10 +662,44 @@
<span id="660">660</span>
<span id="661">661</span>
<span id="662">662</span>
<span id="663">663</span>
<span id="664">664</span>
<span id="665">665</span>
<span id="666">666</span>
<span id="667">667</span>
<span id="668">668</span>
<span id="669">669</span>
<span id="670">670</span>
<span id="671">671</span>
<span id="672">672</span>
<span id="673">673</span>
<span id="674">674</span>
<span id="675">675</span>
<span id="676">676</span>
<span id="677">677</span>
<span id="678">678</span>
<span id="679">679</span>
<span id="680">680</span>
<span id="681">681</span>
<span id="682">682</span>
<span id="683">683</span>
<span id="684">684</span>
<span id="685">685</span>
<span id="686">686</span>
<span id="687">687</span>
<span id="688">688</span>
<span id="689">689</span>
<span id="690">690</span>
<span id="691">691</span>
<span id="692">692</span>
<span id="693">693</span>
</pre><pre class="rust">
<span class="kw">use</span> <span class="ident">std::char::from_digit</span>;
<span class="kw">const</span> <span class="ident">SPECIAL_SHELL_CHARS</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;~`#$&amp;*()|[]{};\\&#39;\&quot;&lt;&gt;?! &quot;</span>;
<span class="comment">// These are characters with special meaning in the shell (e.g. bash).</span>
<span class="comment">// The first const contains characters that only have a special meaning when they appear at the beginning of a name.</span>
<span class="kw">const</span> <span class="ident">SPECIAL_SHELL_CHARS_START</span>: <span class="kw-2">&amp;</span>[<span class="ident">char</span>] <span class="op">=</span> <span class="kw-2">&amp;</span>[<span class="string">&#39;~&#39;</span>, <span class="string">&#39;#&#39;</span>];
<span class="kw">const</span> <span class="ident">SPECIAL_SHELL_CHARS</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;`$&amp;*()|[]{};\\&#39;\&quot;&lt;&gt;?! &quot;</span>;
<span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">enum</span> <span class="ident">QuotingStyle</span> {
<span class="ident">Shell</span> {
@@ -863,6 +897,8 @@
}
}
}
<span class="ident">must_quote</span> <span class="op">=</span> <span class="ident">must_quote</span> <span class="op">|</span><span class="op">|</span> <span class="ident">name</span>.<span class="ident">starts_with</span>(<span class="ident">SPECIAL_SHELL_CHARS_START</span>);
(<span class="ident">escaped_str</span>, <span class="ident">must_quote</span>)
}
@@ -911,6 +947,7 @@
}
}
}
<span class="ident">must_quote</span> <span class="op">=</span> <span class="ident">must_quote</span> <span class="op">|</span><span class="op">|</span> <span class="ident">name</span>.<span class="ident">starts_with</span>(<span class="ident">SPECIAL_SHELL_CHARS_START</span>);
(<span class="ident">escaped_str</span>, <span class="ident">must_quote</span>)
}
@@ -1324,6 +1361,31 @@
],
);
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">test_tilde_and_hash</span>() {
<span class="ident">check_names</span>(<span class="string">&quot;~&quot;</span>, <span class="macro">vec!</span>[(<span class="string">&quot;&#39;~&#39;&quot;</span>, <span class="string">&quot;shell&quot;</span>), (<span class="string">&quot;&#39;~&#39;&quot;</span>, <span class="string">&quot;shell-escape&quot;</span>)]);
<span class="ident">check_names</span>(
<span class="string">&quot;~name&quot;</span>,
<span class="macro">vec!</span>[(<span class="string">&quot;&#39;~name&#39;&quot;</span>, <span class="string">&quot;shell&quot;</span>), (<span class="string">&quot;&#39;~name&#39;&quot;</span>, <span class="string">&quot;shell-escape&quot;</span>)],
);
<span class="ident">check_names</span>(
<span class="string">&quot;some~name&quot;</span>,
<span class="macro">vec!</span>[(<span class="string">&quot;some~name&quot;</span>, <span class="string">&quot;shell&quot;</span>), (<span class="string">&quot;some~name&quot;</span>, <span class="string">&quot;shell-escape&quot;</span>)],
);
<span class="ident">check_names</span>(<span class="string">&quot;name~&quot;</span>, <span class="macro">vec!</span>[(<span class="string">&quot;name~&quot;</span>, <span class="string">&quot;shell&quot;</span>), (<span class="string">&quot;name~&quot;</span>, <span class="string">&quot;shell-escape&quot;</span>)]);
<span class="ident">check_names</span>(<span class="string">&quot;#&quot;</span>, <span class="macro">vec!</span>[(<span class="string">&quot;&#39;#&#39;&quot;</span>, <span class="string">&quot;shell&quot;</span>), (<span class="string">&quot;&#39;#&#39;&quot;</span>, <span class="string">&quot;shell-escape&quot;</span>)]);
<span class="ident">check_names</span>(
<span class="string">&quot;#name&quot;</span>,
<span class="macro">vec!</span>[(<span class="string">&quot;&#39;#name&#39;&quot;</span>, <span class="string">&quot;shell&quot;</span>), (<span class="string">&quot;&#39;#name&#39;&quot;</span>, <span class="string">&quot;shell-escape&quot;</span>)],
);
<span class="ident">check_names</span>(
<span class="string">&quot;some#name&quot;</span>,
<span class="macro">vec!</span>[(<span class="string">&quot;some#name&quot;</span>, <span class="string">&quot;shell&quot;</span>), (<span class="string">&quot;some#name&quot;</span>, <span class="string">&quot;shell-escape&quot;</span>)],
);
<span class="ident">check_names</span>(<span class="string">&quot;name#&quot;</span>, <span class="macro">vec!</span>[(<span class="string">&quot;name#&quot;</span>, <span class="string">&quot;shell&quot;</span>), (<span class="string">&quot;name#&quot;</span>, <span class="string">&quot;shell-escape&quot;</span>)]);
}
}
</pre></div>
</section><section id="search" class="content hidden"></section><div id="rustdoc-vars" data-root-path="../../" data-current-crate="uu_ls" data-search-index-js="../../search-index.js" data-search-js="../../search.js"></div><script src="../../main.js"></script><script src="../../source-script.js"></script><script src="../../source-files.js"></script></body></html>
+337 -113
View File
@@ -1,89 +1,201 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `src/uu/pwd/src/pwd.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>pwd.rs - source</title><link rel="stylesheet" type="text/css" href="../../normalize.css"><link rel="stylesheet" type="text/css" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../light.css" id="themeStyle"><link rel="stylesheet" type="text/css" href="../../dark.css" disabled ><link rel="stylesheet" type="text/css" href="../../ayu.css" disabled ><script id="default-settings"></script><script src="../../storage.js"></script><script src="../../crates.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="icon" type="image/svg+xml" href="../../favicon.svg">
<link rel="alternate icon" type="image/png" href="../../favicon-16x16.png">
<link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc source"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu" role="button">&#9776;</div><a href='../../uu_pwd/index.html'><div class='logo-container rust-logo'><img src='../../rust-logo.png' alt='logo'></div></a></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!" aria-haspopup="menu" title="themes"><img src="../../brush.svg" width="18" height="18" alt="Pick another theme!"></button><div id="theme-choices" role="menu"></div></div><nav class="sub"><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press S to search, ? for more options…" type="search"></div><button type="button" id="help-button" title="help">?</button><a id="settings-menu" href="../../settings.html" title="settings"><img src="../../wheel.svg" width="18" height="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><div class="example-wrap"><pre class="line-numbers"><span id="1"> 1</span>
<span id="2"> 2</span>
<span id="3"> 3</span>
<span id="4"> 4</span>
<span id="5"> 5</span>
<span id="6"> 6</span>
<span id="7"> 7</span>
<span id="8"> 8</span>
<span id="9"> 9</span>
<span id="10">10</span>
<span id="11">11</span>
<span id="12">12</span>
<span id="13">13</span>
<span id="14">14</span>
<span id="15">15</span>
<span id="16">16</span>
<span id="17">17</span>
<span id="18">18</span>
<span id="19">19</span>
<span id="20">20</span>
<span id="21">21</span>
<span id="22">22</span>
<span id="23">23</span>
<span id="24">24</span>
<span id="25">25</span>
<span id="26">26</span>
<span id="27">27</span>
<span id="28">28</span>
<span id="29">29</span>
<span id="30">30</span>
<span id="31">31</span>
<span id="32">32</span>
<span id="33">33</span>
<span id="34">34</span>
<span id="35">35</span>
<span id="36">36</span>
<span id="37">37</span>
<span id="38">38</span>
<span id="39">39</span>
<span id="40">40</span>
<span id="41">41</span>
<span id="42">42</span>
<span id="43">43</span>
<span id="44">44</span>
<span id="45">45</span>
<span id="46">46</span>
<span id="47">47</span>
<span id="48">48</span>
<span id="49">49</span>
<span id="50">50</span>
<span id="51">51</span>
<span id="52">52</span>
<span id="53">53</span>
<span id="54">54</span>
<span id="55">55</span>
<span id="56">56</span>
<span id="57">57</span>
<span id="58">58</span>
<span id="59">59</span>
<span id="60">60</span>
<span id="61">61</span>
<span id="62">62</span>
<span id="63">63</span>
<span id="64">64</span>
<span id="65">65</span>
<span id="66">66</span>
<span id="67">67</span>
<span id="68">68</span>
<span id="69">69</span>
<span id="70">70</span>
<span id="71">71</span>
<span id="72">72</span>
<span id="73">73</span>
<span id="74">74</span>
<span id="75">75</span>
<span id="76">76</span>
<span id="77">77</span>
<span id="78">78</span>
<span id="79">79</span>
<span id="80">80</span>
<span id="81">81</span>
<span id="82">82</span>
<span id="83">83</span>
<span id="84">84</span>
<link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc source"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu" role="button">&#9776;</div><a href='../../uu_pwd/index.html'><div class='logo-container rust-logo'><img src='../../rust-logo.png' alt='logo'></div></a></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!" aria-haspopup="menu" title="themes"><img src="../../brush.svg" width="18" height="18" alt="Pick another theme!"></button><div id="theme-choices" role="menu"></div></div><nav class="sub"><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press S to search, ? for more options…" type="search"></div><button type="button" id="help-button" title="help">?</button><a id="settings-menu" href="../../settings.html" title="settings"><img src="../../wheel.svg" width="18" height="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><div class="example-wrap"><pre class="line-numbers"><span id="1"> 1</span>
<span id="2"> 2</span>
<span id="3"> 3</span>
<span id="4"> 4</span>
<span id="5"> 5</span>
<span id="6"> 6</span>
<span id="7"> 7</span>
<span id="8"> 8</span>
<span id="9"> 9</span>
<span id="10"> 10</span>
<span id="11"> 11</span>
<span id="12"> 12</span>
<span id="13"> 13</span>
<span id="14"> 14</span>
<span id="15"> 15</span>
<span id="16"> 16</span>
<span id="17"> 17</span>
<span id="18"> 18</span>
<span id="19"> 19</span>
<span id="20"> 20</span>
<span id="21"> 21</span>
<span id="22"> 22</span>
<span id="23"> 23</span>
<span id="24"> 24</span>
<span id="25"> 25</span>
<span id="26"> 26</span>
<span id="27"> 27</span>
<span id="28"> 28</span>
<span id="29"> 29</span>
<span id="30"> 30</span>
<span id="31"> 31</span>
<span id="32"> 32</span>
<span id="33"> 33</span>
<span id="34"> 34</span>
<span id="35"> 35</span>
<span id="36"> 36</span>
<span id="37"> 37</span>
<span id="38"> 38</span>
<span id="39"> 39</span>
<span id="40"> 40</span>
<span id="41"> 41</span>
<span id="42"> 42</span>
<span id="43"> 43</span>
<span id="44"> 44</span>
<span id="45"> 45</span>
<span id="46"> 46</span>
<span id="47"> 47</span>
<span id="48"> 48</span>
<span id="49"> 49</span>
<span id="50"> 50</span>
<span id="51"> 51</span>
<span id="52"> 52</span>
<span id="53"> 53</span>
<span id="54"> 54</span>
<span id="55"> 55</span>
<span id="56"> 56</span>
<span id="57"> 57</span>
<span id="58"> 58</span>
<span id="59"> 59</span>
<span id="60"> 60</span>
<span id="61"> 61</span>
<span id="62"> 62</span>
<span id="63"> 63</span>
<span id="64"> 64</span>
<span id="65"> 65</span>
<span id="66"> 66</span>
<span id="67"> 67</span>
<span id="68"> 68</span>
<span id="69"> 69</span>
<span id="70"> 70</span>
<span id="71"> 71</span>
<span id="72"> 72</span>
<span id="73"> 73</span>
<span id="74"> 74</span>
<span id="75"> 75</span>
<span id="76"> 76</span>
<span id="77"> 77</span>
<span id="78"> 78</span>
<span id="79"> 79</span>
<span id="80"> 80</span>
<span id="81"> 81</span>
<span id="82"> 82</span>
<span id="83"> 83</span>
<span id="84"> 84</span>
<span id="85"> 85</span>
<span id="86"> 86</span>
<span id="87"> 87</span>
<span id="88"> 88</span>
<span id="89"> 89</span>
<span id="90"> 90</span>
<span id="91"> 91</span>
<span id="92"> 92</span>
<span id="93"> 93</span>
<span id="94"> 94</span>
<span id="95"> 95</span>
<span id="96"> 96</span>
<span id="97"> 97</span>
<span id="98"> 98</span>
<span id="99"> 99</span>
<span id="100">100</span>
<span id="101">101</span>
<span id="102">102</span>
<span id="103">103</span>
<span id="104">104</span>
<span id="105">105</span>
<span id="106">106</span>
<span id="107">107</span>
<span id="108">108</span>
<span id="109">109</span>
<span id="110">110</span>
<span id="111">111</span>
<span id="112">112</span>
<span id="113">113</span>
<span id="114">114</span>
<span id="115">115</span>
<span id="116">116</span>
<span id="117">117</span>
<span id="118">118</span>
<span id="119">119</span>
<span id="120">120</span>
<span id="121">121</span>
<span id="122">122</span>
<span id="123">123</span>
<span id="124">124</span>
<span id="125">125</span>
<span id="126">126</span>
<span id="127">127</span>
<span id="128">128</span>
<span id="129">129</span>
<span id="130">130</span>
<span id="131">131</span>
<span id="132">132</span>
<span id="133">133</span>
<span id="134">134</span>
<span id="135">135</span>
<span id="136">136</span>
<span id="137">137</span>
<span id="138">138</span>
<span id="139">139</span>
<span id="140">140</span>
<span id="141">141</span>
<span id="142">142</span>
<span id="143">143</span>
<span id="144">144</span>
<span id="145">145</span>
<span id="146">146</span>
<span id="147">147</span>
<span id="148">148</span>
<span id="149">149</span>
<span id="150">150</span>
<span id="151">151</span>
<span id="152">152</span>
<span id="153">153</span>
<span id="154">154</span>
<span id="155">155</span>
<span id="156">156</span>
<span id="157">157</span>
<span id="158">158</span>
<span id="159">159</span>
<span id="160">160</span>
<span id="161">161</span>
<span id="162">162</span>
<span id="163">163</span>
<span id="164">164</span>
<span id="165">165</span>
<span id="166">166</span>
<span id="167">167</span>
<span id="168">168</span>
<span id="169">169</span>
<span id="170">170</span>
<span id="171">171</span>
<span id="172">172</span>
<span id="173">173</span>
<span id="174">174</span>
<span id="175">175</span>
<span id="176">176</span>
<span id="177">177</span>
<span id="178">178</span>
<span id="179">179</span>
<span id="180">180</span>
<span id="181">181</span>
<span id="182">182</span>
<span id="183">183</span>
<span id="184">184</span>
<span id="185">185</span>
<span id="186">186</span>
<span id="187">187</span>
<span id="188">188</span>
<span id="189">189</span>
<span id="190">190</span>
<span id="191">191</span>
<span id="192">192</span>
<span id="193">193</span>
<span id="194">194</span>
<span id="195">195</span>
<span id="196">196</span>
</pre><pre class="rust">
<span class="comment">// * This file is part of the uutils coreutils package.</span>
<span class="comment">// *</span>
@@ -97,28 +209,115 @@
<span class="kw">use</span> <span class="ident">clap</span>::{<span class="ident">crate_version</span>, <span class="ident">App</span>, <span class="ident">Arg</span>};
<span class="kw">use</span> <span class="ident">std::env</span>;
<span class="kw">use</span> <span class="ident">std::io</span>;
<span class="kw">use</span> <span class="ident">std::io</span>::{<span class="self">self</span>, <span class="ident">Write</span>};
<span class="kw">use</span> <span class="ident">std::path</span>::{<span class="ident">Path</span>, <span class="ident">PathBuf</span>};
<span class="kw">use</span> <span class="ident">uucore::error</span>::{<span class="ident">FromIo</span>, <span class="ident">UResult</span>, <span class="ident">USimpleError</span>};
<span class="kw">use</span> <span class="ident">uucore::error</span>::{<span class="ident">FromIo</span>, <span class="ident">UResult</span>};
<span class="kw">static</span> <span class="ident">ABOUT</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;Display the full filename of the current working directory.&quot;</span>;
<span class="kw">static</span> <span class="ident">OPT_LOGICAL</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;logical&quot;</span>;
<span class="kw">static</span> <span class="ident">OPT_PHYSICAL</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;physical&quot;</span>;
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">absolute_path</span>(<span class="ident">path</span>: <span class="kw-2">&amp;</span><span class="ident">Path</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">io::Result</span><span class="op">&lt;</span><span class="ident">PathBuf</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="ident">path_buf</span> <span class="op">=</span> <span class="ident">path</span>.<span class="ident">canonicalize</span>()<span class="question-mark">?</span>;
<span class="kw">fn</span> <span class="ident">physical_path</span>() <span class="op">-</span><span class="op">&gt;</span> <span class="ident">io::Result</span><span class="op">&lt;</span><span class="ident">PathBuf</span><span class="op">&gt;</span> {
<span class="comment">// std::env::current_dir() is a thin wrapper around libc&#39;s getcwd().</span>
<span class="comment">// On Unix, getcwd() must return the physical path:</span>
<span class="comment">// https://pubs.opengroup.org/onlinepubs/9699919799/functions/getcwd.html</span>
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">unix</span>)]</span>
{
<span class="ident">env::current_dir</span>()
}
<span class="comment">// On Windows we have to resolve it.</span>
<span class="comment">// On other systems we also resolve it, just in case.</span>
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">not</span>(<span class="ident">unix</span>))]</span>
{
<span class="ident">env::current_dir</span>().<span class="ident">and_then</span>(<span class="op">|</span><span class="ident">path</span><span class="op">|</span> <span class="ident">path</span>.<span class="ident">canonicalize</span>())
}
}
<span class="kw">fn</span> <span class="ident">logical_path</span>() <span class="op">-</span><span class="op">&gt;</span> <span class="ident">io::Result</span><span class="op">&lt;</span><span class="ident">PathBuf</span><span class="op">&gt;</span> {
<span class="comment">// getcwd() on Windows seems to include symlinks, so this is easy.</span>
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">windows</span>)]</span>
<span class="kw">let</span> <span class="ident">path_buf</span> <span class="op">=</span> <span class="ident">Path::new</span>(
<span class="ident">path_buf</span>
.<span class="ident">as_path</span>()
.<span class="ident">to_string_lossy</span>()
.<span class="ident">trim_start_matches</span>(<span class="string">r&quot;\\?\&quot;</span>),
)
.<span class="ident">to_path_buf</span>();
{
<span class="ident">env::current_dir</span>()
}
<span class="prelude-val">Ok</span>(<span class="ident">path_buf</span>)
<span class="comment">// If we&#39;re not on Windows we do things Unix-style.</span>
<span class="comment">//</span>
<span class="comment">// Typical Unix-like kernels don&#39;t actually keep track of the logical working</span>
<span class="comment">// directory. They know the precise directory a process is in, and the getcwd()</span>
<span class="comment">// syscall reconstructs a path from that.</span>
<span class="comment">//</span>
<span class="comment">// The logical working directory is maintained by the shell, in the $PWD</span>
<span class="comment">// environment variable. So we check carefully if that variable looks</span>
<span class="comment">// reasonable, and if not then we fall back to the physical path.</span>
<span class="comment">//</span>
<span class="comment">// POSIX: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/pwd.html</span>
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">not</span>(<span class="ident">windows</span>))]</span>
{
<span class="kw">fn</span> <span class="ident">looks_reasonable</span>(<span class="ident">path</span>: <span class="kw-2">&amp;</span><span class="ident">Path</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">bool</span> {
<span class="comment">// First, check if it&#39;s an absolute path.</span>
<span class="kw">if</span> <span class="op">!</span><span class="ident">path</span>.<span class="ident">has_root</span>() {
<span class="kw">return</span> <span class="bool-val">false</span>;
}
<span class="comment">// Then, make sure there are no . or .. components.</span>
<span class="comment">// Path::components() isn&#39;t useful here, it normalizes those out.</span>
<span class="comment">// to_string_lossy() may allocate, but that&#39;s fine, we call this</span>
<span class="comment">// only once per run. It may also lose information, but not any</span>
<span class="comment">// information that we need for this check.</span>
<span class="kw">if</span> <span class="ident">path</span>
.<span class="ident">to_string_lossy</span>()
.<span class="ident">split</span>(<span class="ident">std::path::is_separator</span>)
.<span class="ident">any</span>(<span class="op">|</span><span class="ident">piece</span><span class="op">|</span> <span class="ident">piece</span> <span class="op">=</span><span class="op">=</span> <span class="string">&quot;.&quot;</span> <span class="op">|</span><span class="op">|</span> <span class="ident">piece</span> <span class="op">=</span><span class="op">=</span> <span class="string">&quot;..&quot;</span>)
{
<span class="kw">return</span> <span class="bool-val">false</span>;
}
<span class="comment">// Finally, check if it matches the directory we&#39;re in.</span>
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">unix</span>)]</span>
{
<span class="kw">use</span> <span class="ident">std::fs::metadata</span>;
<span class="kw">use</span> <span class="ident">std::os::unix::fs::MetadataExt</span>;
<span class="kw">let</span> <span class="ident">path_info</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">metadata</span>(<span class="ident">path</span>) {
<span class="prelude-val">Ok</span>(<span class="ident">info</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">info</span>,
<span class="prelude-val">Err</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="kw">return</span> <span class="bool-val">false</span>,
};
<span class="kw">let</span> <span class="ident">real_info</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">metadata</span>(<span class="string">&quot;.&quot;</span>) {
<span class="prelude-val">Ok</span>(<span class="ident">info</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">info</span>,
<span class="prelude-val">Err</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="kw">return</span> <span class="bool-val">false</span>,
};
<span class="kw">if</span> <span class="ident">path_info</span>.<span class="ident">dev</span>() <span class="op">!</span><span class="op">=</span> <span class="ident">real_info</span>.<span class="ident">dev</span>() <span class="op">|</span><span class="op">|</span> <span class="ident">path_info</span>.<span class="ident">ino</span>() <span class="op">!</span><span class="op">=</span> <span class="ident">real_info</span>.<span class="ident">ino</span>() {
<span class="kw">return</span> <span class="bool-val">false</span>;
}
}
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">not</span>(<span class="ident">unix</span>))]</span>
{
<span class="kw">use</span> <span class="ident">std::fs::canonicalize</span>;
<span class="kw">let</span> <span class="ident">canon_path</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">canonicalize</span>(<span class="ident">path</span>) {
<span class="prelude-val">Ok</span>(<span class="ident">path</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">path</span>,
<span class="prelude-val">Err</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="kw">return</span> <span class="bool-val">false</span>,
};
<span class="kw">let</span> <span class="ident">real_path</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">canonicalize</span>(<span class="string">&quot;.&quot;</span>) {
<span class="prelude-val">Ok</span>(<span class="ident">path</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">path</span>,
<span class="prelude-val">Err</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="kw">return</span> <span class="bool-val">false</span>,
};
<span class="kw">if</span> <span class="ident">canon_path</span> <span class="op">!</span><span class="op">=</span> <span class="ident">real_path</span> {
<span class="kw">return</span> <span class="bool-val">false</span>;
}
}
<span class="bool-val">true</span>
}
<span class="kw">match</span> <span class="ident">env::var_os</span>(<span class="string">&quot;PWD&quot;</span>).<span class="ident">map</span>(<span class="ident">PathBuf::from</span>) {
<span class="prelude-val">Some</span>(<span class="ident">value</span>) <span class="kw">if</span> <span class="ident">looks_reasonable</span>(<span class="kw-2">&amp;</span><span class="ident">value</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="prelude-val">Ok</span>(<span class="ident">value</span>),
<span class="kw">_</span> <span class="op">=</span><span class="op">&gt;</span> <span class="ident">env::current_dir</span>(),
}
}
}
<span class="kw">fn</span> <span class="ident">usage</span>() <span class="op">-</span><span class="op">&gt;</span> <span class="ident">String</span> {
@@ -130,24 +329,48 @@
<span class="kw">let</span> <span class="ident">usage</span> <span class="op">=</span> <span class="ident">usage</span>();
<span class="kw">let</span> <span class="ident">matches</span> <span class="op">=</span> <span class="ident">uu_app</span>().<span class="ident">usage</span>(<span class="kw-2">&amp;</span><span class="ident">usage</span>[..]).<span class="ident">get_matches_from</span>(<span class="ident">args</span>);
<span class="kw">let</span> <span class="ident">cwd</span> <span class="op">=</span> <span class="kw">if</span> <span class="ident">matches</span>.<span class="ident">is_present</span>(<span class="ident">OPT_LOGICAL</span>) {
<span class="ident">logical_path</span>()
} <span class="kw">else</span> {
<span class="ident">physical_path</span>()
}
.<span class="ident">map_err_context</span>(<span class="op">|</span><span class="op">|</span> <span class="string">&quot;failed to get current directory&quot;</span>.<span class="ident">to_owned</span>())<span class="question-mark">?</span>;
<span class="kw">match</span> <span class="ident">env::current_dir</span>() {
<span class="prelude-val">Ok</span>(<span class="ident">logical_path</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="kw">if</span> <span class="ident">matches</span>.<span class="ident">is_present</span>(<span class="ident">OPT_LOGICAL</span>) {
<span class="macro">println!</span>(<span class="string">&quot;{}&quot;</span>, <span class="ident">logical_path</span>.<span class="ident">display</span>());
} <span class="kw">else</span> {
<span class="kw">let</span> <span class="ident">physical_path</span> <span class="op">=</span> <span class="ident">absolute_path</span>(<span class="kw-2">&amp;</span><span class="ident">logical_path</span>)
.<span class="ident">map_err_context</span>(<span class="op">|</span><span class="op">|</span> <span class="string">&quot;failed to get absolute path&quot;</span>.<span class="ident">to_string</span>())<span class="question-mark">?</span>;
<span class="macro">println!</span>(<span class="string">&quot;{}&quot;</span>, <span class="ident">physical_path</span>.<span class="ident">display</span>());
}
}
<span class="prelude-val">Err</span>(<span class="ident">e</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">USimpleError::new</span>(
<span class="number">1</span>,
<span class="macro">format!</span>(<span class="string">&quot;failed to get current directory {}&quot;</span>, <span class="ident">e</span>),
))
}
};
<span class="comment">// \\?\ is a prefix Windows gives to paths under certain circumstances,</span>
<span class="comment">// including when canonicalizing them.</span>
<span class="comment">// With the right extension trait we can remove it non-lossily, but</span>
<span class="comment">// we print it lossily anyway, so no reason to bother.</span>
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">windows</span>)]</span>
<span class="kw">let</span> <span class="ident">cwd</span> <span class="op">=</span> <span class="ident">cwd</span>
.<span class="ident">to_string_lossy</span>()
.<span class="ident">strip_prefix</span>(<span class="string">r&quot;\\?\&quot;</span>)
.<span class="ident">map</span>(<span class="ident">Into::into</span>)
.<span class="ident">unwrap_or</span>(<span class="ident">cwd</span>);
<span class="ident">print_path</span>(<span class="kw-2">&amp;</span><span class="ident">cwd</span>).<span class="ident">map_err_context</span>(<span class="op">|</span><span class="op">|</span> <span class="string">&quot;failed to print current directory&quot;</span>.<span class="ident">to_owned</span>())<span class="question-mark">?</span>;
<span class="prelude-val">Ok</span>(())
}
<span class="kw">fn</span> <span class="ident">print_path</span>(<span class="ident">path</span>: <span class="kw-2">&amp;</span><span class="ident">Path</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">io::Result</span><span class="op">&lt;</span>()<span class="op">&gt;</span> {
<span class="kw">let</span> <span class="ident">stdout</span> <span class="op">=</span> <span class="ident">io::stdout</span>();
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">stdout</span> <span class="op">=</span> <span class="ident">stdout</span>.<span class="ident">lock</span>();
<span class="comment">// On Unix we print non-lossily.</span>
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">unix</span>)]</span>
{
<span class="kw">use</span> <span class="ident">std::os::unix::ffi::OsStrExt</span>;
<span class="ident">stdout</span>.<span class="ident">write_all</span>(<span class="ident">path</span>.<span class="ident">as_os_str</span>().<span class="ident">as_bytes</span>())<span class="question-mark">?</span>;
<span class="ident">stdout</span>.<span class="ident">write_all</span>(<span class="string">b&quot;\n&quot;</span>)<span class="question-mark">?</span>;
}
<span class="comment">// On other platforms we potentially mangle it.</span>
<span class="comment">// There might be some clever way to do it correctly on Windows, but</span>
<span class="comment">// invalid unicode in filenames is rare there.</span>
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">not</span>(<span class="ident">unix</span>))]</span>
{
<span class="macro">writeln!</span>(<span class="ident">stdout</span>, <span class="string">&quot;{}&quot;</span>, <span class="ident">path</span>.<span class="ident">display</span>())<span class="question-mark">?</span>;
}
<span class="prelude-val">Ok</span>(())
}
@@ -166,6 +389,7 @@
<span class="ident">Arg::with_name</span>(<span class="ident">OPT_PHYSICAL</span>)
.<span class="ident">short</span>(<span class="string">&quot;P&quot;</span>)
.<span class="ident">long</span>(<span class="ident">OPT_PHYSICAL</span>)
.<span class="ident">overrides_with</span>(<span class="ident">OPT_LOGICAL</span>)
.<span class="ident">help</span>(<span class="string">&quot;avoid all symlinks&quot;</span>),
)
}
+99 -15
View File
@@ -274,6 +274,48 @@
<span id="272">272</span>
<span id="273">273</span>
<span id="274">274</span>
<span id="275">275</span>
<span id="276">276</span>
<span id="277">277</span>
<span id="278">278</span>
<span id="279">279</span>
<span id="280">280</span>
<span id="281">281</span>
<span id="282">282</span>
<span id="283">283</span>
<span id="284">284</span>
<span id="285">285</span>
<span id="286">286</span>
<span id="287">287</span>
<span id="288">288</span>
<span id="289">289</span>
<span id="290">290</span>
<span id="291">291</span>
<span id="292">292</span>
<span id="293">293</span>
<span id="294">294</span>
<span id="295">295</span>
<span id="296">296</span>
<span id="297">297</span>
<span id="298">298</span>
<span id="299">299</span>
<span id="300">300</span>
<span id="301">301</span>
<span id="302">302</span>
<span id="303">303</span>
<span id="304">304</span>
<span id="305">305</span>
<span id="306">306</span>
<span id="307">307</span>
<span id="308">308</span>
<span id="309">309</span>
<span id="310">310</span>
<span id="311">311</span>
<span id="312">312</span>
<span id="313">313</span>
<span id="314">314</span>
<span id="315">315</span>
<span id="316">316</span>
</pre><pre class="rust">
<span class="comment">// TODO: Make -w flag work with decimals</span>
<span class="comment">// TODO: Support -f flag</span>
@@ -315,6 +357,8 @@
}
<span class="kw">enum</span> <span class="ident">Number</span> {
<span class="doccomment">/// Negative zero, as if it were an integer.</span>
<span class="ident">MinusZero</span>,
<span class="ident">BigInt</span>(<span class="ident">BigInt</span>),
<span class="ident">F64</span>(<span class="ident">f64</span>),
}
@@ -322,6 +366,7 @@
<span class="kw">impl</span> <span class="ident">Number</span> {
<span class="kw">fn</span> <span class="ident">is_zero</span>(<span class="kw-2">&amp;</span><span class="self">self</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">bool</span> {
<span class="kw">match</span> <span class="self">self</span> {
<span class="ident">Number::MinusZero</span> <span class="op">=</span><span class="op">&gt;</span> <span class="bool-val">true</span>,
<span class="ident">Number::BigInt</span>(<span class="ident">n</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">n</span>.<span class="ident">is_zero</span>(),
<span class="ident">Number::F64</span>(<span class="ident">n</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">n</span>.<span class="ident">is_zero</span>(),
}
@@ -329,6 +374,7 @@
<span class="kw">fn</span> <span class="ident">into_f64</span>(<span class="self">self</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">f64</span> {
<span class="kw">match</span> <span class="self">self</span> {
<span class="ident">Number::MinusZero</span> <span class="op">=</span><span class="op">&gt;</span> <span class="op">-</span><span class="number">0.</span>,
<span class="comment">// BigInt::to_f64() can not return None.</span>
<span class="ident">Number::BigInt</span>(<span class="ident">n</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">n</span>.<span class="ident">to_f64</span>().<span class="ident">unwrap</span>(),
<span class="ident">Number::F64</span>(<span class="ident">n</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">n</span>,
@@ -344,7 +390,16 @@
}
<span class="kw">match</span> <span class="ident">s</span>.<span class="ident">parse</span>::<span class="op">&lt;</span><span class="ident">BigInt</span><span class="op">&gt;</span>() {
<span class="prelude-val">Ok</span>(<span class="ident">n</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="prelude-val">Ok</span>(<span class="ident">Number::BigInt</span>(<span class="ident">n</span>)),
<span class="prelude-val">Ok</span>(<span class="ident">n</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="comment">// If `s` is &#39;-0&#39;, then `parse()` returns</span>
<span class="comment">// `BigInt::zero()`, but we need to return</span>
<span class="comment">// `Number::MinusZero` instead.</span>
<span class="kw">if</span> <span class="ident">n</span> <span class="op">=</span><span class="op">=</span> <span class="ident">BigInt::zero</span>() <span class="op">&amp;&amp;</span> <span class="ident">s</span>.<span class="ident">starts_with</span>(<span class="string">&#39;-&#39;</span>) {
<span class="prelude-val">Ok</span>(<span class="ident">Number::MinusZero</span>)
} <span class="kw">else</span> {
<span class="prelude-val">Ok</span>(<span class="ident">Number::BigInt</span>(<span class="ident">n</span>))
}
}
<span class="prelude-val">Err</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="kw">match</span> <span class="ident">s</span>.<span class="ident">parse</span>::<span class="op">&lt;</span><span class="ident">f64</span><span class="op">&gt;</span>() {
<span class="prelude-val">Ok</span>(<span class="ident">value</span>) <span class="kw">if</span> <span class="ident">value</span>.<span class="ident">is_nan</span>() <span class="op">=</span><span class="op">&gt;</span> <span class="prelude-val">Err</span>(<span class="macro">format!</span>(
<span class="string">&quot;invalid &#39;not-a-number&#39; argument: &#39;{}&#39;\nTry &#39;{} --help&#39; for more information.&quot;</span>,
@@ -362,6 +417,16 @@
}
}
<span class="doccomment">/// A range of integers.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// The elements are (first, increment, last).</span>
<span class="kw">type</span> <span class="ident">RangeInt</span> <span class="op">=</span> (<span class="ident">BigInt</span>, <span class="ident">BigInt</span>, <span class="ident">BigInt</span>);
<span class="doccomment">/// A range of f64.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// The elements are (first, increment, last).</span>
<span class="kw">type</span> <span class="ident">RangeF64</span> <span class="op">=</span> (<span class="ident">f64</span>, <span class="ident">f64</span>, <span class="ident">f64</span>);
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">uumain</span>(<span class="ident">args</span>: <span class="kw">impl</span> <span class="ident">uucore::Args</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">i32</span> {
<span class="kw">let</span> <span class="ident">usage</span> <span class="op">=</span> <span class="ident">usage</span>();
<span class="kw">let</span> <span class="ident">matches</span> <span class="op">=</span> <span class="ident">uu_app</span>().<span class="ident">usage</span>(<span class="kw-2">&amp;</span><span class="ident">usage</span>[..]).<span class="ident">get_matches_from</span>(<span class="ident">args</span>);
@@ -414,21 +479,26 @@
}
<span class="kw">match</span> (<span class="ident">first</span>, <span class="ident">last</span>, <span class="ident">increment</span>) {
(<span class="ident">Number::MinusZero</span>, <span class="ident">Number::BigInt</span>(<span class="ident">last</span>), <span class="ident">Number::BigInt</span>(<span class="ident">increment</span>)) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">print_seq_integers</span>(
(<span class="ident">BigInt::zero</span>(), <span class="ident">increment</span>, <span class="ident">last</span>),
<span class="ident">options</span>.<span class="ident">separator</span>,
<span class="ident">options</span>.<span class="ident">terminator</span>,
<span class="ident">options</span>.<span class="ident">widths</span>,
<span class="ident">padding</span>,
<span class="bool-val">true</span>,
),
(<span class="ident">Number::BigInt</span>(<span class="ident">first</span>), <span class="ident">Number::BigInt</span>(<span class="ident">last</span>), <span class="ident">Number::BigInt</span>(<span class="ident">increment</span>)) <span class="op">=</span><span class="op">&gt;</span> {
<span class="ident">print_seq_integers</span>(
<span class="ident">first</span>,
<span class="ident">increment</span>,
<span class="ident">last</span>,
(<span class="ident">first</span>, <span class="ident">increment</span>, <span class="ident">last</span>),
<span class="ident">options</span>.<span class="ident">separator</span>,
<span class="ident">options</span>.<span class="ident">terminator</span>,
<span class="ident">options</span>.<span class="ident">widths</span>,
<span class="ident">padding</span>,
<span class="bool-val">false</span>,
)
}
(<span class="ident">first</span>, <span class="ident">last</span>, <span class="ident">increment</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">print_seq</span>(
<span class="ident">first</span>.<span class="ident">into_f64</span>(),
<span class="ident">increment</span>.<span class="ident">into_f64</span>(),
<span class="ident">last</span>.<span class="ident">into_f64</span>(),
(<span class="ident">first</span>.<span class="ident">into_f64</span>(), <span class="ident">increment</span>.<span class="ident">into_f64</span>(), <span class="ident">last</span>.<span class="ident">into_f64</span>()),
<span class="ident">largest_dec</span>,
<span class="ident">options</span>.<span class="ident">separator</span>,
<span class="ident">options</span>.<span class="ident">terminator</span>,
@@ -485,17 +555,15 @@
}
<span class="doccomment">/// Floating point based code path</span>
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">clippy::too_many_arguments</span>)]</span>
<span class="kw">fn</span> <span class="ident">print_seq</span>(
<span class="ident">first</span>: <span class="ident">f64</span>,
<span class="ident">increment</span>: <span class="ident">f64</span>,
<span class="ident">last</span>: <span class="ident">f64</span>,
<span class="ident">range</span>: <span class="ident">RangeF64</span>,
<span class="ident">largest_dec</span>: <span class="ident">usize</span>,
<span class="ident">separator</span>: <span class="ident">String</span>,
<span class="ident">terminator</span>: <span class="ident">String</span>,
<span class="ident">pad</span>: <span class="ident">bool</span>,
<span class="ident">padding</span>: <span class="ident">usize</span>,
) {
<span class="kw">let</span> (<span class="ident">first</span>, <span class="ident">increment</span>, <span class="ident">last</span>) <span class="op">=</span> <span class="ident">range</span>;
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">i</span> <span class="op">=</span> <span class="number">0isize</span>;
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">value</span> <span class="op">=</span> <span class="ident">first</span> <span class="op">+</span> <span class="ident">i</span> <span class="kw">as</span> <span class="ident">f64</span> <span class="op">*</span> <span class="ident">increment</span>;
<span class="kw">while</span> <span class="op">!</span><span class="ident">done_printing</span>(<span class="kw-2">&amp;</span><span class="ident">value</span>, <span class="kw-2">&amp;</span><span class="ident">increment</span>, <span class="kw-2">&amp;</span><span class="ident">last</span>) {
@@ -520,22 +588,38 @@
<span class="macro">crash_if_err!</span>(<span class="number">1</span>, <span class="ident">stdout</span>().<span class="ident">flush</span>());
}
<span class="doccomment">/// BigInt based code path</span>
<span class="doccomment">/// Print an integer sequence.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// This function prints a sequence of integers defined by `range`,</span>
<span class="doccomment">/// which defines the first integer, last integer, and increment of the</span>
<span class="doccomment">/// range. The `separator` is inserted between each integer and</span>
<span class="doccomment">/// `terminator` is inserted at the end.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// The `pad` parameter indicates whether to pad numbers to the width</span>
<span class="doccomment">/// given in `padding`.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// If `is_first_minus_zero` is `true`, then the `first` parameter is</span>
<span class="doccomment">/// printed as if it were negative zero, even though no such number</span>
<span class="doccomment">/// exists as an integer (negative zero only exists for floating point</span>
<span class="doccomment">/// numbers). Only set this to `true` if `first` is actually zero.</span>
<span class="kw">fn</span> <span class="ident">print_seq_integers</span>(
<span class="ident">first</span>: <span class="ident">BigInt</span>,
<span class="ident">increment</span>: <span class="ident">BigInt</span>,
<span class="ident">last</span>: <span class="ident">BigInt</span>,
<span class="ident">range</span>: <span class="ident">RangeInt</span>,
<span class="ident">separator</span>: <span class="ident">String</span>,
<span class="ident">terminator</span>: <span class="ident">String</span>,
<span class="ident">pad</span>: <span class="ident">bool</span>,
<span class="ident">padding</span>: <span class="ident">usize</span>,
<span class="ident">is_first_minus_zero</span>: <span class="ident">bool</span>,
) {
<span class="kw">let</span> (<span class="ident">first</span>, <span class="ident">increment</span>, <span class="ident">last</span>) <span class="op">=</span> <span class="ident">range</span>;
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">value</span> <span class="op">=</span> <span class="ident">first</span>;
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">is_first_iteration</span> <span class="op">=</span> <span class="bool-val">true</span>;
<span class="kw">while</span> <span class="op">!</span><span class="ident">done_printing</span>(<span class="kw-2">&amp;</span><span class="ident">value</span>, <span class="kw-2">&amp;</span><span class="ident">increment</span>, <span class="kw-2">&amp;</span><span class="ident">last</span>) {
<span class="kw">if</span> <span class="op">!</span><span class="ident">is_first_iteration</span> {
<span class="macro">print!</span>(<span class="string">&quot;{}&quot;</span>, <span class="ident">separator</span>);
}
<span class="kw">if</span> <span class="ident">is_first_iteration</span> <span class="op">&amp;&amp;</span> <span class="ident">is_first_minus_zero</span> {
<span class="macro">print!</span>(<span class="string">&quot;-&quot;</span>);
}
<span class="ident">is_first_iteration</span> <span class="op">=</span> <span class="bool-val">false</span>;
<span class="kw">if</span> <span class="ident">pad</span> {
<span class="macro">print!</span>(<span class="string">&quot;{number:&gt;0width$}&quot;</span>, <span class="ident">number</span> <span class="op">=</span> <span class="ident">value</span>, <span class="ident">width</span> <span class="op">=</span> <span class="ident">padding</span>);
+46 -18
View File
@@ -442,6 +442,20 @@
<span id="440">440</span>
<span id="441">441</span>
<span id="442">442</span>
<span id="443">443</span>
<span id="444">444</span>
<span id="445">445</span>
<span id="446">446</span>
<span id="447">447</span>
<span id="448">448</span>
<span id="449">449</span>
<span id="450">450</span>
<span id="451">451</span>
<span id="452">452</span>
<span id="453">453</span>
<span id="454">454</span>
<span id="455">455</span>
<span id="456">456</span>
</pre><pre class="rust">
<span class="comment">// This file is part of the uutils coreutils package.</span>
<span class="comment">//</span>
@@ -462,6 +476,7 @@
<span class="kw">use</span> <span class="ident">std::borrow::Cow</span>;
<span class="kw">use</span> <span class="ident">std::env</span>;
<span class="kw">use</span> <span class="ident">std::fs</span>;
<span class="kw">use</span> <span class="ident">std::io::Error</span> <span class="kw">as</span> <span class="ident">IOError</span>;
<span class="kw">use</span> <span class="ident">std::io::Result</span> <span class="kw">as</span> <span class="ident">IOResult</span>;
<span class="kw">use</span> <span class="ident">std::io</span>::{<span class="ident">Error</span>, <span class="ident">ErrorKind</span>};
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">any</span>(<span class="ident">unix</span>, <span class="ident">target_os</span> <span class="op">=</span> <span class="string">&quot;redox&quot;</span>))]</span>
@@ -556,26 +571,42 @@
<span class="ident">ret</span>
}
<span class="kw">fn</span> <span class="ident">resolve</span><span class="op">&lt;</span><span class="ident">P</span>: <span class="ident">AsRef</span><span class="op">&lt;</span><span class="ident">Path</span><span class="op">&gt;</span><span class="op">&gt;</span>(<span class="ident">original</span>: <span class="ident">P</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">IOResult</span><span class="op">&lt;</span><span class="ident">PathBuf</span><span class="op">&gt;</span> {
<span class="kw">fn</span> <span class="ident">resolve</span><span class="op">&lt;</span><span class="ident">P</span>: <span class="ident">AsRef</span><span class="op">&lt;</span><span class="ident">Path</span><span class="op">&gt;</span><span class="op">&gt;</span>(<span class="ident">original</span>: <span class="ident">P</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">PathBuf</span>, (<span class="ident">PathBuf</span>, <span class="ident">IOError</span>)<span class="op">&gt;</span> {
<span class="kw">const</span> <span class="ident">MAX_LINKS_FOLLOWED</span>: <span class="ident">u32</span> <span class="op">=</span> <span class="number">255</span>;
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">followed</span> <span class="op">=</span> <span class="number">0</span>;
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">result</span> <span class="op">=</span> <span class="ident">original</span>.<span class="ident">as_ref</span>().<span class="ident">to_path_buf</span>();
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">first_resolution</span> <span class="op">=</span> <span class="prelude-val">None</span>;
<span class="kw">loop</span> {
<span class="kw">if</span> <span class="ident">followed</span> <span class="op">=</span><span class="op">=</span> <span class="ident">MAX_LINKS_FOLLOWED</span> {
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">Error::new</span>(
<span class="ident">ErrorKind::InvalidInput</span>,
<span class="string">&quot;maximum links followed&quot;</span>,
<span class="kw">return</span> <span class="prelude-val">Err</span>((
<span class="comment">// When we hit MAX_LINKS_FOLLOWED we should return the first resolution (that&#39;s what GNU does - for whatever reason)</span>
<span class="ident">first_resolution</span>.<span class="ident">unwrap</span>(),
<span class="ident">Error::new</span>(<span class="ident">ErrorKind::InvalidInput</span>, <span class="string">&quot;maximum links followed&quot;</span>),
));
}
<span class="kw">if</span> <span class="op">!</span><span class="ident">fs::symlink_metadata</span>(<span class="kw-2">&amp;</span><span class="ident">result</span>)<span class="question-mark">?</span>.<span class="ident">file_type</span>().<span class="ident">is_symlink</span>() {
<span class="kw">break</span>;
<span class="kw">match</span> <span class="ident">fs::symlink_metadata</span>(<span class="kw-2">&amp;</span><span class="ident">result</span>) {
<span class="prelude-val">Ok</span>(<span class="ident">meta</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="kw">if</span> <span class="op">!</span><span class="ident">meta</span>.<span class="ident">file_type</span>().<span class="ident">is_symlink</span>() {
<span class="kw">break</span>;
}
}
<span class="prelude-val">Err</span>(<span class="ident">e</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="kw">return</span> <span class="prelude-val">Err</span>((<span class="ident">result</span>, <span class="ident">e</span>)),
}
<span class="ident">followed</span> <span class="op">+</span><span class="op">=</span> <span class="number">1</span>;
<span class="kw">let</span> <span class="ident">path</span> <span class="op">=</span> <span class="ident">fs::read_link</span>(<span class="kw-2">&amp;</span><span class="ident">result</span>)<span class="question-mark">?</span>;
<span class="ident">result</span>.<span class="ident">pop</span>();
<span class="ident">result</span>.<span class="ident">push</span>(<span class="ident">path</span>);
<span class="kw">match</span> <span class="ident">fs::read_link</span>(<span class="kw-2">&amp;</span><span class="ident">result</span>) {
<span class="prelude-val">Ok</span>(<span class="ident">path</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="ident">result</span>.<span class="ident">pop</span>();
<span class="ident">result</span>.<span class="ident">push</span>(<span class="ident">path</span>);
}
<span class="prelude-val">Err</span>(<span class="ident">e</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="kw">return</span> <span class="prelude-val">Err</span>((<span class="ident">result</span>, <span class="ident">e</span>)),
}
<span class="kw">if</span> <span class="ident">first_resolution</span>.<span class="ident">is_none</span>() {
<span class="ident">first_resolution</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">result</span>.<span class="ident">clone</span>());
}
}
<span class="prelude-val">Ok</span>(<span class="ident">result</span>)
}
@@ -661,11 +692,10 @@
}
<span class="kw">match</span> <span class="ident">resolve</span>(<span class="kw-2">&amp;</span><span class="ident">result</span>) {
<span class="prelude-val">Err</span>(<span class="kw">_</span>) <span class="kw">if</span> <span class="ident">miss_mode</span> <span class="op">=</span><span class="op">=</span> <span class="ident">MissingHandling::Missing</span> <span class="op">=</span><span class="op">&gt;</span> <span class="kw">continue</span>,
<span class="prelude-val">Err</span>(<span class="ident">e</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">e</span>),
<span class="prelude-val">Err</span>((<span class="ident">path</span>, <span class="kw">_</span>)) <span class="kw">if</span> <span class="ident">miss_mode</span> <span class="op">=</span><span class="op">=</span> <span class="ident">MissingHandling::Missing</span> <span class="op">=</span><span class="op">&gt;</span> <span class="ident">result</span> <span class="op">=</span> <span class="ident">path</span>,
<span class="prelude-val">Err</span>((<span class="kw">_</span>, <span class="ident">e</span>)) <span class="op">=</span><span class="op">&gt;</span> <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">e</span>),
<span class="prelude-val">Ok</span>(<span class="ident">path</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="ident">result</span>.<span class="ident">pop</span>();
<span class="ident">result</span>.<span class="ident">push</span>(<span class="ident">path</span>);
<span class="ident">result</span> <span class="op">=</span> <span class="ident">path</span>;
}
}
}
@@ -677,14 +707,12 @@
}
<span class="kw">match</span> <span class="ident">resolve</span>(<span class="kw-2">&amp;</span><span class="ident">result</span>) {
<span class="prelude-val">Err</span>(<span class="ident">e</span>) <span class="kw">if</span> <span class="ident">miss_mode</span> <span class="op">=</span><span class="op">=</span> <span class="ident">MissingHandling::Existing</span> <span class="op">=</span><span class="op">&gt;</span> {
<span class="prelude-val">Err</span>((<span class="kw">_</span>, <span class="ident">e</span>)) <span class="kw">if</span> <span class="ident">miss_mode</span> <span class="op">=</span><span class="op">=</span> <span class="ident">MissingHandling::Existing</span> <span class="op">=</span><span class="op">&gt;</span> {
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">e</span>);
}
<span class="prelude-val">Ok</span>(<span class="ident">path</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="ident">result</span>.<span class="ident">pop</span>();
<span class="ident">result</span>.<span class="ident">push</span>(<span class="ident">path</span>);
<span class="prelude-val">Ok</span>(<span class="ident">path</span>) <span class="op">|</span> <span class="prelude-val">Err</span>((<span class="ident">path</span>, <span class="kw">_</span>)) <span class="op">=</span><span class="op">&gt;</span> {
<span class="ident">result</span> <span class="op">=</span> <span class="ident">path</span>;
}
<span class="prelude-val">Err</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">&gt;</span> (),
}
<span class="kw">if</span> <span class="ident">res_mode</span> <span class="op">=</span><span class="op">=</span> <span class="ident">ResolveMode::Physical</span> {
<span class="ident">result</span> <span class="op">=</span> <span class="ident">normalize_path</span>(<span class="kw-2">&amp;</span><span class="ident">result</span>);
+59 -41
View File
@@ -162,6 +162,15 @@
<span id="160">160</span>
<span id="161">161</span>
<span id="162">162</span>
<span id="163">163</span>
<span id="164">164</span>
<span id="165">165</span>
<span id="166">166</span>
<span id="167">167</span>
<span id="168">168</span>
<span id="169">169</span>
<span id="170">170</span>
<span id="171">171</span>
</pre><pre class="rust">
<span class="comment">// This file is part of the uutils coreutils package.</span>
<span class="comment">//</span>
@@ -174,59 +183,64 @@
<span class="comment">// spell-checker:ignore (vars) fperm srwx</span>
<span class="kw">use</span> <span class="ident">libc</span>::{<span class="ident">mode_t</span>, <span class="ident">S_IRGRP</span>, <span class="ident">S_IROTH</span>, <span class="ident">S_IRUSR</span>, <span class="ident">S_IWGRP</span>, <span class="ident">S_IWOTH</span>, <span class="ident">S_IWUSR</span>};
<span class="kw">use</span> <span class="ident">libc</span>::{<span class="ident">mode_t</span>, <span class="ident">umask</span>, <span class="ident">S_IRGRP</span>, <span class="ident">S_IROTH</span>, <span class="ident">S_IRUSR</span>, <span class="ident">S_IWGRP</span>, <span class="ident">S_IWOTH</span>, <span class="ident">S_IWUSR</span>};
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">parse_numeric</span>(<span class="ident">fperm</span>: <span class="ident">u32</span>, <span class="kw-2">mut</span> <span class="ident">mode</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">u32</span>, <span class="ident">String</span><span class="op">&gt;</span> {
<span class="kw">let</span> (<span class="ident">op</span>, <span class="ident">pos</span>) <span class="op">=</span> <span class="ident">parse_op</span>(<span class="ident">mode</span>, <span class="prelude-val">Some</span>(<span class="string">&#39;=&#39;</span>))<span class="question-mark">?</span>;
<span class="ident">mode</span> <span class="op">=</span> <span class="ident">mode</span>[<span class="ident">pos</span>..].<span class="ident">trim</span>().<span class="ident">trim_start_matches</span>(<span class="string">&#39;0&#39;</span>);
<span class="kw">if</span> <span class="ident">mode</span>.<span class="ident">len</span>() <span class="op">&gt;</span> <span class="number">4</span> {
<span class="prelude-val">Err</span>(<span class="macro">format!</span>(<span class="string">&quot;mode is too large ({} &gt; 7777)&quot;</span>, <span class="ident">mode</span>))
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">parse_numeric</span>(<span class="ident">fperm</span>: <span class="ident">u32</span>, <span class="kw-2">mut</span> <span class="ident">mode</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>, <span class="ident">considering_dir</span>: <span class="ident">bool</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">u32</span>, <span class="ident">String</span><span class="op">&gt;</span> {
<span class="kw">let</span> (<span class="ident">op</span>, <span class="ident">pos</span>) <span class="op">=</span> <span class="ident">parse_op</span>(<span class="ident">mode</span>).<span class="ident">map_or_else</span>(<span class="op">|</span><span class="kw">_</span><span class="op">|</span> (<span class="prelude-val">None</span>, <span class="number">0</span>), <span class="op">|</span>(<span class="ident">op</span>, <span class="ident">pos</span>)<span class="op">|</span> (<span class="prelude-val">Some</span>(<span class="ident">op</span>), <span class="ident">pos</span>));
<span class="ident">mode</span> <span class="op">=</span> <span class="ident">mode</span>[<span class="ident">pos</span>..].<span class="ident">trim</span>();
<span class="kw">let</span> <span class="ident">change</span> <span class="op">=</span> <span class="kw">if</span> <span class="ident">mode</span>.<span class="ident">is_empty</span>() {
<span class="number">0</span>
} <span class="kw">else</span> {
<span class="kw">match</span> <span class="ident">u32::from_str_radix</span>(<span class="ident">mode</span>, <span class="number">8</span>) {
<span class="prelude-val">Ok</span>(<span class="ident">change</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="prelude-val">Ok</span>(<span class="kw">match</span> <span class="ident">op</span> {
<span class="string">&#39;+&#39;</span> <span class="op">=</span><span class="op">&gt;</span> <span class="ident">fperm</span> <span class="op">|</span> <span class="ident">change</span>,
<span class="string">&#39;-&#39;</span> <span class="op">=</span><span class="op">&gt;</span> <span class="ident">fperm</span> <span class="op">&amp;</span> <span class="op">!</span><span class="ident">change</span>,
<span class="string">&#39;=&#39;</span> <span class="op">=</span><span class="op">&gt;</span> <span class="ident">change</span>,
<span class="kw">_</span> <span class="op">=</span><span class="op">&gt;</span> <span class="macro">unreachable!</span>(),
}),
<span class="prelude-val">Err</span>(<span class="ident">err</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="prelude-val">Err</span>(<span class="ident">err</span>.<span class="ident">to_string</span>()),
}
<span class="ident">u32::from_str_radix</span>(<span class="ident">mode</span>, <span class="number">8</span>).<span class="ident">map_err</span>(<span class="op">|</span><span class="ident">e</span><span class="op">|</span> <span class="ident">e</span>.<span class="ident">to_string</span>())<span class="question-mark">?</span>
};
<span class="kw">if</span> <span class="ident">change</span> <span class="op">&gt;</span> <span class="number">0o7777</span> {
<span class="prelude-val">Err</span>(<span class="macro">format!</span>(<span class="string">&quot;mode is too large ({} &gt; 7777&quot;</span>, <span class="ident">change</span>))
} <span class="kw">else</span> {
<span class="prelude-val">Ok</span>(<span class="kw">match</span> <span class="ident">op</span> {
<span class="prelude-val">Some</span>(<span class="string">&#39;+&#39;</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">fperm</span> <span class="op">|</span> <span class="ident">change</span>,
<span class="prelude-val">Some</span>(<span class="string">&#39;-&#39;</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">fperm</span> <span class="op">&amp;</span> <span class="op">!</span><span class="ident">change</span>,
<span class="comment">// If this is a directory, we keep the setgid and setuid bits,</span>
<span class="comment">// unless the mode contains 5 or more octal digits or the mode is &quot;=&quot;</span>
<span class="prelude-val">None</span> <span class="kw">if</span> <span class="ident">considering_dir</span> <span class="op">&amp;&amp;</span> <span class="ident">mode</span>.<span class="ident">len</span>() <span class="op">&lt;</span> <span class="number">5</span> <span class="op">=</span><span class="op">&gt;</span> <span class="ident">change</span> <span class="op">|</span> (<span class="ident">fperm</span> <span class="op">&amp;</span> (<span class="number">0o4000</span> <span class="op">|</span> <span class="number">0o2000</span>)),
<span class="prelude-val">None</span> <span class="op">|</span> <span class="prelude-val">Some</span>(<span class="string">&#39;=&#39;</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">change</span>,
<span class="prelude-val">Some</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="macro">unreachable!</span>(),
})
}
}
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">parse_symbolic</span>(
<span class="kw-2">mut</span> <span class="ident">fperm</span>: <span class="ident">u32</span>,
<span class="kw-2">mut</span> <span class="ident">mode</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>,
<span class="ident">umask</span>: <span class="ident">u32</span>,
<span class="ident">considering_dir</span>: <span class="ident">bool</span>,
) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">u32</span>, <span class="ident">String</span><span class="op">&gt;</span> {
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">unix</span>)]</span>
<span class="kw">use</span> <span class="ident">libc::umask</span>;
<span class="kw">let</span> (<span class="ident">mask</span>, <span class="ident">pos</span>) <span class="op">=</span> <span class="ident">parse_levels</span>(<span class="ident">mode</span>);
<span class="kw">if</span> <span class="ident">pos</span> <span class="op">=</span><span class="op">=</span> <span class="ident">mode</span>.<span class="ident">len</span>() {
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="macro">format!</span>(<span class="string">&quot;invalid mode ({})&quot;</span>, <span class="ident">mode</span>));
}
<span class="kw">let</span> <span class="ident">respect_umask</span> <span class="op">=</span> <span class="ident">pos</span> <span class="op">=</span><span class="op">=</span> <span class="number">0</span>;
<span class="kw">let</span> <span class="ident">last_umask</span> <span class="op">=</span> <span class="kw">unsafe</span> { <span class="ident">umask</span>(<span class="number">0</span>) };
<span class="ident">mode</span> <span class="op">=</span> <span class="kw-2">&amp;</span><span class="ident">mode</span>[<span class="ident">pos</span>..];
<span class="kw">while</span> <span class="op">!</span><span class="ident">mode</span>.<span class="ident">is_empty</span>() {
<span class="kw">let</span> (<span class="ident">op</span>, <span class="ident">pos</span>) <span class="op">=</span> <span class="ident">parse_op</span>(<span class="ident">mode</span>, <span class="prelude-val">None</span>)<span class="question-mark">?</span>;
<span class="kw">let</span> (<span class="ident">op</span>, <span class="ident">pos</span>) <span class="op">=</span> <span class="ident">parse_op</span>(<span class="ident">mode</span>)<span class="question-mark">?</span>;
<span class="ident">mode</span> <span class="op">=</span> <span class="kw-2">&amp;</span><span class="ident">mode</span>[<span class="ident">pos</span>..];
<span class="kw">let</span> (<span class="kw-2">mut</span> <span class="ident">srwx</span>, <span class="ident">pos</span>) <span class="op">=</span> <span class="ident">parse_change</span>(<span class="ident">mode</span>, <span class="ident">fperm</span>, <span class="ident">considering_dir</span>);
<span class="kw">if</span> <span class="ident">respect_umask</span> {
<span class="ident">srwx</span> <span class="op">&amp;=</span> <span class="op">!</span>(<span class="ident">last_umask</span> <span class="kw">as</span> <span class="ident">u32</span>);
<span class="ident">srwx</span> <span class="op">&amp;=</span> <span class="op">!</span>(<span class="ident">umask</span> <span class="kw">as</span> <span class="ident">u32</span>);
}
<span class="ident">mode</span> <span class="op">=</span> <span class="kw-2">&amp;</span><span class="ident">mode</span>[<span class="ident">pos</span>..];
<span class="kw">match</span> <span class="ident">op</span> {
<span class="string">&#39;+&#39;</span> <span class="op">=</span><span class="op">&gt;</span> <span class="ident">fperm</span> <span class="op">|</span><span class="op">=</span> <span class="ident">srwx</span> <span class="op">&amp;</span> <span class="ident">mask</span>,
<span class="string">&#39;-&#39;</span> <span class="op">=</span><span class="op">&gt;</span> <span class="ident">fperm</span> <span class="op">&amp;=</span> <span class="op">!</span>(<span class="ident">srwx</span> <span class="op">&amp;</span> <span class="ident">mask</span>),
<span class="string">&#39;=&#39;</span> <span class="op">=</span><span class="op">&gt;</span> <span class="ident">fperm</span> <span class="op">=</span> (<span class="ident">fperm</span> <span class="op">&amp;</span> <span class="op">!</span><span class="ident">mask</span>) <span class="op">|</span> (<span class="ident">srwx</span> <span class="op">&amp;</span> <span class="ident">mask</span>),
<span class="string">&#39;=&#39;</span> <span class="op">=</span><span class="op">&gt;</span> {
<span class="kw">if</span> <span class="ident">considering_dir</span> {
<span class="comment">// keep the setgid and setuid bits for directories</span>
<span class="ident">srwx</span> <span class="op">|</span><span class="op">=</span> <span class="ident">fperm</span> <span class="op">&amp;</span> (<span class="number">0o4000</span> <span class="op">|</span> <span class="number">0o2000</span>);
}
<span class="ident">fperm</span> <span class="op">=</span> (<span class="ident">fperm</span> <span class="op">&amp;</span> <span class="op">!</span><span class="ident">mask</span>) <span class="op">|</span> (<span class="ident">srwx</span> <span class="op">&amp;</span> <span class="ident">mask</span>)
}
<span class="kw">_</span> <span class="op">=</span><span class="op">&gt;</span> <span class="macro">unreachable!</span>(),
}
}
<span class="kw">unsafe</span> {
<span class="ident">umask</span>(<span class="ident">last_umask</span>);
}
<span class="prelude-val">Ok</span>(<span class="ident">fperm</span>)
}
@@ -235,9 +249,9 @@
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">pos</span> <span class="op">=</span> <span class="number">0</span>;
<span class="kw">for</span> <span class="ident">ch</span> <span class="kw">in</span> <span class="ident">mode</span>.<span class="ident">chars</span>() {
<span class="ident">mask</span> <span class="op">|</span><span class="op">=</span> <span class="kw">match</span> <span class="ident">ch</span> {
<span class="string">&#39;u&#39;</span> <span class="op">=</span><span class="op">&gt;</span> <span class="number">0o7700</span>,
<span class="string">&#39;g&#39;</span> <span class="op">=</span><span class="op">&gt;</span> <span class="number">0o7070</span>,
<span class="string">&#39;o&#39;</span> <span class="op">=</span><span class="op">&gt;</span> <span class="number">0o7007</span>,
<span class="string">&#39;u&#39;</span> <span class="op">=</span><span class="op">&gt;</span> <span class="number">0o4700</span>,
<span class="string">&#39;g&#39;</span> <span class="op">=</span><span class="op">&gt;</span> <span class="number">0o2070</span>,
<span class="string">&#39;o&#39;</span> <span class="op">=</span><span class="op">&gt;</span> <span class="number">0o1007</span>,
<span class="string">&#39;a&#39;</span> <span class="op">=</span><span class="op">&gt;</span> <span class="number">0o7777</span>,
<span class="kw">_</span> <span class="op">=</span><span class="op">&gt;</span> <span class="kw">break</span>,
};
@@ -249,24 +263,22 @@
(<span class="ident">mask</span>, <span class="ident">pos</span>)
}
<span class="kw">fn</span> <span class="ident">parse_op</span>(<span class="ident">mode</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>, <span class="ident">default</span>: <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">char</span><span class="op">&gt;</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span>(<span class="ident">char</span>, <span class="ident">usize</span>), <span class="ident">String</span><span class="op">&gt;</span> {
<span class="kw">fn</span> <span class="ident">parse_op</span>(<span class="ident">mode</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span>(<span class="ident">char</span>, <span class="ident">usize</span>), <span class="ident">String</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="ident">ch</span> <span class="op">=</span> <span class="ident">mode</span>
.<span class="ident">chars</span>()
.<span class="ident">next</span>()
.<span class="ident">ok_or_else</span>(<span class="op">|</span><span class="op">|</span> <span class="string">&quot;unexpected end of mode&quot;</span>.<span class="ident">to_owned</span>())<span class="question-mark">?</span>;
<span class="prelude-val">Ok</span>(<span class="kw">match</span> <span class="ident">ch</span> {
<span class="string">&#39;+&#39;</span> <span class="op">|</span> <span class="string">&#39;-&#39;</span> <span class="op">|</span> <span class="string">&#39;=&#39;</span> <span class="op">=</span><span class="op">&gt;</span> (<span class="ident">ch</span>, <span class="number">1</span>),
<span class="kw">_</span> <span class="op">=</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="ident">ch</span> <span class="op">=</span> <span class="ident">default</span>.<span class="ident">ok_or_else</span>(<span class="op">|</span><span class="op">|</span> {
<span class="macro">format!</span>(<span class="string">&quot;invalid operator (expected +, -, or =, but found {})&quot;</span>, <span class="ident">ch</span>)
})<span class="question-mark">?</span>;
(<span class="ident">ch</span>, <span class="number">0</span>)
}
})
<span class="kw">match</span> <span class="ident">ch</span> {
<span class="string">&#39;+&#39;</span> <span class="op">|</span> <span class="string">&#39;-&#39;</span> <span class="op">|</span> <span class="string">&#39;=&#39;</span> <span class="op">=</span><span class="op">&gt;</span> <span class="prelude-val">Ok</span>((<span class="ident">ch</span>, <span class="number">1</span>)),
<span class="kw">_</span> <span class="op">=</span><span class="op">&gt;</span> <span class="prelude-val">Err</span>(<span class="macro">format!</span>(
<span class="string">&quot;invalid operator (expected +, -, or =, but found {})&quot;</span>,
<span class="ident">ch</span>
)),
}
}
<span class="kw">fn</span> <span class="ident">parse_change</span>(<span class="ident">mode</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>, <span class="ident">fperm</span>: <span class="ident">u32</span>, <span class="ident">considering_dir</span>: <span class="ident">bool</span>) <span class="op">-</span><span class="op">&gt;</span> (<span class="ident">u32</span>, <span class="ident">usize</span>) {
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">srwx</span> <span class="op">=</span> <span class="ident">fperm</span> <span class="op">&amp;</span> <span class="number">0o7000</span>;
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">srwx</span> <span class="op">=</span> <span class="number">0</span>;
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">pos</span> <span class="op">=</span> <span class="number">0</span>;
<span class="kw">for</span> <span class="ident">ch</span> <span class="kw">in</span> <span class="ident">mode</span>.<span class="ident">chars</span>() {
<span class="kw">match</span> <span class="ident">ch</span> {
@@ -297,13 +309,19 @@
<span class="kw">let</span> <span class="ident">fperm</span> <span class="op">=</span> <span class="ident">S_IRUSR</span> <span class="op">|</span> <span class="ident">S_IWUSR</span> <span class="op">|</span> <span class="ident">S_IRGRP</span> <span class="op">|</span> <span class="ident">S_IWGRP</span> <span class="op">|</span> <span class="ident">S_IROTH</span> <span class="op">|</span> <span class="ident">S_IWOTH</span>;
<span class="kw">let</span> <span class="ident">arr</span>: <span class="kw-2">&amp;</span>[<span class="ident">char</span>] <span class="op">=</span> <span class="kw-2">&amp;</span>[<span class="string">&#39;0&#39;</span>, <span class="string">&#39;1&#39;</span>, <span class="string">&#39;2&#39;</span>, <span class="string">&#39;3&#39;</span>, <span class="string">&#39;4&#39;</span>, <span class="string">&#39;5&#39;</span>, <span class="string">&#39;6&#39;</span>, <span class="string">&#39;7&#39;</span>, <span class="string">&#39;8&#39;</span>, <span class="string">&#39;9&#39;</span>];
<span class="kw">let</span> <span class="ident">result</span> <span class="op">=</span> <span class="kw">if</span> <span class="ident">mode</span>.<span class="ident">contains</span>(<span class="ident">arr</span>) {
<span class="ident">parse_numeric</span>(<span class="ident">fperm</span> <span class="kw">as</span> <span class="ident">u32</span>, <span class="ident">mode</span>)
<span class="ident">parse_numeric</span>(<span class="ident">fperm</span> <span class="kw">as</span> <span class="ident">u32</span>, <span class="ident">mode</span>, <span class="bool-val">true</span>)
} <span class="kw">else</span> {
<span class="ident">parse_symbolic</span>(<span class="ident">fperm</span> <span class="kw">as</span> <span class="ident">u32</span>, <span class="ident">mode</span>, <span class="bool-val">true</span>)
<span class="ident">parse_symbolic</span>(<span class="ident">fperm</span> <span class="kw">as</span> <span class="ident">u32</span>, <span class="ident">mode</span>, <span class="ident">get_umask</span>(), <span class="bool-val">true</span>)
};
<span class="ident">result</span>.<span class="ident">map</span>(<span class="op">|</span><span class="ident">mode</span><span class="op">|</span> <span class="ident">mode</span> <span class="kw">as</span> <span class="ident">mode_t</span>)
}
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">get_umask</span>() <span class="op">-</span><span class="op">&gt;</span> <span class="ident">u32</span> {
<span class="kw">let</span> <span class="ident">mask</span> <span class="op">=</span> <span class="kw">unsafe</span> { <span class="ident">umask</span>(<span class="number">0</span>) };
<span class="kw">unsafe</span> { <span class="ident">umask</span>(<span class="ident">mask</span>) };
<span class="ident">mask</span> <span class="kw">as</span> <span class="ident">u32</span>
}
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">test</span>)]</span>
<span class="kw">mod</span> <span class="ident">test</span> {
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More