8000 stty: add option to print terminal size · uutils/coreutils@10f8d77 · GitHub
[go: up one dir, main page]

Skip to content
8000

Commit 10f8d77

Browse files
stty: add option to print terminal size
1 parent 93ac655 commit 10f8d77

File tree

2 files changed

+35
-6
lines changed

2 files changed

+35
-6
lines changed

src/uu/stty/src/stty.rs

Lines changed: 27 additions & 6 deletions
< 10000 tr class="diff-line-row">
Original file line numberDiff line numberDiff line change
@@ -108,15 +108,20 @@ enum ControlCharMappingError {
108108
MultipleChars,
109109
}
110110

111-
enum SpecialSettings {
111+
enum SpecialSetting {
112112
Rows(u16),
113113
Cols(u16),
114114
}
115115

116+
enum PrintSetting {
117+
Size,
118+
}
119+
116120
enum ArgOptions<'a> {
117121
Flags(AllFlags<'a>),
118122
Mapping((SpecialCharacterIndices, u8)),
119-
Special(SpecialSettings),
123+
Special(SpecialSetting),
124+
Print(PrintSetting),
120125
}
121126

122127
impl<'a> From<AllFlags<'a>> for ArgOptions<'a> {
@@ -289,7 +294,7 @@ fn stty(opts: &Options) -> UResult<()> {
289294
} else if *arg == "rows" {
290295
if let Some(rows) = args_iter.next() {
291296
if let Some(n) = parse_rows_cols(rows) {
292-
valid_args.push(ArgOptions::Special(SpecialSettings::Rows(n)));
297+
valid_args.push(ArgOptions::Special(SpecialSetting::Rows(n)));
293298
} else {
294299
return Err(USimpleError::new(
295300
1,
@@ -302,7 +307,7 @@ fn stty(opts: &Options) -> UResult<()> {
302307
} else if *arg == "columns" || *arg == "cols" {
303308
if let Some(cols) = args_iter.next() {
304309
if let Some(n) = parse_rows_cols(cols) {
305-
valid_args.push(ArgOptions::Special(SpecialSettings::Cols(n)));
310+
valid_args.push(ArgOptions::Special(SpecialSetting::Cols(n)));
306311
} else {
307312
return Err(USimpleError::new(
308313
1,
@@ -312,7 +317,9 @@ fn stty(opts: &Options) -> UResult<()> {
312317
} else {
313318
return Err(USimpleError::new(1, format!("missing argument to '{arg}'")));
314319
}
315-
// not a valid control char or flag
320+
} else if *arg == "size" {
321+
valid_args.push(ArgOptions::Print(PrintSetting::Size));
322+
// not a valid option
316323
} else {
317324
return Err(USimpleError::new(1, format!("invalid argument '{arg}'")));
318325
}
@@ -329,6 +336,9 @@ fn stty(opts: &Options) -> UResult<()> {
329336
ArgOptions::Special(setting) => {
330337
apply_special_setting(setting, opts.file.as_raw_fd())?;
331338
}
339+
ArgOptions::Print(setting) => {
340+
print_special_setting(setting, opts.file.as_raw_fd())?;
341+
}
332342
}
333343
}
334344
tcsetattr(
@@ -358,6 +368,17 @@ fn check_flag_group<T>(flag: &Flag<T>, remove: bool) -> bool {
358368
remove && flag.group.is_some()
359369
}
360370

371+
fn print_special_setting(setting: &PrintSetting, fd: i32) -> nix::Result<()> {
372+
match setting {
373+
PrintSetting::Size => {
374+
let mut size = TermSize::default();
375+
unsafe { tiocgwinsz(fd, &raw mut size)? };
376+
println!("{} {}", size.rows, size.columns);
377+
}
378+
}
379+
Ok(())
380+
}
381+
361382
fn print_terminal_size(termios: &Termios, opts: &Options) -> nix::Result<()> {
362383
let speed = cfgetospeed(termios);
363384

@@ -632,7 +653,7 @@ fn apply_char_mapping(termios: &mut Termios, mapping: &(SpecialCharacterIndices,
632653
termios.control_chars[mapping.0 as usize] = mapping.1;
633654
}
634655

635-
fn apply_special_setting(setting: &SpecialSettings, fd: i32) -> nix::Result<()> {
656+
fn apply_special_setting(setting: &SpecialSetting, fd: i32) -> nix::Result<()> {
636657
let mut size = TermSize::default();
637658
unsafe { tiocgwinsz(fd, &raw mut size)? };
638659
match setting {

tests/by-util/test_stty.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,14 @@ fn all_and_setting() {
4848
.stderr_contains("when specifying an output style, modes may not be set");
4949
}
5050

51+
#[test]
52+
fn all_and_print_setting() {
53+
new_ucmd!()
54+
.args(&["--all", "size"])
55+
.fails()
56+
.stderr_contains("when specifying an output style, modes may not be set");
57+
}
58+
5159
#[test]
5260
fn save_and_all() {
5361
new_ucmd!()

0 commit comments

Comments
 (0)
0