|
117 | 117 | <span id="117">117</span>
|
118 | 118 | <span id="118">118</span>
|
119 | 119 | <span id="119">119</span>
|
| 120 | +<span id="120">120</span> |
| 121 | +<span id="121">121</span> |
| 122 | +<span id="122">122</span> |
| 123 | +<span id="123">123</span> |
| 124 | +<span id="124">124</span> |
| 125 | +<span id="125">125</span> |
| 126 | +<span id="126">126</span> |
| 127 | +<span id="127">127</span> |
| 128 | +<span id="128">128</span> |
| 129 | +<span id="129">129</span> |
| 130 | +<span id="130">130</span> |
| 131 | +<span id="131">131</span> |
| 132 | +<span id="132">132</span> |
| 133 | +<span id="133">133</span> |
| 134 | +<span id="134">134</span> |
| 135 | +<span id="135">135</span> |
| 136 | +<span id="136">136</span> |
| 137 | +<span id="137">137</span> |
| 138 | +<span id="138">138</span> |
| 139 | +<span id="139">139</span> |
| 140 | +<span id="140">140</span> |
| 141 | +<span id="141">141</span> |
| 142 | +<span id="142">142</span> |
| 143 | +<span id="143">143</span> |
| 144 | +<span id="144">144</span> |
| 145 | +<span id="145">145</span> |
| 146 | +<span id="146">146</span> |
| 147 | +<span id="147">147</span> |
| 148 | +<span id="148">148</span> |
| 149 | +<span id="149">149</span> |
| 150 | +<span id="150">150</span> |
| 151 | +<span id="151">151</span> |
| 152 | +<span id="152">152</span> |
| 153 | +<span id="153">153</span> |
| 154 | +<span id="154">154</span> |
| 155 | +<span id="155">155</span> |
| 156 | +<span id="156">156</span> |
| 157 | +<span id="157">157</span> |
| 158 | +<span id="158">158</span> |
| 159 | +<span id="159">159</span> |
| 160 | +<span id="160">160</span> |
| 161 | +<span id="161">161</span> |
| 162 | +<span id="162">162</span> |
| 163 | +<span id="163">163</span> |
| 164 | +<span id="164">164</span> |
| 165 | +<span id="165">165</span> |
| 166 | +<span id="166">166</span> |
| 167 | +<span id="167">167</span> |
| 168 | +<span id="168">168</span> |
| 169 | +<span id="169">169</span> |
| 170 | +<span id="170">170</span> |
| 171 | +<span id="171">171</span> |
| 172 | +<span id="172">172</span> |
| 173 | +<span id="173">173</span> |
| 174 | +<span id="174">174</span> |
| 175 | +<span id="175">175</span> |
| 176 | +<span id="176">176</span> |
| 177 | +<span id="177">177</span> |
| 178 | +<span id="178">178</span> |
| 179 | +<span id="179">179</span> |
| 180 | +<span id="180">180</span> |
| 181 | +<span id="181">181</span> |
| 182 | +<span id="182">182</span> |
| 183 | +<span id="183">183</span> |
| 184 | +<span id="184">184</span> |
| 185 | +<span id="185">185</span> |
| 186 | +<span id="186">186</span> |
| 187 | +<span id="187">187</span> |
| 188 | +<span id="188">188</span> |
| 189 | +<span id="189">189</span> |
| 190 | +<span id="190">190</span> |
| 191 | +<span id="191">191</span> |
| 192 | +<span id="192">192</span> |
| 193 | +<span id="193">193</span> |
| 194 | +<span id="194">194</span> |
| 195 | +<span id="195">195</span> |
| 196 | +<span id="196">196</span> |
| 197 | +<span id="197">197</span> |
| 198 | +<span id="198">198</span> |
| 199 | +<span id="199">199</span> |
| 200 | +<span id="200">200</span> |
| 201 | +<span id="201">201</span> |
| 202 | +<span id="202">202</span> |
| 203 | +<span id="203">203</span> |
| 204 | +<span id="204">204</span> |
| 205 | +<span id="205">205</span> |
| 206 | +<span id="206">206</span> |
| 207 | +<span id="207">207</span> |
| 208 | +<span id="208">208</span> |
| 209 | +<span id="209">209</span> |
| 210 | +<span id="210">210</span> |
| 211 | +<span id="211">211</span> |
| 212 | +<span id="212">212</span> |
| 213 | +<span id="213">213</span> |
| 214 | +<span id="214">214</span> |
| 215 | +<span id="215">215</span> |
120 | 216 | </pre><pre class="rust"><code><span class="comment">// * This file is part of the uutils coreutils package.
|
121 | 217 | // *
|
122 | 218 | // * (c) Alex Lyon <arcterus@mail.com>
|
|
127 | 223 | // spell-checker:ignore (ToDO) getpriority execvp setpriority nstr PRIO cstrs ENOENT
|
128 | 224 |
|
129 | 225 | </span><span class="kw">use </span>libc::{c_char, c_int, execvp, PRIO_PROCESS};
|
130 |
| -<span class="kw">use </span>std::ffi::CString; |
131 |
| -<span class="kw">use </span>std::io::Error; |
| 226 | +<span class="kw">use </span>std::ffi::{CString, OsString}; |
| 227 | +<span class="kw">use </span>std::io::{Error, Write}; |
132 | 228 | <span class="kw">use </span>std::ptr;
|
133 | 229 |
|
134 | 230 | <span class="kw">use </span>clap::{crate_version, Arg, ArgAction, Command};
|
135 | 231 | <span class="kw">use </span>uucore::{
|
136 | 232 | error::{set_exit_code, UClapError, UResult, USimpleError, UUsageError},
|
137 |
| - format_usage, show_error, show_warning, |
| 233 | + format_usage, show_error, |
138 | 234 | };
|
139 | 235 |
|
140 | 236 | <span class="kw">pub mod </span>options {
|
|
149 | 245 | process)."</span>;
|
150 | 246 | <span class="kw">const </span>USAGE: <span class="kw-2">&</span>str = <span class="string">"{} [OPTIONS] [COMMAND [ARGS]]"</span>;
|
151 | 247 |
|
| 248 | +<span class="kw">fn </span>is_prefix_of(maybe_prefix: <span class="kw-2">&</span>str, target: <span class="kw-2">&</span>str, min_match: usize) -> bool { |
| 249 | + <span class="kw">if </span>maybe_prefix.len() < min_match || maybe_prefix.len() > target.len() { |
| 250 | + <span class="kw">return </span><span class="bool-val">false</span>; |
| 251 | + } |
| 252 | + |
| 253 | + <span class="kw-2">&</span>target[<span class="number">0</span>..maybe_prefix.len()] == maybe_prefix |
| 254 | +} |
| 255 | + |
| 256 | +<span class="doccomment">/// Transform legacy arguments into a standardized form. |
| 257 | +/// |
| 258 | +/// The following are all legal argument sequences to GNU nice: |
| 259 | +/// - "-1" |
| 260 | +/// - "-n1" |
| 261 | +/// - "-+1" |
| 262 | +/// - "--1" |
| 263 | +/// - "-n -1" |
| 264 | +/// |
| 265 | +/// It looks initially like we could add handling for "-{i}", "--{i}" |
| 266 | +/// and "-+{i}" for integers {i} and process them normally using clap. |
| 267 | +/// However, the meaning of "-1", for example, changes depending on |
| 268 | +/// its context with legacy argument parsing. clap will not prioritize |
| 269 | +/// hyphenated values to previous arguments over matching a known |
| 270 | +/// argument. So "-n" "-1" in this case is picked up as two |
| 271 | +/// arguments, not one argument with a value. |
| 272 | +/// |
| 273 | +/// Given this context dependency, and the deep hole we end up digging |
| 274 | +/// with clap in this case, it's much simpler to just normalize the |
| 275 | +/// arguments to nice before clap starts work. Here, we insert a |
| 276 | +/// prefix of "-n" onto all arguments of the form "-{i}", "--{i}" and |
| 277 | +/// "-+{i}" which are not already preceded by "-n". |
| 278 | +</span><span class="kw">fn </span>standardize_nice_args(<span class="kw-2">mut </span>args: <span class="kw">impl </span>uucore::Args) -> <span class="kw">impl </span>uucore::Args { |
| 279 | + <span class="kw">let </span><span class="kw-2">mut </span>v = Vec::<OsString>::new(); |
| 280 | + <span class="kw">let </span><span class="kw-2">mut </span>saw_n = <span class="bool-val">false</span>; |
| 281 | + <span class="kw">let </span><span class="kw-2">mut </span>saw_command = <span class="bool-val">false</span>; |
| 282 | + <span class="kw">if let </span><span class="prelude-val">Some</span>(cmd) = args.next() { |
| 283 | + v.push(cmd); |
| 284 | + } |
| 285 | + <span class="kw">for </span>s <span class="kw">in </span>args { |
| 286 | + <span class="kw">if </span>saw_command { |
| 287 | + v.push(s); |
| 288 | + } <span class="kw">else if </span>saw_n { |
| 289 | + <span class="kw">let </span><span class="kw-2">mut </span>new_arg: OsString = <span class="string">"-n"</span>.into(); |
| 290 | + new_arg.push(s); |
| 291 | + v.push(new_arg); |
| 292 | + saw_n = <span class="bool-val">false</span>; |
| 293 | + } <span class="kw">else if </span>s.to_str() == <span class="prelude-val">Some</span>(<span class="string">"-n"</span>) |
| 294 | + || s.to_str() |
| 295 | + .map(|s| is_prefix_of(s, <span class="string">"--adjustment"</span>, <span class="string">"--a"</span>.len())) |
| 296 | + .unwrap_or_default() |
| 297 | + { |
| 298 | + saw_n = <span class="bool-val">true</span>; |
| 299 | + } <span class="kw">else if let </span><span class="prelude-val">Ok</span>(s) = s.clone().into_string() { |
| 300 | + <span class="kw">if let </span><span class="prelude-val">Some</span>(stripped) = s.strip_prefix(<span class="string">'-'</span>) { |
| 301 | + <span class="kw">match </span>stripped.parse::<i64>() { |
| 302 | + <span class="prelude-val">Ok</span>(ix) => { |
| 303 | + <span class="kw">let </span><span class="kw-2">mut </span>new_arg: OsString = <span class="string">"-n"</span>.into(); |
| 304 | + new_arg.push(ix.to_string()); |
| 305 | + v.push(new_arg); |
| 306 | + } |
| 307 | + <span class="prelude-val">Err</span>(<span class="kw">_</span>) => { |
| 308 | + v.push(s.into()); |
| 309 | + } |
| 310 | + } |
| 311 | + } <span class="kw">else </span>{ |
| 312 | + saw_command = <span class="bool-val">true</span>; |
| 313 | + v.push(s.into()); |
| 314 | + } |
| 315 | + } <span class="kw">else </span>{ |
| 316 | + saw_command = <span class="bool-val">true</span>; |
| 317 | + v.push(s); |
| 318 | + } |
| 319 | + } |
| 320 | + <span class="kw">if </span>saw_n { |
| 321 | + v.push(<span class="string">"-n"</span>.into()); |
| 322 | + } |
| 323 | + |
| 324 | + v.into_iter() |
| 325 | +} |
| 326 | + |
152 | 327 | <span class="attribute">#[uucore::main]
|
153 | 328 | </span><span class="kw">pub fn </span>uumain(args: <span class="kw">impl </span>uucore::Args) -> UResult<()> {
|
| 329 | + <span class="kw">let </span>args = standardize_nice_args(args); |
| 330 | + |
154 | 331 | <span class="kw">let </span>matches = uu_app().try_get_matches_from(args).with_exit_code(<span class="number">125</span>)<span class="question-mark">?</span>;
|
155 | 332 |
|
156 | 333 | nix::errno::Errno::clear();
|
|
190 | 367 | };
|
191 | 368 |
|
192 | 369 | niceness += adjustment;
|
193 |
| - <span class="kw">if unsafe </span>{ libc::setpriority(PRIO_PROCESS, <span class="number">0</span>, niceness) } == -<span class="number">1 </span>{ |
194 |
| - <span class="macro">show_warning!</span>(<span class="string">"setpriority: {}"</span>, Error::last_os_error()); |
| 370 | + <span class="comment">// We can't use `show_warning` because that will panic if stderr |
| 371 | + // isn't writable. The GNU test suite checks specifically that the |
| 372 | + // exit code when failing to write the advisory is 125, but Rust |
| 373 | + // will produce an exit code of 101 when it panics. |
| 374 | + </span><span class="kw">if unsafe </span>{ libc::setpriority(PRIO_PROCESS, <span class="number">0</span>, niceness) } == -<span class="number">1 |
| 375 | + </span>&& <span class="macro">write!</span>( |
| 376 | + std::io::stderr(), |
| 377 | + <span class="string">"{}: warning: setpriority: {}"</span>, |
| 378 | + uucore::util_name(), |
| 379 | + Error::last_os_error() |
| 380 | + ) |
| 381 | + .is_err() |
| 382 | + { |
| 383 | + set_exit_code(<span class="number">125</span>); |
| 384 | + <span class="kw">return </span><span class="prelude-val">Ok</span>(()); |
195 | 385 | }
|
196 | 386 |
|
197 | 387 | <span class="kw">let </span>cstrs: Vec<CString> = matches
|
|
228 | 418 | .short(<span class="string">'n'</span>)
|
229 | 419 | .long(options::ADJUSTMENT)
|
230 | 420 | .help(<span class="string">"add N to the niceness (default is 10)"</span>)
|
| 421 | + .action(ArgAction::Set) |
| 422 | + .overrides_with(options::ADJUSTMENT) |
231 | 423 | .allow_hyphen_values(<span class="bool-val">true</span>),
|
232 | 424 | )
|
233 | 425 | .arg(
|
|
0 commit comments