@@ -30,7 +30,7 @@ use std::num::IntErrorKind;
30
30
use std:: os:: fd:: { AsFd , BorrowedFd } ;
31
31
use std:: os:: unix:: fs:: OpenOptionsExt ;
32
32
use std:: os:: unix:: io:: { AsRawFd , RawFd } ;
33
- use uucore:: error:: { UResult , USimpleError } ;
33
+ use uucore:: error:: { UError , UResult , USimpleError } ;
34
34
use uucore:: format_usage;
35
35
use uucore:: locale:: { get_message, get_message_with_args} ;
36
36
@@ -270,37 +270,9 @@ fn stty(opts: &Options) -> UResult<()> {
270
270
271
271
if let Some ( args) = & opts. settings {
272
272
let mut args_iter = args. iter ( ) ;
273
- // iterate over args: skip to next arg if current one is a control char
274
273
while let Some ( & arg) = args_iter. next ( ) {
275
- // control char
276
- if let Some ( char_index) = cc_to_index ( arg) {
277
- if let Some ( mapping) = args_iter. next ( ) {
278
- let cc_mapping = string_to_control_char ( mapping) . map_err ( |e| {
279
- let message = match e {
280
- ControlCharMappingError :: IntOutOfRange ( val) => get_message_with_args (
281
- "stty-error-invalid-integer-argument-value-too-large" ,
282
- HashMap :: from ( [ ( "value" . to_string ( ) , format ! ( "'{val}'" ) ) ] ) ,
283
- ) ,
284
- ControlCharMappingError :: MultipleChars ( val) => get_message_with_args (
285
- "stty-error-invalid-integer-argument" ,
286
- HashMap :: from ( [ ( "value" . to_string ( ) , format ! ( "'{val}'" ) ) ] ) ,
287
- ) ,
288
- } ;
289
- USimpleError :: new ( 1 , message)
290
- } ) ?;
291
- valid_args. push ( ArgOptions :: Mapping ( ( char_index, cc_mapping) ) ) ;
292
- } else {
293
- return Err ( USimpleError :: new (
294
- 1 ,
295
- get_message_with_args (
296
- "stty-error-missing-argument" ,
297
- HashMap :: from ( [ ( "arg" . to_string ( ) , ( * arg) . to_string ( ) ) ] ) ,
298
- ) ,
299
- ) ) ;
300
- }
301
- // ispeed/ospeed baud rate setting
302
- } else if arg == "ispeed" || arg == "ospeed" {
303
- match args_iter. next ( ) {
274
+ match arg {
275
+ "ispeed" | "ospeed" => match args_iter. next ( ) {
304
276
Some ( speed) => {
305
277
if let Some ( baud_flag) = string_to_baud ( speed) {
306
278
valid_args. push ( ArgOptions :: Flags ( baud_flag) ) ;
@@ -318,149 +290,125 @@ fn stty(opts: &Options) -> UResult<()> {
318
290
}
319
291
}
320
292
None => {
321
- return Err ( USimpleError :: new (
322
- 1 ,
323
- get_message_with_args (
324
- "stty-error-missing-argument" ,
325
- HashMap :: from ( [ ( "arg" . to_string ( ) , ( * arg) . to_string ( ) ) ] ) ,
326
- ) ,
327
- ) ) ;
293
+ return missing_arg ( arg) ;
328
294
}
329
- }
330
- } else if arg == "line" {
331
- match args_iter. next ( ) {
295
+ } ,
296
+ "line" => match args_iter. next ( ) {
332
297
Some ( line) => match parse_u8_or_err ( line) {
333
298
Ok ( n) => valid_args. push ( ArgOptions :: Special ( SpecialSetting :: Line ( n) ) ) ,
334
299
Err ( e) => return Err ( USimpleError :: new ( 1 , e) ) ,
335
300
} ,
336
301
None => {
337
- return Err ( USimpleError :: new (
338
- 1 ,
339
- get_message_with_args (
340
- "stty-error-missing-argument" ,
341
- HashMap :: from ( [ ( "arg" . to_string ( ) , arg. to_string ( ) ) ] ) ,
342
- ) ,
343
- ) ) ;
302
+ return missing_arg ( arg) ;
344
303
}
345
- }
346
- } else if arg == "min" {
347
- match args_iter. next ( ) {
304
+ } ,
305
+ "min" => match args_iter. next ( ) {
348
306
Some ( min) => match parse_u8_or_err ( min) {
349
307
Ok ( n) => {
350
308
valid_args. push ( ArgOptions :: Mapping ( ( S :: VMIN , n) ) ) ;
351
309
}
352
310
Err ( e) => return Err ( USimpleError :: new ( 1 , e) ) ,
353
311
} ,
354
312
None => {
355
- return Err ( USimpleError :: new (
356
- 1 ,
357
- get_message_with_args (
358
- "stty-error-missing-argument" ,
359
- HashMap :: from ( [ ( "arg" . to_string ( ) , arg. to_string ( ) ) ] ) ,
360
- ) ,
361
- ) ) ;
313
+ return missing_arg ( arg) ;
362
314
}
363
- }
364
- } else if arg == "time" {
365
- match args_iter. next ( ) {
315
+ } ,
316
+ "time" => match args_iter. next ( ) {
366
317
Some ( time) => match parse_u8_or_err ( time) {
367
318
Ok ( n) => valid_args. push ( ArgOptions :: Mapping ( ( S :: VTIME , n) ) ) ,
368
319
Err ( e) => return Err ( USimpleError :: new ( 1 , e) ) ,
369
320
} ,
370
321
None => {
371
- return Err ( USimpleError :: new (
372
- 1 ,
373
- get_message_with_args (
374
- "stty-error-missing-argument" ,
375
- HashMap :: from ( [ ( "arg" . to_string ( ) , arg. to_string ( ) ) ] ) ,
376
- ) ,
377
- ) ) ;
322
+ return missing_arg ( arg) ;
323
+ }
324
+ } ,
325
+ "rows" => {
326
+ if let Some ( rows) = args_iter. next ( ) {
327
+ if let Some ( n) = parse_rows_cols ( rows) {
328
+ valid_args. push ( ArgOptions :: Special ( SpecialSetting :: Rows ( n) ) ) ;
329
+ } else {
330
+ return invalid_integer_arg ( rows) ;
331
+ }
332
+ } else {
333
+ return missing_arg ( arg) ;
378
334
}
379
335
}
380
- // baud rate setting
381
- } else if let Some ( baud_flag) = string_to_baud ( arg) {
382
- valid_args. push ( ArgOptions :: Flags ( baud_flag) ) ;
383
- // non control char flag
384
- } else if let Some ( flag) = string_to_flag ( arg) {
385
- let remove_group = match flag {
386
- AllFlags :: Baud ( _) => false ,
387
- AllFlags :: ControlFlags ( ( flag, remove) ) => check_flag_group ( flag, remove) ,
388
- AllFlags :: InputFlags ( ( flag, remove) ) => check_flag_group ( flag, remove) ,
389
- AllFlags :: LocalFlags ( ( flag, remove) ) => check_flag_group ( flag, remove) ,
390
- AllFlags :: OutputFlags ( ( flag, remove) ) => check_flag_group ( flag, remove) ,
391
- } ;
392
- if remove_group {
393
- return Err ( USimpleError :: new (
394
- 1 ,
395
- get_message_with_args (
396
- "stty-error-invalid-argument" ,
397
- HashMap :: from ( [ ( "arg" . to_string ( ) , ( * arg) . to_string ( ) ) ] ) ,
398
- ) ,
399
- ) ) ;
400
- }
401
- valid_args. push ( flag. into ( ) ) ;
402
- // combination setting
403
- } else if let Some ( combo) = string_to_combo ( arg) {
404
- valid_args. append ( & mut combo_to_flags ( combo) ) ;
405
- } else if arg == "rows" {
406
- if let Some ( rows) = args_iter. next ( ) {
407
- if let Some ( n) = parse_rows_cols ( rows) {
408
- valid_args. push ( ArgOptions :: Special ( SpecialSetting :: Rows ( n) ) ) ;
336
+ "columns" | "cols" => {
337
+ if let Some ( cols) = args_iter. next ( ) {
338
+ if let Some ( n) = parse_rows_cols ( cols) {
339
+ valid_args. push ( ArgOptions :: Special ( SpecialSetting :: Cols ( n) ) ) ;
340
+ } else {
341
+ return invalid_integer_arg ( cols) ;
342
+ }
409
343
} else {
410
- return Err ( USimpleError :: new (
411
- 1 ,
412
- get_message_with_args (
413
- "stty-error-invalid-integer-argument" ,
414
- HashMap :: from ( [ ( "value" . to_string ( ) , format ! ( "'{rows}'" ) ) ] ) ,
415
- ) ,
416
- ) ) ;
344
+ return missing_arg ( arg) ;
417
345
}
418
- } else {
419
- return Err ( USimpleError :: new (
420
- 1 ,
421
- get_message_with_args (
422
- "stty-error-missing-argument" ,
423
- HashMap :: from ( [ ( "arg" . to_string ( ) , ( * arg) . to_string ( ) ) ] ) ,
424
- ) ,
425
- ) ) ;
426
346
}
427
- } else if arg == "columns" || arg == "cols" {
428
- if let Some ( cols) = args_iter. next ( ) {
429
- if let Some ( n) = parse_rows_cols ( cols) {
430
- valid_args. push ( ArgOptions :: Special ( SpecialSetting :: Cols ( n) ) ) ;
347
+ "drain" => {
348
+ set_arg = SetArg :: TCSADRAIN ;
349
+ }
350
+ "-drain" => {
351
+ set_arg = SetArg :: TCSANOW ;
352
+ }
353
+ "size" => {
354
+ valid_args. push ( ArgOptions :: Print ( PrintSetting :: Size ) ) ;
355
+ }
356
+ & _ => {
357
+ // control char
358
+ if let Some ( char_index) = cc_to_index ( arg) {
359
+ if let Some ( mapping) = args_iter. next ( ) {
360
+ let cc_mapping = string_to_control_char ( mapping) . map_err ( |e| {
361
+ let message = match e {
362
+ ControlCharMappingError :: IntOutOfRange ( val) => {
363
+ get_message_with_args (
364
+ "stty-error-invalid-integer-argument-value-too-large" ,
365
+ HashMap :: from ( [ (
366
+ "value" . to_string ( ) ,
367
+ format ! ( "'{val}'" ) ,
368
+ ) ] ) ,
369
+ )
370
+ }
371
+ ControlCharMappingError :: MultipleChars ( val) => {
372
+ get_message_with_args (
373
+ "stty-error-invalid-integer-argument" ,
374
+ HashMap :: from ( [ (
375
+ "value" . to_string ( ) ,
376
+ format ! ( "'{val}'" ) ,
377
+ ) ] ) ,
378
+ )
379
+ }
380
+ } ;
381
+ USimpleError :: new ( 1 , message)
382
+ } ) ?;
383
+ valid_args. push ( ArgOptions :: Mapping ( ( char_index, cc_mapping) ) ) ;
384
+ } else {
385
+ return missing_arg ( arg) ;
386
+ }
387
+ // baud rate
388
+ } else if let Some ( baud_flag) = string_to_baud ( arg) {
389
+ valid_args. push ( ArgOptions :: Flags ( baud_flag) ) ;
390
+ // non control char flag
391
+ } else if let Some ( flag) = string_to_flag ( arg) {
392
+ let remove_group = match flag {
393
+ AllFlags :: Baud ( _) => false ,
394
+ AllFlags :: ControlFlags ( ( flag, remove) ) => {
395
+ check_flag_group ( flag, remove)
396
+ }
397
+ AllFlags :: InputFlags ( ( flag, remove) ) => check_flag_group ( flag, remove) ,
398
+ AllFlags :: LocalFlags ( ( flag, remove) ) => check_flag_group ( flag, remove) ,
399
+ AllFlags :: OutputFlags ( ( flag, remove) ) => check_flag_group ( flag, remove) ,
400
+ } ;
401
+ if remove_group {
402
+ return invalid_arg ( arg) ;
403
+ }
404
+ valid_args. push ( flag. into ( ) ) ;
405
+ // combination setting
406
+ } else if let Some ( combo) = string_to_combo ( arg) {
407
+ valid_args. append ( & mut combo_to_flags ( combo) ) ;
431
408
} else {
432
- return Err ( USimpleError :: new (
433
- 1 ,
434
- get_message_with_args (
435
- "stty-error-invalid-integer-argument" ,
436
- HashMap :: from ( [ ( "value" . to_string ( ) , format ! ( "'{cols}'" ) ) ] ) ,
437
- ) ,
438
- ) ) ;
409
+ return invalid_arg ( arg) ;
439
410
}
440
- } else {
441
- return Err ( USimpleError :: new (
442
- 1 ,
443
- get_message_with_args (
444
- "stty-error-missing-argument" ,
445
- HashMap :: from ( [ ( "arg" . to_string ( ) , ( * arg) . to_string ( ) ) ] ) ,
446
- ) ,
447
- ) ) ;
448
411
}
449
- } else if arg == "drain" {
450
- set_arg = SetArg :: TCSADRAIN ;
451
- } else if arg == "-drain" {
452
- set_arg = SetArg :: TCSANOW ;
453
- } else if arg == "size" {
454
- valid_args. push ( ArgOptions :: Print ( PrintSetting :: Size ) ) ;
455
- // not a valid option
456
- } else {
457
- return Err ( USimpleError :: new (
458
- 1 ,
459
- get_message_with_args (
460
- "stty-error-invalid-argument" ,
461
- HashMap :: from ( [ ( "arg" . to_string ( ) , ( * arg) . to_string ( ) ) ] ) ,
462
- ) ,
463
- ) ) ;
464
412
}
465
413
}
466
414
@@ -490,6 +438,36 @@ fn stty(opts: &Options) -> UResult<()> {
490
438
Ok ( ( ) )
491
439
}
492
440
441
+ fn missing_arg < T > ( arg : & str ) -> Result < T , Box < dyn UError > > {
442
+ Err :: < T , Box < dyn UError > > ( USimpleError :: new (
443
+ 1 ,
444
+ get_message_with_args (
445
+ "stty-error-missing-argument" ,
446
+ HashMap :: from ( [ ( "arg" . to_string ( ) , ( * arg) . to_string ( ) ) ] ) ,
447
+ ) ,
448
+ ) )
449
+ }
450
+
451
+ fn invalid_arg < T > ( arg : & str ) -> Result < T , Box < dyn UError > > {
452
+ Err :: < T , Box < dyn UError > > ( USimpleError :: new (
453
+ 1 ,
454
+ get_message_with_args (
455
+ "stty-error-invalid-argument" ,
456
+ HashMap :: from ( [ ( "arg" . to_string ( ) , ( * arg) . to_string ( ) ) ] ) ,
457
+ ) ,
458
+ ) )
459
+ }
460
+
461
+ fn invalid_integer_arg < T > ( arg : & str ) -> Result < T , Box < dyn UError > > {
462
+ Err :: < T , Box < dyn UError > > ( USimpleError :: new (
463
+ 1 ,
464
+ get_message_with_args (
465
+ "stty-error-invalid-integer-argument" ,
466
+ HashMap :: from ( [ ( "value" . to_string ( ) , format ! ( "'{arg}'" ) ) ] ) ,
467
+ ) ,
468
+ ) )
469
+ }
470
+
493
471
/// GNU uses different error messages if values overflow or underflow a u8,
494
472
/// this function returns the appropriate error message in the case of overflow or underflow, or u8 on success
495
473
fn parse_u8_or_err ( arg : & str ) -> Result < u8 , String > {
0 commit comments