8322 nl: misleading-indentation
[unleashed/tickless.git] / usr / src / man / man3c / enable_extended_FILE_stdio.3c
blob08c3a2141d6895361bf532d4e1e9992214709168
1 '\" te
2 .\" Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
3 .\" Copyright (c) 2006, Sun Microsystems, Inc. All Rights Reserved.
4 .\" The contents of this file are subject to the terms of the Common Development and Distribution License (the "License").  You may not use this file except in compliance with the License.
5 .\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE or http://www.opensolaris.org/os/licensing.  See the License for the specific language governing permissions and limitations under the License.
6 .\" When distributing Covered Code, include this CDDL HEADER in each file and include the License file at usr/src/OPENSOLARIS.LICENSE.  If applicable, add the following below this CDDL HEADER, with the fields enclosed by brackets "[]" replaced with your own identifying information: Portions Copyright [yyyy] [name of copyright owner]
7 .TH ENABLE_EXTENDED_FILE_STDIO 3C "Oct 22, 2014"
8 .SH NAME
9 enable_extended_FILE_stdio \- enable extended FILE facility within standard I/O
10 .SH SYNOPSIS
11 .LP
12 .nf
13 #include <stdio.h>
14 #include <stdio_ext.h>
15 #include <signal.h>
17 \fBint\fR \fBenable_extended_FILE_stdio\fR(\fBint\fR \fIlow_fd\fR, \fBint\fR \fIsignal_action\fR);
18 .fi
20 .SH DESCRIPTION
21 .sp
22 .LP
23 The \fBenable_extended_FILE_stdio()\fR function enables the use of the extended
24 FILE facility (see NOTES) and determines which, if any, signal will be sent
25 when an application uses \fBFILE\fR->\fI_file\fR inappropriately.
26 .sp
27 .LP
28 The \fIlow_fd\fR argument specifies the lowest file descriptor in the range 3
29 through 255 that the application wants to be selected as the unallocatable file
30 descriptor.  File descriptors 0, 1, and 2 cannot be used because they are
31 reserved for use as the default file descriptors underlying the \fBstdin\fR,
32 \fBstdout\fR, and \fBstderr\fR standard I/O streams.  The \fIlow_fd\fR argument
33 can also be set to \(mi1 to request that \fBenable_extended_FILE_stdio()\fR
34 select a "reasonable" unallocatable file descriptor.  In this case,
35 \fBenable_extended_FILE_stdio()\fR will first attempt to reserve a relatively
36 large file descriptor, but will keep trying to find an unallocatable file
37 descriptor until it is known that no file descriptor can be reserved.
38 .sp
39 .LP
40 The \fIsignal_action\fR argument specifies the signal that will be sent to the
41 process when the unallocatable file descriptor is used as a file descriptor
42 argument to any system call except \fBclose\fR(2). If \fIsignal_action\fR is
43 \(mi1, the default signal (\fBSIGABRT\fR) will be sent. If \fIsignal_action\fR
44 is 0, no signal will be sent. Otherwise, the signal specified by
45 \fIsignal_action\fR will be sent.
46 .sp
47 .LP
48 The \fBenable_extended_FILE_stdio()\fR function calls
49 .sp
50 .in +2
51 .nf
52 unallocatablefd = fcntl(low_fd, F_BADFD, action);
53 .fi
54 .in -2
56 .sp
57 .LP
58 to reserve the unallocatable file descriptor and set the signal to be sent if
59 the unallocatable file descriptor is used in a system call.  If the
60 \fBfcntl\fR(2) call succeeds, the extended FILE facility is enabled and the
61 unallocatable file descriptor is saved for later use by the standard I/O
62 functions.  When an attempt is made to open a standard I/O stream (see
63 \fBfdopen\fR(3C), \fBfopen\fR(3C), and \fBpopen\fR(3C)) with an underlying file
64 descriptor greater than 255, the file descriptor is stored in an auxiliary
65 location and the field formerly known as \fBFILE\fR->\fI_file\fR is set to the
66 unallocatable file descriptor.
67 .sp
68 .LP
69 If the file descriptor limit for the process is less than or equal to 256 (the
70 system default), the application needs to raise the limit (see
71 \fBgetrlimit\fR(2)) for the extended FILE facility to be useful. The
72 \fBenable_extended_FILE_stdio()\fR function does not attempt to change the file
73 descriptor limit.
74 .sp
75 .LP
76 This function is used by the \fBextendedFILE\fR(5) preloadable library to
77 enable the extended FILE facility.
78 .SH RETURN VALUES
79 .sp
80 .LP
81 Upon successful completion, \fBenable_extended_FILE_stdio()\fR returns 0.
82 Otherwise, \(mi1 is returned and \fBerrno\fR is set to indicate the error.
83 .SH ERRORS
84 .sp
85 .LP
86 The \fBenable_extended_FILE_stdio()\fR function will fail if:
87 .sp
88 .ne 2
89 .na
90 \fB\fBEAGAIN\fR\fR
91 .ad
92 .RS 10n
93 All file descriptors in the inclusive range 3 through 255 refer to files that
94 are currently open in the process.
95 .RE
97 .sp
98 .ne 2
99 .na
100 \fB\fBEBADF\fR\fR
102 .RS 10n
103 The \fIlow_fd\fR argument is greater than 255, or is less than 3 and not equal
104 to -1.
108 .ne 2
110 \fB\fBEEXIST\fR\fR
112 .RS 10n
113 A file descriptor has already been marked by an earlier call to \fBfcntl()\fR.
117 .ne 2
119 \fB\fBEINVAL\fR\fR
121 .RS 10n
122 The \fIsignal_action\fR argument is not \(mi1, is not 0, and is not a valid
123 signal number.
126 .SH USAGE
129 The \fBenable_extended_FILE_stdio()\fR function is available only in the 32-bit
130 compilation environment.
133 The \fBfdopen\fR(3C), \fBfopen\fR(3C), and \fBpopen\fR(3C) functions all enable
134 the use of the extended FILE facility. For source changes, a trailing \fBF\fR
135 character in the \fImode\fR argument can be used with any of these functions if
136 the \fBFILE *\fR\fIfptr\fR is used only within the context of a single function
137 or group of functions and not meant to be returned to a caller.  All of the
138 source code to the application must then be recompiled, thereby exposing any
139 improper usage of the \fBFILE\fR structure fields.
142 The \fBF\fR character must not be used if the \fBFILE *\fR\fIfptr\fR is to be
143 returned to a caller.  The calling application might not understand how to
144 process it. Alternatively, the \fBenable_extended_FILE_stdio()\fR function can
145 be used at a higher level in the code.
148 Use \fBextendedFILE\fR(5) for binary relief.
149 .SH EXAMPLES
151 \fBExample 1 \fRIncrease the file limit and enable the extended FILE facility.
154 The following example demonstrates how to programmatically increase the file
155 limit and enable extended FILE facility.
158 .in +2
160 (void) getrlimit(RLIMIT_NOFILE, &rlp);
161 rlp.rlim_cur = 1000;  /* set the desired number of file descriptors */
162 retval = setrlimit(RLIMIT_NOFILE, &lrp);
163 if (retval == -1) {
164     /* error */
167 /* enable extended FILE facility */
168 retval = enable_extended_FILE_stdio(-1, SIGABRT);
169 if (retval == -1) {
170     /* error */
173 .in -2
175 .SH ATTRIBUTES
178 See \fBattributes\fR(5) for descriptions of the following attributes:
183 box;
184 c | c
185 l | l .
186 ATTRIBUTE TYPE  ATTRIBUTE VALUE
188 Interface Stability     Evolving
190 MT-Level        Safe
193 .SH SEE ALSO
196 \fBclose\fR(2), \fBfcntl\fR(2), \fBgetrlimit\fR(2), \fBfdopen\fR(3C),
197 \fBfopen\fR(3C), \fBpopen\fR(3C), \fBsignal.h\fR(3HEAD), \fBstdio\fR(3C),
198 \fBattributes\fR(5), \fBextendedFILE\fR(5)
199 .SH NOTES
202 Historically, 32-bit Solaris applications have been limited to using only the
203 file descriptors 0 through 255 with the standard I/O functions (see
204 \fBstdio\fR(3C)) in the C library. The extended FILE facility allows
205 well-behaved 32-bit applications to use any valid file descriptor with the
206 standard I/O functions.
209 For the purposes of the extended FILE facility, a well-behaved application is
210 one that:
211 .RS +4
213 .ie t \(bu
214 .el o
215 does not directly access any fields in the \fBFILE\fR structure pointed to by
216 the \fBFILE\fR pointer associated with any standard I/O stream,
218 .RS +4
220 .ie t \(bu
221 .el o
222 checks all return values from standard I/O functions for error conditions, and
224 .RS +4
226 .ie t \(bu
227 .el o
228 behaves appropriately when an error condition is reported.
232 The extended FILE facility generates \fBEBADF\fR error returns and optionally
233 delivers a signal to the calling process on most attempts to use the file
234 descriptor formerly stored in \fBFILE\fR->\fI_file\fR as an argument to a
235 system call when a file descriptor value greater than 255 is being used to
236 access the file underlying the corresponding \fBFILE\fR pointer.  The only
237 exception is that calls to the \fBclose()\fR system call will return an
238 \fBEBADF\fR error in this case, but will not deliver the signal. The
239 \fBFILE\fR->\fI_file\fR has been renamed to help applications quickly detect
240 code that needs to be updated.
243 The extended FILE facility should only be used by well-behaved applications.
244 Although the extended FILE facility reports errors, applications that directly
245 reference \fBFILE\fR->\fI_file\fR should be updated to use public interfaces
246 rather than rely on implementation details that no longer work as the
247 application expects (see \fB__fbufsize\fR(3C) and \fBfileno\fR(3C).
250 This facility takes great care to avoid problems in well-behaved applications
251 while maintaining maximum compatibility. It also attempts to catch dangerous
252 behavior in applications that are not well-behaved as soon as possible and to
253 notify those applications as soon as bad behavior is detected.
256 There are, however, limitations.  For example, if an application enables this
257 facility and is linked with an object file that had a standard I/O stream using
258 an extended \fBFILE\fR pointer, and then used the sequence
260 .in +2
262 (void) close(FILE->_file);
263 FILE->_file = myfd;
265 .in -2
269 to attempt to change the file descriptor associated with the stream, undesired
270 results can occur. The \fBclose()\fR function will fail, but since this usage
271 ignores the return status, the application proceeds to perform low level I/O on
272 \fBFILE\fR->\fI_file\fR while calls to standard I/O functions would continue to
273 use the original, extended \fBFILE\fR pointer.  If the application continues
274 using standard I/O functions after changing \fBFILE\fR->\fI_file\fR, silent
275 data corruption could occur because the application thinks it has changed file
276 descriptors with the above assignment but the actual standard I/O file
277 descriptor is stored in the auxiliary location. The chances for corruption are
278 even higher if \fImyfd\fR has a value greater than 255 and is truncated by the
279 assignment to the 8-bit \fI_file\fR field.
282 Since the \fI_file\fR field has been renamed, attempts to recompile this code
283 will fail.  The application should be changed not to use this field in the
284 \fBFILE\fR structure.
287 The application should not use this facility if it uses \fI_file\fR directly,
288 including using the \fBfileno()\fR macro that was provided in
289 \fBstdio.h\fR(3HEAD) in Solaris 2.0 through 2.7.