1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
// This file is part of yash, an extended POSIX shell.
// Copyright (C) 2021 WATANABE Yuki
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
//! Type definitions for I/O.
use crateEnv;
use crateLocation;
use crate;
use crate;
use Renderer;
use Cow;
use RawFd;
type RawFd = i32;
/// File descriptor
///
/// This is the `newtype` pattern applied to [`RawFd`], which is merely a type
/// alias.
;
/// Minimum file descriptor the shell may occupy for its internal use
///
/// POSIX reserves file descriptors below `MIN_INTERNAL_FD` so the user can use
/// them freely. When the shell needs to open a file descriptor that is
/// invisible to the user, it should be kept at `MIN_INTERNAL_FD` or above.
/// (Hint: A typical way to move a file descriptor is to
/// [`dup`](crate::system::Dup::dup) and [`close`](crate::system::Close::close).
/// You can also use [`move_fd_internal`].)
pub const MIN_INTERNAL_FD: Fd = Fd;
/// Moves a file descriptor to be at least [`MIN_INTERNAL_FD`].
///
/// This is a convenience function that duplicates the given `from` FD to be at
/// least `MIN_INTERNAL_FD`, and closes the original `from` FD. The new FD will
/// have the `CLOEXEC` flag set. If `from` is already at least
/// `MIN_INTERNAL_FD`, this function does nothing and returns `from`.
///
/// This function can be used to make sure a file descriptor used by the shell
/// does not conflict with file descriptors used by the user.
/// [`MIN_INTERNAL_FD`] is the minimum file descriptor number the shell may use
/// internally.
///
/// Returns the new file descriptor. On error during duplication, the original
/// `from` FD is still closed, and the error is returned. Errors during closing
/// the original `from` FD are ignored.
/// Convenience function for converting a report into a string.
///
/// The returned string may contain ANSI color escape sequences if the given
/// `env` allows it. The string will end with a newline.
///
/// To print the returned string to the standard error, you can use
/// [`Concurrent::print_error`](crate::system::Concurrent::print_error).
/// Convenience function for printing a report.
///
/// This function converts the `report` into a string by using
/// [`report_to_string`], and prints the result to the standard error.
pub async
/// Convenience function for printing an error message.
///
/// This function constructs a temporary [`Report`] based on the given `title`,
/// `label`, and `location`. The message is printed using [`print_report`].
pub async